GCPサイト間VPNの構築(7.Cloud Deployment Manager)

GCPサイト間VPNの構築(7.Cloud Deployment Manager)

【前回】GCPサイト間VPNの構築(6.gcloud CLI によるVPN接続の作成)

目次

ネットワーク構成

下記のネットワーク構成で、オンプレ環境に見立てたCML上のLAN(172.16.0.0/24)とGCP上のサブネット(10.0.0.0/24)が直接通信できるようにします。※Server(172.16.0.1)とVMインスタンス(10.0.0.100)で、Pingによる疎通確認ができるようにしていきます。

ネットワーク構成

GCPコンソール画面上でのGUIによるVPN構築については、下記を参照してください。

gcloud CLI(gcloudコマンド)のインストール方法については、下記を参照してください。

Cloud Deployment Manager とは

Cloud Deployment Manager は、GCP上のリソースをテンプレートとして定義・管理できるサービスで、Infrastructure as Code(IaC)を実現することができます。※AWSにおけるCloudFormationと同様のサービスです。

Cloud Deployment Manager によるVPN接続の構築

GCPのVPN接続には、「高可用性(HA) VPN」と「Classic VPN」があります。ここでは、「高可用性(HA) VPN」でVPNを構築します。※Googleとしても、「Classic VPN」には一部非推奨な構成・機能があるため、「高可用性(HA) VPN」への移行を推奨しています。

定義ファイルの作成

定義ファイルは、yaml形式で記述します。ここでは、「Cloud-HA-VPN.yaml」というファイルを作成し、下記の通り記述します。

resources:
- type: compute.v1.vpnGateway
  name: cvpngw-gcp-vpn-test-003
  properties:
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/vpc-gcp-vpn-test-001
    region: asia-northeast1
- type: compute.v1.externalVpnGateway
  name: pvpngw-gcp-vpn-test-003
  properties:
    interfaces:
      - id: 0
        ipAddress: [PEER_GLOBAL_IP]
    redundancyType: SINGLE_IP_INTERNALLY_REDUNDANT
- type: compute.v1.router
  name: crouter-gcp-vpn-test-003
  properties:
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/vpc-gcp-vpn-test-001
    region: asia-northeast1
    bgp:
      asn: 65000
    interfaces:
    - ipRange: 169.254.0.9/30
      linkedVpnTunnel: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/asia-northeast1/vpnTunnels/vpn-tunnel-gcp-vpn-test-003
      name: if-bgp-gcp-vpn-test-003
    bgpPeers:
    - interfaceName: if-bgp-gcp-vpn-test-003
      ipAddress: 169.254.0.9
      name: bgp-gcp-vpn-test-003
      peerAsn: 65001
      peerIpAddress: 169.254.0.10
- type: compute.v1.vpnTunnel
  name: vpn-tunnel-gcp-vpn-test-003
  properties:
    region: asia-northeast1
    vpnGateway: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/asia-northeast1/vpnGateways/cvpngw-gcp-vpn-test-003
    vpnGatewayInterface: 0
    peerExternalGateway: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/externalVpnGateways/pvpngw-gcp-vpn-test-003
    peerExternalGatewayInterface: 0
    router: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/asia-northeast1/routers/crouter-gcp-vpn-test-003
    ikeVersion: 2
    sharedSecret: '**********'
  metadata:
    dependsOn:
    - cvpngw-gcp-vpn-test-003
    - pvpngw-gcp-vpn-test-003
    - crouter-gcp-vpn-test-003

既存のVPC「vpc-gcp-vpn-test-001」が作成されている前提で、以下のリソースを作成しています。
・Cloud HA VPN ゲートウェイ:cvpngw-gcp-vpn-test-003(type: compute.v1.vpnGateway)
・ピアVPNゲートウェイ:pvpngw-gcp-vpn-test-003(type: compute.v1.externalVpnGateway)
・Cloud Router:crouter-gcp-vpn-test-003(type: compute.v1.router)
・VPNトンネル:vpn-tunnel-gcp-vpn-test-003(type: compute.v1.vpnTunnel)

下記については、適宜置き換えてください。
・[PROJECT_ID]:プロジェクトIDを指定
・[PEER_GLOBAL_IP]:ローカルネットワーク側のグローバルIPアドレスを指定
・sharedSecret: ‘**********’:任意の事前共有キーを指定

デプロイの実行

下記のコマンドでデプロイを実行します。

gcloud deployment-manager deployments create [DEPLOY_NAME] --config [定義ファイル]

ここでは、上記で作成した「Cloud-HA-VPN.yaml」を、デプロイ名「vpn-deployment」として実行します。

Terminal[GCPTest]: gcloud deployment-manager deployments create vpn-deployment --config Cloud-HA-VPN.yaml
The fingerprint of the deployment is b'XXXXXXXXXXXXXXXXXXXXXX=='
Waiting for create [operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX]...done.
Create operation operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX completed successfully.
NAME                         TYPE                           STATE      ERRORS  INTENT
crouter-gcp-vpn-test-003     compute.v1.router              COMPLETED  []
cvpngw-gcp-vpn-test-003      compute.v1.vpnGateway          COMPLETED  []
pvpngw-gcp-vpn-test-003      compute.v1.externalVpnGateway  COMPLETED  []
vpn-tunnel-gcp-vpn-test-003  compute.v1.vpnTunnel           COMPLETED  []

・「Create operation operation-XXX completed successfully.」と表示されることを確認します。
・4つのリソースが作成され、STATEが「COMPLETED」となっていることを確認します。

BGPピア側のルーター設定

BGPピアとなるCiscoルーターの設定については、下記を参照しください。

GCP側のステータス確認

VPNトンネル・BGPセッションの確認

下記のコマンドを実行し、VPNトンネルとBGPセッションのステータスを確認します。

gcloud compute vpn-tunnels describe vpn-tunnel-gcp-vpn-test-003
Terminal[~]: gcloud compute vpn-tunnels describe vpn-tunnel-gcp-vpn-test-003
creationTimestamp: '2022-05-08T02:57:44.965-07:00'
description: ''
detailedStatus: Tunnel is up and running.
id: 'XXXXXXXXXXXXXXXXXXX'
ikeVersion: 2
kind: compute#vpnTunnel
localTrafficSelector:
- 0.0.0.0/0
name: vpn-tunnel-gcp-vpn-test-003
peerExternalGateway: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/externalVpnGateways/pvpngw-gcp-vpn-test-003
peerExternalGatewayInterface: 0
peerIp: XXX.XXX.XXX.XXX
region: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1
remoteTrafficSelector:
- 0.0.0.0/0
router: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/routers/crouter-gcp-vpn-test-003
selfLink: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnTunnels/vpn-tunnel-gcp-vpn-test-003
sharedSecret: '*************'
sharedSecretHash: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
status: ESTABLISHED
vpnGateway: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnGateways/cvpngw-gcp-vpn-test-003
vpnGatewayInterface: 0

detailedStatus: Tunnel is up and running.
→ VPNトンネルがアップしていることが確認できます。

status: ESTABLISHED
→ BGPセッションが確立されていることが確認できます。

受信ルートの確認

下記のコマンドを実行し、BGPでルートを受信していることを確認します。

gcloud compute routers get-status crouter-gcp-vpn-test-002
Terminal[~]: gcloud compute routers get-status crouter-gcp-vpn-test-003
kind: compute#routerStatusResponse
result:
  bestRoutes:
  - asPaths:
    - asLists:
      - 65001
      pathSegmentType: AS_SEQUENCE
    creationTimestamp: '2022-05-08T03:11:58.666-07:00'
    destRange: 172.16.0.0/24
    kind: compute#route
    network: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/networks/vpc-gcp-vpn-test-001
    nextHopIp: 169.254.0.10
    nextHopVpnTunnel: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnTunnels/vpn-tunnel-gcp-vpn-test-003
    priority: 0
    routeType: BGP
  bestRoutesForRouter:
  - asPaths:
    - asLists:
      - 65001
      pathSegmentType: AS_SEQUENCE
    creationTimestamp: '2022-05-08T03:11:54.800-07:00'
    destRange: 172.16.0.0/24
    kind: compute#route
    network: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/networks/vpc-gcp-vpn-test-001
    nextHopIp: 169.254.0.10
    priority: 0
    routeStatus: ACTIVE
    routeType: BGP
  bgpPeerStatus:
  - advertisedRoutes:
    - destRange: 10.0.0.0/24
      kind: compute#route
      network: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/networks/vpc-gcp-vpn-test-001
      nextHopIp: 169.254.0.9
      nextHopVpnTunnel: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnTunnels/vpn-tunnel-gcp-vpn-test-003
      priority: 100
      routeType: BGP
    ipAddress: 169.254.0.9
    linkedVpnTunnel: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnTunnels/vpn-tunnel-gcp-vpn-test-003
    name: bgp-gcp-vpn-test-003
    numLearnedRoutes: 1
    peerIpAddress: 169.254.0.10
    state: Established
    status: UP
    uptime: 3 minutes, 26 seconds
    uptimeSeconds: '206'
  network: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/networks/vpc-gcp-vpn-test-001

destRange: 172.16.0.0/24
nextHopIp: 169.254.0.10
→ 172.16.0.0/24のルートをBGPで受信していることが確認できます。

デプロイしたリソースの削除

Cloud Deployment Manager を利用してデプロイしたリソースは、下記のコマンドで削除が可能です。

gcloud deployment-manager deployments delete [DEPLOY_NAME]
Terminal[~]: gcloud deployment-manager deployments delete vpn-deployment
The following deployments will be deleted:
- vpn-deployment

Do you want to continue (y/N)?  y

Waiting for delete [operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX]...done.
Delete operation operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX completed successfully.

デプロイNGパターン

定義ファイルを正しく記述できていない場合、下記のようなエラーが発生します。

VPCをURLではなく名前で指定した場合

VPCは、フルパスのURLで指定する必要があります。

正:network: https://www.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/networks/vpc-gcp-vpn-test-001
誤:vpc-gcp-vpn-test-001

エラーメッセージ

ERROR: (gcloud.deployment-manager.deployments.create) Error in Operation [operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX]: errors:
- code: RESOURCE_ERROR
  location: /deployments/vpn-deployment/resources/cvpngw-gcp-vpn-test-003
  message: "{\"ResourceType\":\"compute.v1.vpnGateway\",\"ResourceErrorCode\":\"400\"\
    ,\"ResourceErrorMessage\":{\"code\":400,\"errors\":[{\"domain\":\"global\",\"\
    message\":\"Invalid value for field 'resource.network': 'vpc-gcp-vpn-test-001'.\
    \ The URL is malformed.\",\"reason\":\"invalid\"}],\"message\":\"Invalid value\
    \ for field 'resource.network': 'vpc-gcp-vpn-test-001'. The URL is malformed.\"\
    ,\"statusMessage\":\"Bad Request\",\"requestPath\":\"https://compute.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnGateways\"\
    ,\"httpMethod\":\"POST\"}}"

必須項目が足りない場合

リソース毎に作成時の必須項目があります。ここでは、ピアVPNゲートウェイの必須項目が足りない場合を例にあげます。

必須項目の下記を指定しない場合
-------------------------------------------------
redundancyType: SINGLE_IP_INTERNALLY_REDUNDANT
-------------------------------------------------

エラーメッセージ

ERROR: (gcloud.deployment-manager.deployments.create) Error in Operation [operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX]: errors:
- code: RESOURCE_ERROR
  location: /deployments/vpn-deployment/resources/pvpngw-gcp-vpn-test-003
  message: "{\"ResourceType\":\"compute.v1.externalVpnGateway\",\"ResourceErrorCode\"\
    :\"400\",\"ResourceErrorMessage\":{\"code\":400,\"errors\":[{\"domain\":\"global\"\
    ,\"message\":\"Invalid value for field 'resource.redundancyType': 'UNSPECIFIED'.\
    \ The redundancy type must be provided.\",\"reason\":\"invalid\"}],\"message\"\
    :\"Invalid value for field 'resource.redundancyType': 'UNSPECIFIED'. The redundancy\
    \ type must be provided.\",\"statusMessage\":\"Bad Request\",\"requestPath\":\"\
    https://compute.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/global/externalVpnGateways\"\
    ,\"httpMethod\":\"POST\"}}"

リソースの依存関係(dependsOn)を指定していない場合

Cloud Deployment Manager でデプロイする際、すべてのリソースが同時に作成されるため、依存関係がある場合はエラーとなります。ここでは、VPNトンネル作成に”dependsOn”を指定していない場合を例にあげます。

下記を指定しない場合
-----------------------------------
  metadata:
    dependsOn:
    - cvpngw-gcp-vpn-test-003
    - pvpngw-gcp-vpn-test-003
    - crouter-gcp-vpn-test-003
-----------------------------------

エラーメッセージ

ERROR: (gcloud.deployment-manager.deployments.create) Error in Operation [operation-XXXXXXXXXXXXX-XXXXXXXXXXXXX-XXXXXXXX-XXXXXXXX]: errors:
- code: RESOURCE_ERROR
  location: /deployments/vpn-deployment/resources/vpn-tunnel-gcp-vpn-test-003
  message: "{\"ResourceType\":\"compute.v1.vpnTunnel\",\"ResourceErrorCode\":\"404\"\
    ,\"ResourceErrorMessage\":{\"code\":404,\"errors\":[{\"domain\":\"global\",\"\
    message\":\"The resource 'projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnGateways/cvpngw-gcp-vpn-test-003'\
    \ was not found\",\"reason\":\"notFound\"}],\"message\":\"The resource 'projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnGateways/cvpngw-gcp-vpn-test-003'\
    \ was not found\",\"statusMessage\":\"Not Found\",\"requestPath\":\"https://compute.googleapis.com/compute/v1/projects/gcp-test-project-001-XXXXXX/regions/asia-northeast1/vpnTunnels\"\
    ,\"httpMethod\":\"POST\"}}"

以上で、GCPサイト間VPNの構築(7.Cloud Deployment Manager)の説明は完了です!

【前回】GCPサイト間VPNの構築(6.gcloud CLI によるVPN接続の作成)

  • URLをコピーしました!
  • URLをコピーしました!
目次