【前回】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)の説明は完了です!