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

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

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

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

費用

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

Compute Engine

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

新規の Trusted Cloud ユーザーは無料トライアルをご利用いただける場合があります。

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

始める前に

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

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

  1. In the Trusted Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Trusted Cloud project.

権限を設定する

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

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

IAM ページに移動

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

API を有効にする

  • Enable the Compute Engine API.

    Enable the API

  • gcloud CLI をインストールする

    ローカル開発環境から Terraform を使用するには、Google Cloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. gcloud CLI をインストールします。
    2. gcloud CLI を初期化します。
      gcloud init
    3. アカウントのローカル認証情報を作成します。
      gcloud auth application-default login

    Compute Engine VM を作成する

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

    ディレクトリを作成する

    新しいディレクトリを作成します。 新しいディレクトリに、Terraform 構成用の main.tf ファイルを作成します。このファイルには、プロジェクト内に作成するすべての Trusted 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
        }
      }
    }

    サンプルコードでは、 Trusted 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 が Trusted Cloud API を呼び出して新しい VM を設定します。[VM インスタンス] ページで、新しい VM を確認します。

    Trusted 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 を開いている必要があります。 Trusted 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"]
    }

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