マルチクラウドでVPC同士接続してみるその③(GCPとAzure編)

 VPNシリーズも3回目に突入、次はGCPとAzureの接続をやってみます。今回はお勉強がてらなので、とりあえず低コストでスタートしたいことからシングル構成ですが、本来はHAで構成すべきなんですよね。それはまたの機会にでもやろうかと思います。そしてコマンドラインでやってますが、やってることはここのパクリです。過去2回でAWSとAzureとAWSとGCPをやっているので、今回はそれの応用編といったところです。

構成は以下の様な感じです。(まぁ分かるか・・・)

作業はGCPとAzureともCloudShellからコマンドラインで実行です。







◆シリーズ

1.AWSとGCP接続

2.AWSとAzure接続

3.GCPとAzure接続

4.AWSとGCPとAzure接続


◆大まかな流れ

1.GCPでVPCとサブネット作成

2.GCPでVPNgateway作成

3.AzureのVNETとサブネット作成

4.Azureでローカルネットワークゲートウェイ作成

5.AzureでVPN接続作成

6.GCPでVPNトンネル構成

7.GCPでGCEをサブネットに作成

8.AzureでサブネットにVMを作成

9.Azure側の後始末

10.GCP側後始末


◆コマンドライン(先頭にプロンプト付きなので注意)

1.GCPでVPCとサブネット作成

1.1.VPC作成

$ VPC_NETWORK=multi-cloud-vpn-gcp
$ PROJECT=multicloud-sitevpn-project
$ REGION=asia-northeast1

$ gcloud compute networks create ${VPC_NETWORK} \
    --project=${PROJECT} \
    --subnet-mode=custom

1.2.サブネット作成

$ SUBNET_NAME=${VPC_NETWORK}"-subnet" \
  && echo ${SUBNET_NAME}
$ PRIMARY_RANGE=172.30.0.0/16

$ gcloud compute networks subnets create ${SUBNET_NAME} \
    --network=${VPC_NETWORK} \
    --range=${PRIMARY_RANGE} \
    --project=${PROJECT} \
    --region=${REGION}

1.3.ファイアウォールルールの追加

$ FIREWALL_RULE=${VPC_NETWORK}"-ssh-allow-rule" \
  && echo ${FIREWALL_RULE}
$ RULE_DESCRIPTION="AllowSSH"
$ DIRECTION=ingress
$ PRIORITY=1000
$ ACTION=allow
$ RULES=tcp:22
$ SOURCE_RANGE=35.235.240.0/20           #Googleからのアクセス

$ gcloud compute firewall-rules create ${FIREWALL_RULE} \
    --project=${PROJECT} \
    --network=${VPC_NETWORK} \
    --description=${RULE_DESCRIPTION} \
    --direction=${DIRECTION} \
    --action=${ACTION} \
    --priority=${PRIORITY} \
    --rules=${RULES} \
    --source-ranges=${SOURCE_RANGE} \
    --destination-ranges=${PRIMARY_RANGE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-ingress-gcp-allow-rule" \
  && echo ${FIREWALL_RULE}
$ RULE_DESCRIPTION="Allowinternal"
$ PRIORITY=1001
$ RULES=all
$ SOURCE_RANGE=${PRIMARY_RANGE}          #GCPサブネット内のIPレンジ

$ gcloud compute firewall-rules create ${FIREWALL_RULE} \
    --project=${PROJECT} \
    --network=${VPC_NETWORK} \
    --description=${RULE_DESCRIPTION} \
    --direction=${DIRECTION} \
    --action=${ACTION} \
    --priority=${PRIORITY} \
    --rules=${RULES} \
    --source-ranges=${SOURCE_RANGE} \
    --destination-ranges=${PRIMARY_RANGE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-ingress-azure-allow-rule" \
  && echo ${FIREWALL_RULE}
$ RULE_DESCRIPTION="AllowVPNinternal"
$ PRIORITY=1001
$ RULES=all
$ SOURCE_RANGE=172.31.0.0/16          #AzureのIPレンジ

$ gcloud compute firewall-rules create ${FIREWALL_RULE} \
    --project=${PROJECT} \
    --network=${VPC_NETWORK} \
    --description=${RULE_DESCRIPTION} \
    --direction=${DIRECTION} \
    --action=${ACTION} \
    --priority=${PRIORITY} \
    --rules=${RULES} \
    --source-ranges=${SOURCE_RANGE} \
    --destination-ranges=${PRIMARY_RANGE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-egress-allow-rule" \
  && echo ${FIREWALL_RULE}
$ RULE_DESCRIPTION="AllowVPNexternal"
$ DIRECTION=egress
$ PRIORITY=1002
$ RULES=all
$ SOURCE_RANGE=${PRIMARY_RANGE}          #GCPサブネット内のIPレンジ
$ DESTINATION_RANGE=172.31.0.0/16        #Azureのサブネットのレンジ

$ gcloud compute firewall-rules create ${FIREWALL_RULE} \
    --project=${PROJECT} \
    --description=${RULE_DESCRIPTION} \
    --direction=${DIRECTION} \
    --priority=${PRIORITY} \
    --network=${VPC_NETWORK} \
    --action=${ACTION} \
    --rules=${RULES} \
    --source-ranges=${SOURCE_RANGE} \
    --destination-ranges=${DESTINATION_RANGE}

2.GCPのVPNgateway作成

$ GW_NAME=${VPC_NETWORK}"-gw" \
  && echo ${GW_NAME}

$ gcloud --project="${PROJECT}" compute target-vpn-gateways create "${GW_NAME}" \
   --network="${VPC_NETWORK}" \
   --region="${REGION}"

$ GW_IP_NAME=${GW_NAME}"-ip" \
  && echo ${GW_IP_NAME}
$ gcloud --project="${PROJECT}" compute addresses create "${GW_IP_NAME}" --region="${REGION}"
$ GW_IP_ADDRESS=$(gcloud --project="${PROJECT}" compute addresses describe "${GW_IP_NAME}" \
   --region=${REGION} \
   --format='flattened(address)' \
   )

$ FORWORDING_RULE="fr-"${GW_NAME}"-esp" \
  && echo ${FORWORDING_RULE}
$ PROTPCOL=ESP
$ gcloud --project="${PROJECT}" compute forwarding-rules create "${FORWORDING_RULE}" \
   --load-balancing-scheme=EXTERNAL \
   --network-tier=PREMIUM \
   --ip-protocol="${PROTPCOL}" \
   --address="${GW_IP_NAME}" \
   --target-vpn-gateway="${GW_NAME}" \
   --region="${REGION}"
   
$ FORWORDING_RULE="fr-"${GW_NAME}"-udp500" \
  && echo ${FORWORDING_RULE}
$ PROTPCOL=UDP
$ PORT_NUMBER=500
$ gcloud --project="${PROJECT}" compute forwarding-rules create "${FORWORDING_RULE}" \
   --load-balancing-scheme=EXTERNAL \
   --network-tier=PREMIUM \
   --ip-protocol="${PROTPCOL}" \
   --ports="${PORT_NUMBER}" \
   --address="${GW_IP_NAME}" \
   --target-vpn-gateway="${GW_NAME}" \
   --region="${REGION}"

$ FORWORDING_RULE="fr-"${GW_NAME}"-udp4500" \
  && echo ${FORWORDING_RULE}
$ PORT_NUMBER=4500
$ gcloud --project="${PROJECT}" compute forwarding-rules create "${FORWORDING_RULE}" \
   --load-balancing-scheme=EXTERNAL \
   --network-tier=PREMIUM \
   --ip-protocol="${PROTPCOL}" \
   --ports="${PORT_NUMBER}" \
   --address="${GW_IP_NAME}" \
   --target-vpn-gateway="${GW_NAME}" \
   --region="${REGION}"
   
$ echo ${GW_IP_ADDRESS}

3.AzureのVNET作成

3.1.NSGの作成

3.1.1.NSG作成

$ VNET_NAME=multi-cloud-vpn-azure
$ RESOURCE_GROUP=rg_multicloud
$ NSG_NAME=${VNET_NAME}-nsg
$ GCP_SUBNET_CIDR=172.30.0.0/16
$ VNET_CIDR=172.31.0.0/16
$ az network nsg create --resource-group ${RESOURCE_GROUP} --name ${NSG_NAME}

3.1.2.NSGルール追加

$ NSG_RULE_NAME=${NSG_NAME}-azure-ingress
$ az network nsg rule create \
  --resource-group ${RESOURCE_GROUP} \
  --name ${NSG_RULE_NAME} \
  --nsg-name ${NSG_NAME} \
  --priority 100 \
  --source-address-prefixes ${VNET_CIDR} \
  --destination-port-ranges * \
  --destination-address-prefixes ${VNET_CIDR} \
  --access Allow \
  --protocol * \
  --description "allow azure subnet."

$ NSG_RULE_NAME=${NSG_NAME}-gcp-ingress
$ az network nsg rule create \
  --resource-group ${RESOURCE_GROUP} \
  --name ${NSG_RULE_NAME} \
  --nsg-name ${NSG_NAME} \
  --priority 101 \
  --source-address-prefixes ${GCP_SUBNET_CIDR} \
  --destination-port-ranges * \
  --destination-address-prefixes ${VNET_CIDR} \
  --access Allow \
  --protocol * \
  --description "allow aws subnet."

$ NSG_RULE_NAME=${NSG_NAME}-gcp-egress
$ az network nsg rule create \
  --resource-group ${RESOURCE_GROUP} \
  --name ${NSG_RULE_NAME} \
  --nsg-name ${NSG_NAME} \
  --priority 111 \
  --source-address-prefixes ${VNET_CIDR} \
  --destination-port-ranges * \
  --destination-address-prefixes ${GCP_SUBNET_CIDR} \
  --access Allow \
  --protocol * \
  --description "allow aws subnet."

3.2.V-NET作成

3.2.1.VNETとゲートウェイサブネット作成

$ SUBNET_CIDR=172.31.255.0/24

$ az network vnet create --name ${VNET_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --address-prefix ${VNET_CIDR} \
  --subnet-name GatewaySubnet \
  --subnet-prefixes ${SUBNET_CIDR}

3.2.2.追加サブネット作成

$ SUBNET_NAME=${VNET_NAME}-subnet
$ SUBNET_CIDR=172.31.10.0/24

$ az network vnet subnet create --name ${SUBNET_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --vnet-name ${VNET_NAME} \
  --address-prefixes ${SUBNET_CIDR} \
  --network-security-group ${NSG_NAME}

4.Azureでローカルネットワークゲートウェイ作成

$ LOCAL_GATEWAY_NAME=${VNET_NAME}-lngw
$ GCP_VPN_IP=#GCPのIPアドレス(GW_IP_ADDRESS)

$ az network local-gateway create --gateway-ip-address ${GCP_VPN_IP} \
  --name ${LOCAL_GATEWAY_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --local-address-prefixes ${GCP_SUBNET_CIDR}

5.AzureでVPN接続作成

5.1.追加IPアドレス作成

$ PUBLIC_IP_NAME=${VNET_NAME}-ip
$ az network public-ip create \
  --name ${PUBLIC_IP_NAME} \
  --resource-group ${RESOURCE_GROUP}

$ AZURE_PUBLIC_IP=$( \
  az network public-ip show --name ${PUBLIC_IP_NAME} \
    --resource-group ${RESOURCE_GROUP} \
    --query "ipAddress" -o tsv \
  ) \
&& echo ${AZURE_PUBLIC_IP}

5.2.VPNgateway作成

$ VPN_GATEWAY_NAME=${VNET_NAME}-vpngw
$ SKU_TYPE=VpnGw1

$ az network vnet-gateway create --name ${VPN_GATEWAY_NAME} \
  --public-ip-address ${PUBLIC_IP_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --location japaneast \
  --vnet ${VNET_NAME} \
  --gateway-type Vpn \
  --sku ${SKU_TYPE} \
  --vpn-type RouteBased

~30分ほどかかる~

5.3.VPNトンネル作成

$ VNET_NAME=multi-cloud-vpn-azure
$ RESOURCE_GROUP=rg_multicloud
$ VPN_GATEWAY_NAME=${VNET_NAME}-vpngw
$ LOCAL_GATEWAY_NAME=${VNET_NAME}-lngw
$ IKE_VERS=2
$ SHARED_SECRET=gcpazure1234       #シェアードシークレットキー(PSK) 任意の値でよい
$ VPN_CON_NAME=${VNET_NAME}"-vpnc" \
&& echo ${VPN_CON_NAME}

$ az network vpn-connection create --name ${VPN_CON_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --vnet-gateway1 ${VPN_GATEWAY_NAME} \
  --local-gateway2 ${LOCAL_GATEWAY_NAME} \
  --shared-key ${SHARED_SECRET}

6.GCPでVPNトンネル構成

$ VPC_NETWORK=multi-cloud-vpn-gcp
$ PROJECT=multicloud-sitevpn-project
$ REGION=asia-northeast1

$ TUNNEL_NAME=${VPC_NETWORK}"-vpn-tunel" \
  && echo ${TUNNEL_NAME}
$ AZ_VPN_IP=#AzureのVirtual Private GatewayのIPアドレス(AZURE_PUBLIC_IP)
$ LOCAL_CIDR=172.30.0.0/16                       #GCP側のサブネットCIDR
$ AZURE_REMOTE_CIDR=172.31.0.0/16                #Azure側のVPCのCIDR
$ IKE_VERS=2
$ SHARED_SECRET=gcpazure1234                     #Azureで発行したシェアードシークレット(Azureと揃える)
$ GW_NAME=${VPC_NETWORK}"-gw" \
  && echo ${GW_NAME}

$ gcloud compute vpn-tunnels create ${TUNNEL_NAME} \
    --project=${PROJECT} \
    --region=${REGION} \
    --peer-address=${AZ_VPN_IP} \
    --ike-version=${IKE_VERS} \
    --shared-secret=${SHARED_SECRET} \
    --local-traffic-selector=${LOCAL_CIDR} \
    --remote-traffic-selector=${AZURE_REMOTE_CIDR} \
    --target-vpn-gateway=${GW_NAME}

$ ROUTE_NAME=${VPC_NETWORK}"-route" \
  && echo ${ROUTE_NAME}
$ gcloud compute routes create ${ROUTE_NAME} \
    --project=${PROJECT} \
    --destination-range=${AZURE_REMOTE_CIDR} \
    --next-hop-vpn-tunnel=${TUNNEL_NAME} \
    --network=${VPC_NETWORK} \
    --next-hop-vpn-tunnel-region=${REGION}

7.GCPでGCEをサブネットに作成

$ PROJECT=multicloud-sitevpn-project
$ COMPUTE_NAME=multicloud-gcp-instance
$ ZONE=asia-northeast1-a
$ MACHINE_TYPE=e2-micro
$ SUBNET_NAME=${VPC_NETWORK}"-subnet" \
  && echo ${SUBNET_NAME}
$ TAG=multicloud
$ OS_IMAGE=projects/ubuntu-os-cloud/global/images/ubuntu-2404-noble-amd64-v20240701a
$ DISK_SIZE=10
$ DISK_NAME=test-instance

$ gcloud compute --project "${PROJECT}" instances create "${COMPUTE_NAME}" \
  --zone "${ZONE}" \
  --machine-type "${MACHINE_TYPE}" \
  --subnet "${SUBNET_NAME}" \
  --maintenance-policy "MIGRATE" \
  --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
  --tags "${TAG}" \
  --image "${OS_IMAGE}" \
  --boot-disk-size "10" \
  --boot-disk-type "pd-standard" \
  --boot-disk-device-name "${DISK_NAME}" \
  --no-address

8.AzureでサブネットにVMを作成

$ VM_IMAGE=Ubuntu2204
$ VM_SIZE=Standard_B1ls
$ VM_NAME=multicloud-azure-vm
$ VM_STORAGE=StandardSSD_LRS
$ VM_USER=azureuser
$ VM_SSH_KEY=${VM_NAME}-key
$ SUBNET_NAME=${VNET_NAME}-subnet

$ az sshkey create \
  --resource-group ${RESOURCE_GROUP} \
  --name ${VM_SSH_KEY}

$ az vm create \
  --resource-group ${RESOURCE_GROUP} \
  --name ${VM_NAME} \
  --image ${VM_IMAGE} \
  --size ${VM_SIZE} \
  --vnet-name ${VNET_NAME} \
  --public-ip-address "" \
  --nsg "" \
  --subnet ${SUBNET_NAME} \
  --storage-sku ${VM_STORAGE} \
  --nic-delete-option Delete \
  --os-disk-delete-option Delete \
  --admin-username ${VM_USER} \
  --ssh-key-name ${VM_SSH_KEY}

9.Azure側の後始末

9.1.VM削除

$ az vm delete --name ${VM_NAME} --resource-group ${RESOURCE_GROUP}
$ az sshkey delete --name ${VM_SSH_KEY} --resource-group ${RESOURCE_GROUP}
$ rm -rf .ssh/*

9.2.VPNトンネル削除

$ az network vpn-connection delete --name ${VPN_CON_NAME} --resource-group ${RESOURCE_GROUP}
$ az network local-gateway delete  --name ${LOCAL_GATEWAY_NAME} --resource-group ${RESOURCE_GROUP}

9.3.VPNGateway削除

$ az network vnet-gateway delete --name ${VPN_GATEWAY_NAME} --resource-group ${RESOURCE_GROUP}

~15分ほどかかる~

9.4.IPアドレス削除

$ VNET_NAME=multi-cloud-vpn-azure
$ RESOURCE_GROUP=rg_multicloud
$ PUBLIC_IP_NAME=${VNET_NAME}-ip
$ az network public-ip delete --name ${PUBLIC_IP_NAME} --resource-group ${RESOURCE_GROUP}

9.5.V-NET削除

$ az network vnet delete --name ${VNET_NAME} --resource-group ${RESOURCE_GROUP}

9.6.セキュリティグループ削除

$ NSG_NAME=${VNET_NAME}-nsg
$ az network nsg delete --name ${NSG_NAME} --resource-group ${RESOURCE_GROUP}

10.GCP側後始末

10.1.GCEの削除

$ PROJECT=multicloud-sitevpn-project
$ REGION=asia-northeast1
$ VPC_NETWORK=multi-cloud-vpn-gcp
$ COMPUTE_NAMES=multicloud-gcp-instance
$ ZONE=asia-northeast1-a
$ gcloud compute --project "${PROJECT}" instances delete ${COMPUTE_NAME} --zone=${ZONE}

10.2.ルートとVPNトンネルの削除

$ ROUTE_NAME=${VPC_NETWORK}"-route" \
  && echo ${ROUTE_NAME}
$ gcloud --project=${PROJECT} compute routes delete ${ROUTE_NAME}

$ TUNNEL_NAME=${VPC_NETWORK}-vpn-tunel
$ gcloud compute vpn-tunnels delete ${TUNNEL_NAME} \
    --project=${PROJECT} \
    --region=${REGION}

10.3.GCPのVPNgateway削除

$ GW_NAME=${VPC_NETWORK}"-gw" \
  && echo ${GW_NAME}
$ FORWORDING_RULE="fr-"${GW_NAME}"-esp" \
  && echo ${FORWORDING_RULE}
$ gcloud --project="${PROJECT}" compute forwarding-rules delete "${FORWORDING_RULE}" \
  --region="${REGION}"
   
$ FORWORDING_RULE="fr-"${GW_NAME}"-udp500" \
  && echo ${FORWORDING_RULE}
$ gcloud --project="${PROJECT}" compute forwarding-rules delete "${FORWORDING_RULE}" \
   --region="${REGION}"

$ FORWORDING_RULE="fr-"${GW_NAME}"-udp4500" \
  && echo ${FORWORDING_RULE}
$ gcloud --project="${PROJECT}" compute forwarding-rules delete "${FORWORDING_RULE}" \
   --region="${REGION}"

$ gcloud compute target-vpn-gateways delete "${GW_NAME}" \
  --project="${PROJECT}" \
  --region="${REGION}"

10.4.GW用IPアドレス削除

$ GW_IP_NAME=${GW_NAME}"-ip"
$ gcloud --project="${PROJECT}" compute addresses delete "${GW_IP_NAME}" --region="${REGION}"

10.5.サブネットとVPC削除

$ SUBNET_NAME=${VPC_NETWORK}"-subnet" \
  && echo ${SUBNET_NAME}
$ gcloud --project="${PROJECT}" compute networks subnets delete ${SUBNET_NAME} --region ${REGION}

$ FIREWALL_RULE=${VPC_NETWORK}"-ssh-allow-rule" \
  && echo ${FIREWALL_RULE}
$ gcloud --project="${PROJECT}" compute firewall-rules delete ${FIREWALL_RULE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-ingress-gcp-allow-rule" \
  && echo ${FIREWALL_RULE}
$ gcloud --project="${PROJECT}" compute firewall-rules delete ${FIREWALL_RULE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-ingress-azure-allow-rule" \
  && echo ${FIREWALL_RULE}
$ gcloud --project="${PROJECT}" compute firewall-rules delete ${FIREWALL_RULE}

$ FIREWALL_RULE=${VPC_NETWORK}"-vpn-egress-allow-rule" \
  && echo ${FIREWALL_RULE}
$ gcloud --project="${PROJECT}" compute firewall-rules delete ${FIREWALL_RULE}

$ gcloud --project="${PROJECT}" compute networks delete ${VPC_NETWORK}


◆参考サイト

・AzureとGCP

https://zenn.dev/yaasita/articles/eb9ff2e75715d4


・外部IPなしGCE

https://www.rhoboro.com/2019/09/06/gce-non-external-ip.html

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create

https://zenn.dev/shogomuranushi/articles/b75678c3f1a123


・Azureでローカルネットワークゲートウェイ作成とトンネル設定

https://www.school.ctc-g.co.jp/columns/ozawa4/ozawa414.html

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings

https://learn.microsoft.com/ja-jp/cli/azure/network/local-gateway?view=azure-cli-latest

https://www.sonicwall.com/support/knowledge-base/microsoft-azure%E3%81%A8%E3%81%AEvpn%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95/200402020314759

https://www.cloudou.net/vpn-gateway/vpn001/

https://zenn.dev/microsoft/articles/zenn-vpngw-instruction

https://www.rworks.jp/cloud/azure/azure-column/azure-entry/22077/


GCPとAzureでプライベートIPのみ割当にしたかったので今回はその構成に準拠した。CLIからだとデフォルトでは勝手に外部IPアドレス割当されてしまうということで、それはどうかなぁと思った。そしてGCPと比較してもAzureのVPNはデプロイ完了まで遅すぎる。。。なんで30分かかんだよ。。。AWSでもGoogleでも一桁分で完了なのに・・・なんでかねぇ。数年前からこれくらい時間かかるみたいなので恐らく改善されないんだろう。

そんで次回以降は一々、3環境分もコマンドライン叩いてられないよねということでterraformを使ってまとめて3クラウドでVPN構成するというのをやってみます。


コメント

このブログの人気の投稿

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

証券外務員1種勉強(計算式暗記用メモ)

マクロ経済学(IS-LM分析)