自動ネットワーク デプロイ: スタートアップ

このチュートリアルでは、デフォルトの Virtual Private Cloud(VPC)ネットワークに単一の仮想マシン(VM)インスタンスをデプロイする単純な例について概説します。このチュートリアルは、Cloud Deployment Manager と HashiCorp の Terraform を使用して一般的なネットワーク リソース パターンのデプロイを自動化する方法を説明する、全 3 回からなるシリーズの第 2 回です。

このチュートリアルを利用するには、その前に、自動ネットワーク デプロイ: 概要チュートリアルに従って、ご使用の環境に適切な認証をセットアップしておく必要があります。

目標

  • Google Cloud Platform(GCP)内に単純な作業環境を準備する。
  • 単純なデプロイ用の初期設定ファイルについて理解する。
  • Deployment Manager で、VM インスタンスをデプロイするための一般的なコマンドを実行する。
  • Terraform で、VM インスタンスをデプロイするための一般的なコマンドを実行する。

料金

このチュートリアルでは、以下の課金対象の Google Cloud Platform コンポーネントを使用します。

  • Compute Engine VM インスタンス
  • 永続ディスク
  • ネットワーク(下り)

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。 GCP を初めてご利用の場合は、無料トライアルをご利用いただけます。

準備

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

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

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

    Cloud Shell を開く

デプロイ アーキテクチャ

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

デプロイ環境

最初のステップとして、default VPC ネットワーク内に VM インスタンスを作成します。ping コマンドを実行して、作成したインスタンスが稼働中であることを確認してから、Secure Shell(ssh)ツールを使用してインスタンスにアクセスします。

デプロイを作成した後、GCP Console の [VPC ネットワーク] パネルに移動します。プロジェクトに default VPC ネットワークが自動的に作成されていることを確認してください。この VPC 内には、次の 2 つのリソース コレクションがあらかじめ作成されています。

  • ファイアウォール

    HTTP(S) と ping トラフィックを許可する基本的なファイアウォール ルールが定義されています。

  • ルート

    さまざまなリージョンとデフォルトのインターネット ゲートウェイ間でのトラフィック フローを可能にするルートが作成されています。

これらのネットワーク リソース コレクションにより、新規ユーザーは GCP を簡単に使い始めることができます。

GCP 作業環境を準備する

このチュートリアルでは、概要チュートリアルで作成した、プロジェクトの設定およびチュートリアル コードのクローンを使用します。

設定ファイルを調べる

Deployment Manager の設定ファイル

Deployment Manager では、YAML 構成ファイル全体と一連の関連するリソース テンプレート ファイルによって、デプロイ構成が定義されています。このチュートリアルには、概念を説明するために最小限必要なファイル一式が用意されています。これは実際に機能するデプロイなので、編集せずに実行できます。

ファイル名 目的
autonetdeploy_config.yaml autonetdeploy-startup.py 設定テンプレートをインポートします。必須のデプロイ変数 project_idzoneinstance_type に値を設定します。
autonetdeploy_startup.py.schema 設定テンプレートに必要なデプロイ変数を定義します。デプロイ設定の基本となるあらゆる詳細を理解しなくても、このファイルを調べることで、テンプレートの使用方法がわかります。
autonetdeploy_startup.py デプロイ設定の詳細なリソース定義(compute.v1.instance など)が格納されています。YAML ファイルを使用することもできますが、Python のほうが柔軟性があります。

Terraform の設定ファイル

Terraform では、デプロイ設定はディレクトリ内のファイルによって定義されます。これらのファイルは JSON ファイルにすることもできますが、Terraform 構成ファイル.tf ファイル)の構文を使用したほうが読みやすく、保守も簡単です。このチュートリアルに用意されている一連のファイルが、リソースをすっきりと整理する 1 つの方法を説明します。これらのファイルはすぐに動作するデプロイであるため、編集する必要はありません。

ファイル名 目的
main.tf プロバイダを定義し、この設定でデプロイするクラウドを指定します。また、認証情報、プロジェクト、目的のリージョンも設定します。
gcp_variables.tf デプロイをパラメータ化してカスタマイズするために使用する変数(gcp_regiongcp_instance_type など)を宣言します。
gcp_compute.tf デプロイで使用するコンピューティング リソース(google_compute_instance など)を定義します。
gcp_outputs.tf デプロイ完了時に出力または表示する変数(デプロイされた VM インスタンスの external_ip および internal_ip など)を定義します。
terraform.tfstate 出力: Terraform がクライアント側のリソース状態をクラウドで確認した後に保管するために使用するファイル。詳細については、Terraform を使用した GCP プロジェクトの管理をご覧ください。
run_graph.sh Terraform で、リソースの依存関係を示す PNG ファイルを生成するためのシェル スクリプト。このスクリプトの出力は、images/startup_plan_graph.png に記録されます。

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

デフォルト VPC ネットワーク内に Compute Engine インスタンスをデプロイする

自動ネットワーク デプロイのすべてのチュートリアルでは、同じ手順に従って、次の図に示されているデプロイ アーキテクチャをデプロイし、クリーンアップします。

デプロイとクリーンアップ

Deployment Manager を使用してデプロイする

デプロイを作成すると、プレビュー モードであるかどうかに関わらず、Deployment Manager がリソース設定ファイルを取り込み、リソースの依存関係を評価して、可能な限り効率的に環境を構築できるよう準備します。各デプロイには、それぞれに固有の deployment_name でタグが付けられます。このタグを使って、デプロイを記述、更新、または破棄することができます。

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

    pushd deploymentmanager
    
  2. --preview フラグを使用してデプロイをプレビューします。これにより、リソースを使用せずに GCP にデプロイが作成されます。

    gcloud deployment-manager deployments create defaultvm-deployment --config ./autonetdeploy_config.yaml --preview
  3. 次に、作成したデプロイを調べて、期待通りに作成されていることを確認します。

    gcloud deployment-manager deployments list

    出力結果:

    NAME                  LAST_OPERATION_TYPE  STATUS  DESCRIPTION  MANIFEST  ERRORS
    defaultvm-deployment  preview              DONE                           []
    
  4. デプロイがどのように記述されているかを確認します。

    gcloud deployment-manager deployments describe defaultvm-deployment

    出力結果:

    ...
    NAME                 TYPE                 STATE       INTENT
    gcp-disk-us-west1-b  compute.v1.disk      IN_PREVIEW  CREATE_OR_ACQUIRE
    gcp-vm-us-west1-b    compute.v1.instance  IN_PREVIEW  CREATE_OR_ACQUIRE
    
  5. デプロイのプレビューは予定されているデプロイの記録にすぎないので、このデプロイのプレビューは削除します。

    gcloud deployment-manager deployments delete defaultvm-deployment

    出力結果:

    ...
    Do you want to continue (y/N)?  y
    ...
    Delete operation operation-[id] completed successfully.
    
  6. 実際のデプロイを作成します。次のコマンドを使用すると、通常は 30 秒以内で compute.v1.disk リソースと compute.v1.instance リソースがデプロイされます。

    gcloud deployment-manager deployments create defaultvm-deployment --config ./autonetdeploy_config.yaml

    出力結果:

    ...
    NAME                 TYPE                 STATE      ERRORS  INTENT
    gcp-disk-us-west1-b  compute.v1.disk      COMPLETED  []
    gcp-vm-us-west1-b    compute.v1.instance  COMPLETED  []
    
  7. 有効なデプロイが作成されたことを確認します。

    gcloud deployment-manager deployments list

    出力結果:

    NAME                  LAST_OPERATION_TYPE  STATUS  DESCRIPTION  MANIFEST       ERRORS
    defaultvm-deployment  insert               DONE                 manifest-[ID]  []
    
  8. デプロイされたリソースを調べて、詳細を確認します。

    gcloud deployment-manager deployments describe defaultvm-deployment

    出力結果:

    fingerprint: ...
    id: ...
    insertTime: ...
    manifest: ...
    name: defaultvm-deployment
    operation:
      endTime: ...
      name: ...
      operationType: insert
      progress: 100
      startTime: ...
      status: DONE
      user: ...
    NAME                 TYPE                 STATE      INTENT
    gcp-disk-us-west1-b  compute.v1.disk      COMPLETED
    gcp-vm-us-west1-b    compute.v1.instance  COMPLETED
    
  9. デプロイが正常に作成されて、インスタンスが実行されていることを確認します。

    gcloud compute instances list

    出力結果(出力全体を見るには、右にスクロールします):

    NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP        STATUS
    gcp-vm-us-west1-b  us-west1-b  n1-standard-1               10.138.0.2   [GCP_EXTERNAL_IP]  RUNNING
    

    Cloud Console の [Deployment Manager] パネルまたは [VM インスタンス] パネルで、これらのインスタンスを確認できます。このデプロイで default VPC ネットワーク内にデプロイされるインスタンスは 1 つです。

  10. 実行中のインスタンスと通信するには、ssh コマンドを使用して VM に接続します。接続後は、pingcurl などのコマンドを実行できます。自動ネットワーク デプロイ: 概要チュートリアルで、必須の vm-ssh-key をプロジェクト全体のメタデータとして登録したことを思い出してください。

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

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. すべてが正常に動作していることを確認したら、次のコマンドを入力します。

    exit
    
  13. マニフェスト ファイルを表示します。デプロイをデバッグする際は、マニフェスト ファイルが役立ちます。このファイルには、デプロイされたリソースを詳細に説明する読み取り専用の情報が格納されている他、エラーや警告が発生した場合には、それらのエラーまたは警告も記録されます。マニフェスト ファイルの名前がわからない場合は、manifests list コマンドを実行して、その出力を調べてください。マニフェスト ファイルには、manifest-### という形で名前が付けられています。

    gcloud deployment-manager manifests list --deployment defaultvm-deployment

    出力結果:

    NAME                    ID                   INSERT_TIME
    manifest-1234567890000  3456789012394315470  2017-08-22T...
    
    gcloud deployment-manager manifests describe [MANIFEST_FILENAME] --deployment defaultvm-deployment

    出力結果(出力全体を見るには、右にスクロールします):

    ...
    name: [MANIFEST_FILENAME]
    selfLink: https://www.googleapis.com/deploymentmanager/v2/projects/gcp-automated-networks/global/deployments/defaultvm-deployment/manifests/[MANIFEST_FILENAME]
    

Deployment Manager を使用してクリーンアップする

デプロイされたリソースをクリーンアップします。delete デプロイ コマンドを実行するまでは、VM インスタンスに対する料金が発生します。delete コマンドはリソースを完全に削除するため、本当に削除するかどうかを確認してから、y を入力して確定します。通常、この delete コマンドの実行は 30 秒以内に完了します。

gcloud deployment-manager deployments delete defaultvm-deployment

出力結果:

The following deployments will be deleted:
- defaultvm-deployment

Do you want to continue (y/N)?  y
gcloud deployment-manager deployments list

出力結果:

Listed 0 items.
popd > /dev/null

これで、Deployment Manager を使用して GCP 内に VM インスタンスをデプロイし、削除する手順を完了しました。

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

Terraform でのデプロイは、少々異なります。Terraform では terraform.tfstate ファイルを使用して、リソース状態をキャプチャします。読んで理解できる形で現在の状態を表示するには、terraform show を実行します。

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

    pushd terraform
    
  2. PATH~/terraform ディレクトリに再エクスポートしなければならない場合があります。その場合は、Cloud Shell で次のスクリプトを再実行して、該当するエクスポート コマンドを確認してください。

    ./get_terraform.sh
    
  3. 構成ファイルの構文の有効性をチェックします。Terraform には、すべての構成ファイルで有効な構文をチェックする validate コマンドが用意されています。

    terraform validate
    

    この有効性チェックは、以降のステップで plan および apply の一部として実行するチェックよりも単純です。validate コマンドは、どのプロバイダでも認証を行いません。

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

  4. デプロイをプレビューします。Terraform の plan コマンドは、クラウド内のリソースをインスタンス化せずにデプロイをプレビューします。

    terraform plan
    

    plan コマンドは、Deployment Manager の preview コマンドとは異なり、クラウド内にデプロイ参照を作成しません。したがって、最後にデプロイ参照を削除する必要はありません。また、plan コマンドを実行するには、設定で指定されているすべてのプロバイダで認証に成功する必要があります。

    plan コマンドが返す出力には、追加、削除、または更新されるリソースがリストされます。plan の出力の最後の行に、追加、変更、または破棄されるリソースの数が示されます。

    出力結果:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 1 to add, 0 to change, 0 to destroy.
    
  5. 必要であれば、Terraform の graph コマンドを使用して、リソースの依存関係を可視化します。依存関係グラフは、デプロイされたリソースを分析するのに役立ちます。images/startup_plan_graph.png で前に準備したバージョンの出力ファイルを表示できます。

    run_graph.sh スクリプトは、PNG ファイル ./startup_plan_graph.png を作成します。このファイルは次のような内容になります。

    run_graph.sh スクリプト

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

    sudo apt-get install graphviz
    
  6. デプロイを作成します。

    terraform apply
    

    apply コマンドは、クラウド内のバッキング リソースを使用してデプロイを作成します。10 秒と少しで google_compute_instance リソースの作成が完了します。このリソースにはブートディスクと、内部 IP アドレスと外部 IP アドレスの両方が割り当てられたネットワーク インターフェースが含まれます。

    apply コマンドの出力には、デプロイされたリソースの詳細と、構成で定義されている出力変数が示されます。

    data.google_compute_zones.available: Refreshing state...
    ...
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    ...
    Outputs:
    
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = [GCP_INTERNAL_IP]
    
  7. 必要とする構成の最終状態を更新する必要がある場合は、.tf ファイルを編集します。次のように gcp_compute.tf を編集して、google_compute_instance に起動スクリプトを追加します。

    zone = "${data.google_compute_zones.available.names[0]}"
    metadata_startup_script = "echo hi > /test.txt"
    

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

    terraform apply
    

    Terraform は gcp-vm を破棄し、更新された設定を使用して作成し直します。

  8. ワークフローを支援するために、デプロイから出力変数を送信できます。このチュートリアルでの gcp_outputs.tf は、出力変数として、割り当てられた内部および外部 IP アドレスを識別します。apply ステップが完了すると、これらのアドレスが自動的に出力されます。この後のワークフローで、出力変数の値を再表示する必要がある場合は、output コマンドを使用します。

    terraform output
    

    この構成で定義している出力変数には、GCP インスタンスの内部 IP アドレスと外部 IP アドレスがあります。ssh コマンドを使用する際は、インスタンスに接続するために、GCP の外部 IP アドレスが必要です。

    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = [GCP_INTERNAL_IP]
    
  9. デプロイされたリソースを調べて、現在の状態を確認します。

    terraform show
    

    出力結果:

    data.google_compute_zones.available:
    ...
    google_compute_instance.gcp-vm:
    ...
    
  10. インスタンスを確認します。それには、gcloud compute instances list を使用するか、Cloud Console の [Deployment Manager] パネルまたは [VM インスタンス] パネルを使用します。このデプロイでは、この 1 つのインスタンスが default VPC ネットワーク内にデプロイされます。

    gcloud compute instances list

    出力結果:

    NAME             ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP
    gcp-vm-us-west1  us-west1-a  n1-standard-1               10.138.0.2   [GCP_EXTERNAL_IP]  RUNNING
    
  11. 次の ssh コマンドを実行して、VM インスタンスが機能していることを確認します。

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  12. ssh セッションで、次のコマンドを実行します。

    ping -c 5 google.com
    curl ifconfig.co/ip`
    exit
    

    出力結果:

    Connection to [GCP_EXTERNAL_IP] closed.
    

Terraform を使用してクリーンアップする

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

  1. 実際にリソースを破棄しないと、どうなるかを確認します。

    terraform plan -destroy
    

    出力結果:

    ...
    Plan: 0 to add, 0 to change, 1 to destroy.
    
  2. クラウド内にデプロイされたリソースを完全に破棄します。「yes」と入力して、コマンドの実行を確定します。通常、この destroy コマンドの実行は約 30 秒で完了します。

    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
    
    ...
    Destroy complete! Resources: 1 destroyed.
    
  3. リソースがデプロイされていない状態になったことを確認します。

    terraform show
    

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

  4. 次のコマンドを実行して終了します。

    popd > /dev/null
    

これで、Terraform を使用して GCP 内に VM インスタンスを正常にデプロイし、そのインスタンスを破棄しました。

次のステップ

  • GCP と AWS の間の VPN 構築チュートリアルを学習する。このチュートリアルでは、GCP と Amazon Web Services(AWS)のカスタム VPC ネットワーク内に VM インスタンスを作成する方法を説明しています。VM インスタンスを作成した後、関連する VPC ネットワーク間の仮想プライベート ネットワーク(VPN)をデプロイします。さらに、プライベート IP を使用して GCP と AWS の VM インスタンス間での接続テストを実行します。

  • Terraform 状態ファイル(terraform.tfstate)を Cloud Storage に保存する高度な方法を学習する。Terraform を使用した GCP プロジェクトの管理をご覧ください。

  • Google Cloud Platform のその他の機能を試すには、チュートリアルをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...