Terraform を使ってみる

このチュートリアルでは、Terraform を使用してリソースをプロビジョニングし、Compute Engine でシンプルなウェブサーバーを実行する方法を学習します。

このチュートリアルでは、次のことを行います。

  • Terraform を使用して Google Cloud に VM を作成します。
  • 基本的な Python Flask サーバーを起動します。

費用

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

Compute Engine

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

チュートリアルを開始する準備をします。

プロジェクトの選択または作成

  1. Google Cloud Console でプロジェクト セレクタ ページに移動します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトを選択または作成します。

権限を設定する

ユーザー アカウントに、必要な Compute Engine の権限があることを確認します。

  • compute.instance.*
  • compute.firewalls.*

IAM ページに移動

ロールと権限について詳細を確認します

API を有効にする

Compute Engine and OS Login API を有効にします。

API を有効にする

Cloud Shell の起動

Cloud Shell は Compute Engine 仮想マシンです。

この仮想マシンに関連付けられているサービス認証情報は自動的に設定されるため、サービス アカウント キーを設定またはダウンロードする必要はありません。

Compute Engine VM を作成する

まず、Terraform 構成ファイルで VM の設定を定義します。次に、Terraform コマンドを実行してプロジェクトに VM を作成します。

ディレクトリを作成する

Cloud Shell で、新しいディレクトリを作成します。新しいディレクトリに、Terraform 構成用の main.tf ファイルを作成します。このファイルには、プロジェクト内に作成するすべての Google Cloud リソースが含まれています。

mkdir tf-tutorial && cd tf-tutorial
nano main.tf

Compute Engine VM リソースを作成する

このセクションでは、Debian を実行する単一の Compute Engine インスタンスを作成します。このチュートリアルでは、利用可能な最小のマシンタイプを使用します。後で、より大きなマシンタイプにアップグレードできます。

作成した main.tf ファイルに次の google_compute_instance Terraform リソースを追加します。

# Create a single Compute Engine instance
resource "google_compute_instance" "default" {
  name         = "flask-vm"
  machine_type = "f1-micro"
  zone         = "us-west1-a"
  tags         = ["ssh"]

  metadata = {
    enable-oslogin = "TRUE"
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  # Install Flask
  metadata_startup_script = "sudo apt-get update; sudo apt-get install -yq build-essential python-pip rsync; pip install flask"

  network_interface {
    network = "default"

    access_config {
      # Include this section to give the VM an external IP address
    }
  }
}

サンプルコードでは、Google Cloud ゾーンを us-west1-a に設定します。これを別のゾーンに変更できます。

Terraform を初期化する

この時点で、terraform init を実行して必要なプラグインを追加し、.terraform ディレクトリをビルドできます。

terraform init

出力:

Initializing the backend...

Initializing provider plugins...
...

Terraform has been successfully initialized!

Terraform 構成を検証する

これまでに作成した Terraform コードを検証できます。terraform plan を実行します。これにより、次の処理が行われます。

  • main.tf の構文が正しいことを確認します。
  • 作成されるリソースのプレビューが表示されます。
terraform plan

出力:

...

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

構成を適用する

VM を作成するには、terraform apply を実行します。

terraform apply

プロンプトが表示されたら、「yes」と入力します。

Terraform が Google Cloud APIs を呼び出して新しい VM を設定します。[VM インスタンス] ページで、新しい VM を確認します。

Google Cloud でウェブサーバーを実行する

次に、ウェブ アプリケーションを作成して VM にデプロイし、ウェブ アプリケーションへのクライアント リクエストを許可するファイアウォール ルールを作成します。

カスタム SSH ファイアウォール ルールを追加する

default ネットワークに default-allow-ssh ファイアウォール ルールを設定すると、SSH を使用して VM に接続できます。独自のカスタム ファイアウォール ルールを使用する場合は、main.tf ファイルの末尾に次のリソースを追加します。

resource "google_compute_firewall" "ssh" {
  name = "allow-ssh"
  allow {
    ports    = ["22"]
    protocol = "tcp"
  }
  direction     = "INGRESS"
  network       = "default"
  priority      = 1000
  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["ssh"]
}

terraform apply を実行してファイアウォール ルールを作成します。

SSH を使用して VM に接続する

SSH で VM に接続して、すべてが正しく設定されていることを確認します。

  1. [VM インスタンス] ページに移動します。

  2. flask-vm という名前の VM を見つけます。

  3. [接続] 列で、[SSH] をクリックします。

    実行中の VM のブラウザ内 SSH ターミナル ウィンドウが開きます。

詳細については、VM への接続をご覧ください。

Flask アプリをビルドする

このチュートリアル用に Python Flask アプリを作成します。ウェブサーバーとテスト エンドポイントを 1 つのファイルに記述します。

  1. ブラウザ内 SSH ターミナルで、app.py というファイルを作成します。

    nano app.py
    
  2. app.py ファイルに以下を追加します。

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_cloud():
     return 'Hello Cloud!'
    
    app.run(host='0.0.0.0')
    
  3. app.py を実行します。

    python app.py
    

    Flask はデフォルトで localhost:5000 でトラフィックを処理します。

  4. 2 つ目の SSH 接続を開きます。

    1. [VM インスタンス] ページに移動します。
    2. flash-vm という名前の VM を見つけて、[SSH] をクリックします。
  5. 2 番目の SSH 接続で curl を実行して、app.py で構成したメッセージが返されることを確認します。

    curl http://0.0.0.0:5000
    

    このコマンドの出力は、Hello Cloud です。

VM でポート 5000 を開く

ローカルのパソコンからウェブサーバーに接続するには、VM でポート 5000 を開いている必要があります。Google Cloud では、ファイアウォール ルールを使用してトラフィックのポートを開くことができます。

main.tf ファイルの末尾に、次の google_compute_firewall Terraform リソースを追加します。

resource "google_compute_firewall" "flask" {
  name    = "flask-app-firewall"
  network = "default"

  allow {
    protocol = "tcp"
    ports    = ["5000"]
  }
  source_ranges = ["0.0.0.0/0"]
}

Cloud Shell で、terraform apply を実行してファイアウォール ルールを作成します。

ウェブサーバーの URL の出力変数を追加する

  1. main.tf の末尾に、Terraform 出力変数を追加して、ウェブサーバーの URL を出力します。

    // A variable for extracting the external IP address of the VM
    output "Web-server-URL" {
     value = join("",["http://",google_compute_instance.default.network_interface.0.access_config.0.nat_ip,":5000"])
    }
    
  2. terraform apply を実行します。

    terraform apply
    

    プロンプトが表示されたら、「yes」と入力します。Terraform は、次のように VM の外部 IP アドレスとポート 5000 を画面に出力します。

    Web-server-URL = "http://IP_ADDRESS:5000"
    

    この出力は terraform output でいつでも入手できます。

    terraform output
    
  3. 前の手順の URL をクリックすると、「Hello Cloud!」のメッセージが表示されます。

    これは、サーバーが稼働していることを意味します。

トラブルシューティング

  • 必要な API が有効になっていない場合、Terraform はエラーを返します。エラー メッセージには、API を有効にするリンクが含まれています。API を有効にすると、terraform apply を再実行できます。

  • SSH 経由で VM に接続できない場合:

クリーンアップ

チュートリアルの完了後は、それ以上の費用が発生しないように、作成したものをすべて削除できます。

Terraform では、terraform destroy コマンドを実行して、構成ファイルで定義されているすべてのリソースを削除できます。

terraform destroy

Terraform でリソースを削除できるようにするには、「yes」と入力します。

次のステップ