Terraform を使用して基本的な Flask ウェブサーバーをデプロイする

このチュートリアルでは、Terraform を使用して Compute Engine で基本的なウェブサーバーを構築し、Terraform の使用を開始する方法を学習します。

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

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

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

Compute Engine

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

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

始める前に

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

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

  1. Google Cloud コンソールでプロジェクトの選択ページに移動します。

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

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

権限を設定する

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

  • compute.instances.*
  • compute.firewalls.*

IAM ページに移動

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

API を有効にする

Compute Engine API を有効にします。

API を有効にする

Cloud Shell の起動

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

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

Terraform には Cloud Shell が統合されており、Cloud Shell が自動的に Terraform を認証するため、わずかなセットアップ作業で使用を開始できます。

Compute Engine VM を作成する

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

ディレクトリを作成する

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

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

Virtual Private Cloud ネットワークとサブネットを作成する

このセクションでは、VM のネットワーク インターフェース用に Virtual Private Cloud(VPC)ネットワークとサブネットを作成します。

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

resource "google_compute_network" "vpc_network" {
  name                    = "my-custom-mode-network"
  auto_create_subnetworks = false
  mtu                     = 1460
}

resource "google_compute_subnetwork" "default" {
  name          = "my-custom-subnet"
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-west1"
  network       = google_compute_network.vpc_network.id
}

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"]

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

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

  network_interface {
    subnetwork = google_compute_subnetwork.default.id

    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       = google_compute_network.vpc_network.id
  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 を実行します。

    python3 app.py
    

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

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

    1. [VM インスタンス] ページに移動します。
    2. flask-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 = google_compute_network.vpc_network.id

  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」と入力します。

次のステップ