自動ネットワーク デプロイ: Terraform を使用した GCP と AWS の間での VPN の構築

このチュートリアルでは、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 を使用して、ネットワーク下りトラフィックのヘッドルームを利用可能にします。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

始める前に

  1. gcp-automated-networks という名前の GCP プロジェクトを選択します。

    プロジェクト ページに移動

  2. Cloud Shell インスタンスを起動します。このチュートリアルでは、Cloud Shell からすべてのターミナル コマンドを実行します。

    Cloud Shell を開く

デプロイ アーキテクチャ

このチュートリアルでは、次のデプロイ環境を構築します。

デプロイ環境

このチュートリアルには次の内容が組み込まれています。

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 のリージョンとゾーンを確認する。

チュートリアル コードのクローンの作成

  1. GitHub からチュートリアル コードのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. チュートリアル ディレクトリに移動します。

    cd autonetdeploy-multicloudvpn
    

GCP のリージョンとゾーンを確認する

Compute Engine インスタンス、VPN ゲートウェイ、Cloud Router など、このチュートリアルの特定のクラウド リソースでは、意図した配置リージョン、ゾーン、あるいはその両方を明示的に宣言する必要があります。詳細については、GCP のリージョンとゾーンをご覧ください。

このチュートリアルでは、プロバイダごとに 1 つのリージョンのみが必要です。2 つのクラウド間の接続を最適化するには、互いに近いリージョンを選択します。次の表に、チュートリアル ファイル terraform/gcp_variables.tfterraform/aws_variables.tf に設定された値の一覧を示します。

フィールド名 GCP 値 AWS 値
Region Name us-west1 US West (us-west-2)
Location The Dalles, Oregon, USA Oregon

AWS の使用の準備

このセクションでは、AWS リージョンを確認します。AWS リージョンの詳細については、AWS のリージョンとアベイラビリティー ゾーンをご覧ください。

  1. AWS Management Console にログインし、VPC ダッシュボードに移動します。プルダウン メニューで [Oregon] リージョンを選択します。

  2. 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 に認証情報を登録する必要があります。

  1. Terraform に GCP 認証情報を登録します。

    ./gcp_set_credentials.sh exists
    

    出力結果:

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. Terraform に AWS 認証情報を登録します。

    ./aws_set_credentials.sh exists
    

    出力結果:

    Updated aws_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    

プロジェクトの設定

GCP は、自動化ツールで使用する GCP プロジェクトを指定するためのいくつかの方法を提供しています。単純化のために、環境からプロジェクト ID を取得する代わりに、テンプレート ファイル内の文字列変数によって GCP プロジェクトを明示的に示します。

  1. プロジェクト ID を設定します。

    gcloud config set project [YOUR-PROJECT-ID]

    出力結果:

    Updated property [core/project].
    
  2. 提供されているスクリプトを使用して、Terraform の構成ファイル内のプロジェクト値を更新します。

    ./gcp_set_project.sh
    

    出力結果:

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. 更新されたファイル terraform/terraform.tfvars を参照して、project-id が挿入されていることを確認します。

  4. 1 回限りの terraform init コマンドを実行して、このデプロイ用の Terraform プロバイダをインストールします。

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. 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.tfaws_variables.tf デプロイをパラメータ化してカスタマイズするために使用する変数(gcp_regiongcp_instance_type など)を宣言します。
gcp_compute.tfaws_compute.tf デプロイで使用するコンピューティング リソース(google_compute_instance など)を定義します。
vm_userdata.sh VM インスタンスの起動時に実行するスクリプトを指定します。iperf3 テストツールといくつかのラッパー スクリプトを自動的にセットアップします。
gcp_networking.tfaws_networking.tf ネットワーク リソース(google_compute_networkgoogle_compute_subnetworkgoogle_compute_addressgoogle_compute_vpn_gatewaygoogle_compute_vpn_tunnel など)を定義します。
gcp_security.tfaws_security.tf GCP 環境または AWS 環境でテスト トラフィックを使用可能にするためのリソース(google_compute_firewall ルールや aws_security_group リソースなど)を定義します。
gcp_outputs.tfaws_outputs.tf デプロイの完了時に出力される変数(デプロイされた VM インスタンスの external_ipinternal_ip など)を定義します。
terraform.tfstate 出力:Terraform がクライアント側のリソース状態をクラウドで確認した後に保管するために使用するファイルを指定します。詳細については、Terraform を使用した GCP プロジェクトの管理をご覧ください。
run_graph.sh Terraform で、リソースの依存関係を示す PNG ファイルを生成するためのシェル スクリプト。このスクリプトの出力は images / gcpawsvpn_plan_graph.png で確認できます。

このチュートリアルでは、スクリプトを使用して terraform.tfvars ファイルを作成します。このファイル内に、ユーザー固有の credentialsgcp_project_id が設定されます。

VPC ネットワーク、VM インスタンス、VPN ゲートウェイ、IPsec トンネルのデプロイ

複数クラウド間接続の構築は複雑です。両方の環境で多数のリソースを並列にデプロイできますが、IPsec トンネルを構築するときに、相互依存関係を注意深く順序付ける必要があります。そのため、コードで安定したデプロイ構成を確立しておくと、デプロイに関する知識を増やすのに役立ちます。次の図に、この複数プロバイダ間のデプロイ構成を作成するために必要な手順をまとめます。

デプロイ手順

Terraform を使用してデプロイする

Terraform は、terraform.tfstate ファイルを使用してリソースの状態を取得します。現在のリソース状態を読み取り可能な形式で表示するには、terraform show を実行します。

Terraform がプロバイダで正しく認証を行うためには、まず概要チュートリアルを完了する必要があります。 以下の手順では、Terraform をすでに構成していることを前提としています。

  1. Cloud Shell で、terraform ディレクトリに移動します。

    pushd terraform
    
  2. Terraform の validate コマンドを使用して、構成ファイルの構文を検証します。この検証は、後続のステップで plan コマンドと apply コマンドの一部として実行される検証よりもシンプルなものです。validate コマンドはどのプロバイダでも認証されません。

    terraform validate
    

    エラー メッセージが表示されなければ、ファイルの構文と基本的なセマンティクスの初期有効性チェックは正常に完了しています。エラー メッセージが表示されたら、検証が失敗したことがわかります。

  3. 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.
    
  4. 必要に応じて、Terraform の graph コマンドを使用して、リソース依存関係を可視化します。依存関係グラフは、デプロイされたリソースを分析するのに役立ちます。images/gcpawsvpn_plan_graph.png. で前に準備したバージョンの出力ファイルを表示できます。

    run_graph.sh スクリプトによって作成される PNG ファイル ./gcpawsvpn_plan_graph.png は、次と似ています。

    plan_graph ファイル

    run_graph.sh スクリプトは、必ず graphviz パッケージを使用します。graphviz がインストールされていない場合は、[dot: command not found] というメッセージが表示されます。Cloud Shell で、graphviz をインストールするには次のコマンドを使用します。

    sudo apt-get install graphviz
    
  5. 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
    
  6. 必要とする構成の最終状態を更新する必要がある場合は、.tf ファイルを編集します。次のように gcp_security.tf を編集して、google_compute_firewall gcp_allow-ssh ルールにポート 23 を追加します。

    ports = ["22", "23"]
    

    Terraform は編集内容を分析し、デプロイの状態を更新して一致させるために最小限必要な変更を識別します。

    terraform apply
    

    Terraform が gcp-network-gcp-allow-ssh を更新された構成に変更します。

  7. ワークフローを支援するために、デプロイから出力変数を送信できます。このチュートリアルでは 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
  8. Terraform の show コマンドを使用してデプロイされたリソースを調べて、現在の状態を確認します。

    terraform show
    

    出力結果:

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. インスタンスを確認するには、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
    
  10. ssh コマンドを使用して GCP VM インスタンスに接続することにより、そのインスタンスが機能していることを確認します。

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. ping コマンドと curl コマンドを ssh セッションで実行します。

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. GCP VM インスタンスから簡単なネットワーク パフォーマンス チェックを実行します。プリインストールされたスクリプトを使用して、外部と内部両方の各ネットワーク インターフェースでテストを実行します。

    1. 外部 IP 経由:

      /tmp/run_iperf_to_ext.sh
      

      このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。

      出力結果:

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. VPN 経由(内部 IP):

      /tmp/run_iperf_to_int.sh
      

      このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. GCP VM インスタンスからチェックを完了したら、次のコマンドを入力します。

    exit
    
  14. AWS VM インスタンスが機能していることを確認するため、ssh コマンドを使用して接続します。

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. ping コマンドと curl コマンドを ssh セッションで実行します。

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. AWS VM インスタンスから簡単なネットワーク パフォーマンス チェックを実行します。プリインストールされたスクリプトを使用して、外部と内部両方の各ネットワーク インターフェースでテストを実行します。

    1. 外部 IP 経由:

      /tmp/run_iperf_to_ext.sh
      

      このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. VPN 経由(内部 IP):

      /tmp/run_iperf_to_int.sh
      

      このスクリプトは、ネットワーク パフォーマンスに関する概要データを生成する 30 秒のパフォーマンス テストを実行します。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. AWS VM インスタンスからチェックを完了したら、次のコマンドを入力します。

    exit
    

VPN を使用して GCP と AWS 間の安全なプライベート サイトツーサイト接続を正常にデプロイしました。

クリーンアップ

デプロイされたリソースをクリーンアップします。destroy デプロイ コマンドを実行するまでは、VM インスタンスに対する料金が発生します。

  1. オプションの plan -destroy コマンドを実行して、destroy によって影響を受けるリソースを確認します。

    terraform plan -destroy
    

    出力結果:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. 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.
    
  3. show コマンドを実行して、リソースの状態を表示します。

    terraform show
    

    すべてのリソースを破棄したので、show コマンドによって出力される行はありません。つまり、デプロイされたままになっているリソースがないことが示されます。

  4. 最後にディレクトリを復元します。

    popd > /dev/null
    

GCP と AWS 間の安全なプライベート サイトツーサイト接続を正常にクリーンアップし、デプロイを完了しました。

次のステップ