このチュートリアルでは、HashiCorp の Terraform を使用して、バーチャル プライベート ネットワーク(VPN)を使用した Google Cloud Platform(GCP)と Amazon Web Services(AWS)間の安全なプライベート サイトツーサイト接続を作成する方法を説明します。これはマルチクラウド デプロイです。
このチュートリアルは、一般的なネットワーク リソース パターンのデプロイを自動化する方法を説明する全 3 回からなるシリーズの第 3 回です。このチュートリアルでは、自動ネットワーク デプロイ: 概要チュートリアルで説明されている認証とプロジェクトの構成を利用します。
このチュートリアルでは、GCP と AWS のカスタム Virtual Private Cloud(VPC)ネットワークに仮想マシン(VM)インスタンスをデプロイします。次に、サポート インフラストラクチャをデプロイして、GCP と AWS VPC ネットワーク間に 2 つの Internet Protocol security(IPsec)トンネルを使用して VPN 接続を構築します。通常、環境とトンネルのデプロイは 4 分以内に完了します。
このチュートリアルは自動ネットワーク デプロイ: スタートアップ チュートリアルの拡張版ですが、リソースは GCP 外部のプロバイダにデプロイされるため、Deployment Manager の構成は含まれていません。このチュートリアルでは代わりに、GCP を含む複数のパブリック クラウド プロバイダを使用してリソースをデプロイするために、Terraform 構成ファイルを使用します。マルチクラウド デプロイは Deployment Manager の目的の範囲外です。
料金
このチュートリアルでは、GCP と AWS の以下の課金対象コンポーネントを使用します。
- Compute Engine インスタンスと Amazon Elastic Compute Cloud(Amazon EC2)インスタンス
- より高いネットワーク スループットをサポートする複数の vCPU インスタンス
- 永続ディスクとブロック ストレージ
- ネットワーク(下り)
- VPN トンネル
VM インスタンスからのアウトバウンド、つまり下りトラフィックは、最大ネットワーク下りスループット上限の影響を受けます。このチュートリアルでは、複数のマシンタイプの vCPU を使用して、ネットワーク下りトラフィックのヘッドルームを利用可能にします。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。
始める前に
gcp-automated-networks
という名前の GCP プロジェクトを選択します。Cloud Shell インスタンスを起動します。このチュートリアルでは、Cloud Shell からすべてのターミナル コマンドを実行します。
デプロイ アーキテクチャ
このチュートリアルでは、次のデプロイ環境を構築します。
このチュートリアルには次の内容が組み込まれています。
- GCP と AWS でユーザー指定の CIDR ブロックを使用してカスタム VPC ネットワークを構築する。
- 各 VPC ネットワークに VM インスタンスをデプロイする。
- 2 つの IPsec トンネルの各 VPC ネットワークと関連リソースに VPN ゲートウェイを作成する。
GCP は経路を使用して等価コスト マルチパス(ECMP)ルーティングをサポートしますが、AWS は冗長性と可用性のためにアクティブとスタンバイの 2 つのトンネルを持つ VPN ゲートウェイをサポートします。
ルーティング
このチュートリアル構成では、Cloud Router を使用して動的ルーティングの例を示します。Cloud Router は、Border Gateway Protocol(BGP)を使用して VPC ネットワーク ルートの更新を AWS 内の環境と交換します。Cloud Router による動的ルーティングには、IPsec トンネルごとに個別の Cloud Router が必要です。 また、静的ルートを使用する構成を行うこともできます。いずれの構成も、Cloud VPN Interop Guide に記載されています。
GCP 作業環境の準備
このセクションでは、次の作業を行います。
- チュートリアル コードのクローンを作成する。
- GCP のリージョンとゾーンを確認する。
チュートリアル コードのクローンの作成
GitHub からチュートリアル コードのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
チュートリアル ディレクトリに移動します。
cd autonetdeploy-multicloudvpn
GCP のリージョンとゾーンを確認する
Compute Engine インスタンス、VPN ゲートウェイ、Cloud Router など、このチュートリアルの特定のクラウド リソースでは、意図した配置リージョン、ゾーン、あるいはその両方を明示的に宣言する必要があります。詳細については、GCP のリージョンとゾーンをご覧ください。
このチュートリアルでは、プロバイダごとに 1 つのリージョンのみが必要です。2 つのクラウド間の接続を最適化するには、互いに近いリージョンを選択します。次の表に、チュートリアル ファイル terraform/gcp_variables.tf
と terraform/aws_variables.tf
に設定された値の一覧を示します。
フィールド名 | GCP 値 | AWS 値 |
---|---|---|
Region Name |
us-west1 |
US West (us-west-2) |
Location |
The Dalles, Oregon, USA |
Oregon |
AWS の使用の準備
このセクションでは、AWS リージョンを確認します。AWS リージョンの詳細については、AWS のリージョンとアベイラビリティー ゾーンをご覧ください。
AWS Management Console にログインし、VPC ダッシュボードに移動します。プルダウン メニューで [Oregon] リージョンを選択します。
EC2 ダッシュボードと VPC ダッシュボードで、このチュートリアルで使用するリソースを確認します。
Terraform の準備
このセクションでは、Terraform 実行可能ファイルをダウンロードします。
Cloud Shell で次のスクリプトを実行します。
./get_terraform.sh
このスクリプトは、Terraform ツールの実行可能バイナリを
~/terraform
ディレクトリにダウンロードして解凍します。スクリプト出力には、PATH
を更新するためのエクスポート コマンドが表示されます。PATH
を更新したら、Terraform が動作していることを確認します。terraform --help
出力結果:
Usage: terraform [--version] [--help] [command] [args] ...
不明な点がある場合は、Terraform のダウンロードと Terraform のインストールのトピックをご覧ください。
GCP および AWS アクセス認証情報の作成
概要チュートリアルで認証情報を作成しました。 ただし、Terraform に認証情報を登録する必要があります。
Terraform に GCP 認証情報を登録します。
./gcp_set_credentials.sh exists
出力結果:
Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
Terraform に AWS 認証情報を登録します。
./aws_set_credentials.sh exists
出力結果:
Updated aws_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
プロジェクトの設定
GCP は、自動化ツールで使用する GCP プロジェクトを指定するためのいくつかの方法を提供しています。単純化のために、環境からプロジェクト ID を取得する代わりに、テンプレート ファイル内の文字列変数によって GCP プロジェクトを明示的に示します。
プロジェクト ID を設定します。
gcloud config set project [YOUR-PROJECT-ID]
出力結果:
Updated property [core/project].
提供されているスクリプトを使用して、Terraform の構成ファイル内のプロジェクト値を更新します。
./gcp_set_project.sh
出力結果:
Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
更新されたファイル
terraform/terraform.tfvars
を参照して、project-id
が挿入されていることを確認します。1 回限りの
terraform init
コマンドを実行して、このデプロイ用の Terraform プロバイダをインストールします。pushd ./terraform && terraform init && popd > /dev/null
Terraform
plan
コマンドを実行して、認証情報を確認します。pushd ./terraform && terraform plan && popd > /dev/null
赤色のエラーテキストが表示されなければ、認証が正しく機能しています。
出力結果:
Refreshing Terraform state in-memory prior to plan... ... +google_compute_instance.gcp-vm ... Plan: 34 to add, 0 to change, 0 to destroy.
Terraform 構成ファイルを調べる
Terraform では、デプロイ構成はファイルのディレクトリによって定義されます。これらのファイルは JSON ファイルにすることもできますが、Terraform 構成ファイル(.tf
ファイル)の構文を使用したほうが読みやすく、保守も簡単です。このチュートリアルに用意されている一連のファイルが、リソースをすっきりと整理する 1 つの方法を説明します。これらのファイルはすぐに動作するデプロイであるため、編集する必要はありません。
ファイル名 | 目的 |
---|---|
main.tf |
プロバイダを定義し、この構成でデプロイするクラウドを指定します。また、認証情報、プロジェクト名、選択したリージョンを読み込みます。 |
gcp_variables.tf 、aws_variables.tf |
デプロイをパラメータ化してカスタマイズするために使用する変数(gcp_region 、gcp_instance_type など)を宣言します。 |
gcp_compute.tf 、aws_compute.tf |
デプロイで使用するコンピューティング リソース(google_compute_instance など)を定義します。 |
vm_userdata.sh |
VM インスタンスの起動時に実行するスクリプトを指定します。iperf3 テストツールといくつかのラッパー スクリプトを自動的にセットアップします。 |
gcp_networking.tf 、aws_networking.tf |
ネットワーク リソース(google_compute_network 、google_compute_subnetwork 、google_compute_address 、google_compute_vpn_gateway 、google_compute_vpn_tunnel など)を定義します。 |
gcp_security.tf 、aws_security.tf |
GCP 環境または AWS 環境でテスト トラフィックを使用可能にするためのリソース(google_compute_firewall ルールや aws_security_group リソースなど)を定義します。 |
gcp_outputs.tf 、aws_outputs.tf |
デプロイの完了時に出力される変数(デプロイされた VM インスタンスの external_ip や internal_ip など)を定義します。 |
terraform.tfstate |
出力: Terraform がクライアント側のリソース状態をクラウドで確認した後に保管するために使用するファイルを指定します。詳細については、Managing GCP Projects with Terraform をご覧ください。 |
run_graph.sh |
Terraform で、リソースの依存関係を示す PNG ファイルを生成するためのシェル スクリプト。このスクリプトの出力は images / gcpawsvpn_plan_graph.png で確認できます。 |
このチュートリアルでは、スクリプトを使用して terraform.tfvars
ファイルを作成します。このファイル内に、ユーザー固有の credentials
と gcp_project_id
が設定されます。
VPC ネットワーク、VM インスタンス、VPN ゲートウェイ、IPsec トンネルのデプロイ
複数クラウド間接続の構築は複雑です。両方の環境で多数のリソースを並列にデプロイできますが、IPsec トンネルを構築するときに、相互依存関係を注意深く順序付ける必要があります。そのため、コードで安定したデプロイ構成を確立しておくと、デプロイに関する知識を増やすのに役立ちます。次の図に、この複数プロバイダ間のデプロイ構成を作成するために必要な手順をまとめます。
Terraform を使用してデプロイする
Terraform は、terraform.tfstate
ファイルを使用してリソースの状態を取得します。現在のリソース状態を読み取り可能な形式で表示するには、terraform show
を実行します。
Terraform がプロバイダで正しく認証を行うためには、まず概要チュートリアルを完了する必要があります。 以下の手順では、Terraform をすでに構成していることを前提としています。
Cloud Shell で、
terraform
ディレクトリに移動します。pushd terraform
Terraform の
validate
コマンドを使用して、構成ファイルの構文を検証します。この検証は、後続のステップでplan
コマンドとapply
コマンドの一部として実行される検証よりもシンプルなものです。validate
コマンドはどのプロバイダでも認証されません。terraform validate
エラー メッセージが表示されなければ、ファイルの構文と基本的なセマンティクスの初期有効性チェックは正常に完了しています。エラー メッセージが表示されたら、検証が失敗したことがわかります。
Terraform の
plan
コマンドを使用して、クラウド内のリソースをインスタンス化せずにデプロイを確認します。plan
コマンドは、構成で指定されたすべてのプロバイダとの認証に成功する必要があります。terraform plan
plan
コマンドが返す出力には、追加、削除、または更新されるリソースがリストされます。plan
の出力の最後の行に、追加、変更、または破棄されるリソースの数が示されます。Refreshing Terraform state in-memory prior to plan... ... Plan: 34 to add, 0 to change, 0 to destroy.
必要に応じて、Terraform の
graph
コマンドを使用して、リソース依存関係を可視化します。依存関係グラフは、デプロイされたリソースを分析するのに役立ちます。images/gcpawsvpn_plan_graph.png.
で前に準備したバージョンの出力ファイルを表示できます。run_graph.sh
スクリプトによって作成されるPNG
ファイル./gcpawsvpn_plan_graph.png
は、次と似ています。run_graph.sh
スクリプトは、必ずgraphviz
パッケージを使用します。graphviz
がインストールされていない場合は、[dot: command not found
] というメッセージが表示されます。Cloud Shell で、graphviz
をインストールするには次のコマンドを使用します。sudo apt-get install graphviz
Terraform の
apply
コマンドを使用してデプロイを作成します。terraform apply
apply
コマンドは、クラウド内のバッキング リソースを使用してデプロイを作成します。apply
は約 4 分で、GCP と AWS の VPC ネットワーク、VM インスタンス、VPN ゲートウェイ、IPsec トンネルなど、30 以上のリソースを作成します。apply
コマンドの出力には、デプロイされたリソースの詳細や、構成によって定義された出力変数が含まれています。data.google_compute_zones.available: Refreshing state... ... Apply complete! Resources: 34 added, 0 changed, 0 destroyed. ... Outputs: aws_instance_external_ip = [AWS_EXTERNAL_IP] aws_instance_internal_ip = 172.16.0.100 gcp_instance_external_ip = [GCP_EXTERNAL_IP] gcp_instance_internal_ip = 10.240.0.100
必要とする構成の最終状態を更新する必要がある場合は、
.tf
ファイルを編集します。次のようにgcp_security.tf
を編集して、google_compute_firewall gcp_allow-ssh
ルールにポート 23 を追加します。ports = ["22", "23"]
Terraform は編集内容を分析し、デプロイの状態を更新して一致させるために最小限必要な変更を識別します。
terraform apply
Terraform が
gcp-network-gcp-allow-ssh
を更新された構成に変更します。ワークフローを支援するために、デプロイから出力変数を送信できます。このチュートリアルでは
gcp_outputs.tf
ファイルとaws_outputs.tf
ファイルが、割り当てられた VM インスタンスの内部および外部 IP アドレスを出力変数として識別します。apply
ステップが完了すると、これらの IP アドレスが自動的に出力されます。この後のワークフローで、出力変数の値を再表示する必要がある場合は、output
コマンドを使用します。terraform output
この構成で定義される出力変数には、VM インスタンスの内部および外部 IP アドレスが含まれています。ネットワーク検証に
ssh
コマンドを使用するには、VM インスタンスに接続するための外部 IP アドレスが必要です。aws_instance_external_ip = [AWS_EXTERNAL_IP] aws_instance_internal_ip = 172.16.0.100 gcp_instance_external_ip = [GCP_EXTERNAL_IP] gcp_instance_internal_ip = 10.240.0.100
Terraform の
show
コマンドを使用してデプロイされたリソースを調べて、現在の状態を確認します。terraform show
出力結果:
... google_compute_instance.gcp-vm: ... Outputs: ...
インスタンスを確認するには、
gcloud compute
instances list
を使用するか、Cloud Console の [VM インスタンス] パネルを使用します。gcloud compute instances list
出力結果:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS gcp-vm-us-west1 us-west1-a n1-highmem-8 10.240.0.100 [EXTERNAL IP] RUNNING
ssh
コマンドを使用して GCP VM インスタンスに接続することにより、そのインスタンスが機能していることを確認します。ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
ping
コマンドとcurl
コマンドをssh
セッションで実行します。ping -c 5 google.com curl ifconfig.co/ip
GCP VM インスタンスから簡単なネットワーク パフォーマンス チェックを実行します。プリインストールされたスクリプトを使用して、外部と内部両方の各ネットワーク インターフェースでテストを実行します。
外部 IP 経由:
/tmp/run_iperf_to_ext.sh
このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。
出力結果:
... [SUM] ... sender [SUM] ... receiver ...
VPN 経由(内部 IP):
/tmp/run_iperf_to_int.sh
このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。
... [SUM] ... sender [SUM] ... receiver ...
GCP VM インスタンスからチェックを完了したら、次のコマンドを入力します。
exit
AWS VM インスタンスが機能していることを確認するため、
ssh
コマンドを使用して接続します。ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
ping
コマンドとcurl
コマンドをssh
セッションで実行します。ping -c 5 google.com curl ifconfig.co/ip
AWS VM インスタンスから簡単なネットワーク パフォーマンス チェックを実行します。プリインストールされたスクリプトを使用して、外部と内部両方の各ネットワーク インターフェースでテストを実行します。
外部 IP 経由:
/tmp/run_iperf_to_ext.sh
このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。
... [SUM] ... sender [SUM] ... receiver ...
VPN 経由(内部 IP):
/tmp/run_iperf_to_int.sh
このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。
... [SUM] ... sender [SUM] ... receiver ...
AWS VM インスタンスからチェックを完了したら、次のコマンドを入力します。
exit
VPN を使用して GCP と AWS 間の安全なプライベート サイトツーサイト接続を正常にデプロイしました。
クリーンアップ
デプロイされたリソースをクリーンアップします。destroy
デプロイ コマンドを実行するまでは、VM インスタンスに対する料金が発生します。
オプションの
plan -destroy
コマンドを実行して、destroy
によって影響を受けるリソースを確認します。terraform plan -destroy
出力結果:
Refreshing Terraform state in-memory prior to plan... ... Plan: 0 to add, 0 to change, 34 to destroy.
destroy
コマンドはリソースを完全に削除するため、本当に削除するかどうかを確認してから、「yes
」を入力して確定します。destroy
コマンドは通常約 100 秒で完了します。terraform destroy
出力結果:
Do you really want to destroy? Terraform will delete all your managed infrastructure. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes
「
yes
」と入力して、作成したリソースの破棄を確認します。Destroy complete! Resources: 34 destroyed.
show
コマンドを実行して、リソースの状態を表示します。terraform show
すべてのリソースを破棄したので、
show
コマンドによって出力される行はありません。つまり、デプロイされたままになっているリソースがないことが示されます。最後にディレクトリを復元します。
popd > /dev/null
GCP と AWS 間の安全なプライベート サイトツーサイト接続を正常にクリーンアップし、デプロイを完了しました。
次のステップ
Terraform 状態ファイルを Cloud Storage 内に保管する高度な方法については、Terraform を使用した GCP プロジェクトの管理をご覧ください。
オープン クラウドの詳細については、What if you could run the same, everywhere?(マルチクラウド スタックでロックインから脱出する方法)をご覧ください。
オープン クラウドとハイブリッド設定の詳細については、2017 年 3 月に開催された Google Cloud Next の 3 日目の基調講演(Vint Cerf と Sam Ramji)をご覧ください。
クラウド VPN の詳細については、次を参照してください。
Google Cloud のその他の機能を試す。チュートリアルをご覧ください。