AWS SAM CLI での Terraform のサポートの準備 - AWS Serverless Application Model

AWS SAM CLI での Terraform のサポートの準備

このトピックでは、Terraform との AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) の使用を開始する方法について説明します。

フィードバックや機能に関する要望を送るには、GitHub Issue を作成してください。

AWS SAMCLITerraform の前提条件

Terraform プロジェクトで AWS SAM CLI を使い始めるには、すべての前提条件を満たしてください。

  1. AWS SAM CLI をインストールまたはアップグレードする

    AWS SAM CLI がインストールされているかを確認するには、次のコマンドを実行します。

    $ sam --version

    AWS SAM CLI がインストールされている場合は、出力にバージョンが表示されます。最新バージョンにアップグレードするには、「AWS SAM CLI のアップグレード」 を参照してください。

    AWS SAM CLI のインストール手順とインストールに必要な前提条件については、「AWS SAM CLI のインストール」を参照してください。

  2. Terraform をインストールする

    Terraform がインストールされているかを確認するには、次のコマンドを実行します。

    $ terraform -version

    Terraform をインストールするには、Terraform レジストリで「Install Terraform」を参照してください。

  3. ローカルテスト用の Docker のインストール

    AWS SAM CLI でローカルテストを実行するには Docker が必要です。Docker をインストールするには、「AWS SAM CLI で Docker を使用するためのインストール方法」を参照してください。

Terraform と連携させた AWS SAM CLI

サポートされている AWS SAM CLI コマンドを実行するときは、--hook-name オプションを使用して terraform 値を指定します。以下に例を示します。

$ sam local invoke --hook-name terraform

このオプションは AWS SAM CLI 設定ファイルで次のように設定できます。

hook_name = "terraform"

Terraform プロジェクト用のセットアップ

AWS SAM CLI と Terraform プロジェクトを使用するには、このトピックの手順を実行してください。

Terraform プロジェクトの外部で AWS Lambda アーティファクトをビルドする場合、追加の設定は必要ありません。AWS SAM CLI の使用を開始するには、「Terraform と連携させた AWS SAM CLI をローカルでのデバッグおよびテストに使用する方法」を参照してください。

Terraform プロジェクト内の Lambda アーティファクトをビルドするには、以下の操作を実行する必要があります。

  1. Python 3.8 以降のインストール

  2. Make ツールをインストールします。

  3. Terraform プロジェクト内で Lambda アーティファクトのビルドロジックを定義します。

  4. ビルドロジックの AWS SAM CLI を通知する sam metadata リソースを定義します。

  5. AWS SAM CLI sam build コマンドを使用して Lambda アーティファクトを構築します。

Python 3.8 以降のインストール

AWS SAM CLI で使用するには Python 3.8 以降が必要です。sam build を実行すると、AWS SAM CLI が Lambda アーティファクトを構築する Python コマンドを含む makefiles を作成します。

インストール手順については、Python の「Beginners Guide」にある「Downloading Python」を参照してください。

次を実行して、Python 3.8 以降がマシンのパスに追加されていることを確認します。

$ python --version

出力に 3.8 以降のバージョンの Python が表示される必要があります。

Make ツールをインストールする

GNU Make は、プロジェクトの実行ファイルやその他の非ソースファイルの生成を制御するツールです。AWS SAM CLI は このツールに依存して Lambda アーティファクトを構築する makefiles を作成します。

Make をローカルマシンにまだインストールしていない場合は、先に進む前にインストールしてください。

Windows の場合は、Chocolatey を使用してインストールできます。手順については、「How to Install and Use "Make" in Windows」の「Using Chocolatey」を参照してください。

Lambda アーティファクトのビルドロジックを定義する

null_resource Terraform リソースタイプを使用して Lambda ビルドロジックを定義します。以下は、カスタムビルドスクリプトを使用して Lambda 関数を構築する例です。

resource "null_resource" "build_lambda_function" { triggers = { build_number = "${timestamp()}" } provisioner "local-exec" { command = substr(pathexpand("~"), 0, 1) == "/"? "./py_build.sh \"${local.lambda_src_path}\" \"${local.building_path}\" \"${local.lambda_code_filename}\" Function" : "powershell.exe -File .\\PyBuild.ps1 ${local.lambda_src_path} ${local.building_path} ${local.lambda_code_filename} Function" } }

sam metadata リソースを定義します。

sam metadata リソースは、Lambda アーティファクトを見つけるために必要な情報を AWS SAM CLI に提供する null_resource Terraform リソースタイプです。プロジェクト内の Lambda 関数またはレイヤーごとに固有の sam metadata リソースが必要です。このリソースタイプの詳細については、Terraform レジストリで「null_resource」を参照してください。

sam metadata リソースを定義します。
  1. リソースには sam_metadata_ で始まる名前を付けます。sam metadata リソースとして認識できるようにするためです。

  2. リソースの triggers ブロック内で Lambda アーティファクトプロパティを定義します。

  3. Lambda ビルドロジックを含む null_resourcedepends_on 引数で指定します。

    以下はテンプレートの例です。

    resource "null_resource" "sam_metadata_..." { triggers = { resource_name = resource_name resource_type = resource_type original_source_code = original_source_code built_output_path = built_output_path } depends_on = [ null_resource.build_lambda_function # ref to your build logic ] }

    以下に、sam metadata リソースの例を示します。

    resource "null_resource" "sam_metadata_aws_lambda_function_publish_book_review" { triggers = { resource_name = "aws_lambda_function.publish_book_review" resource_type = "ZIP_LAMBDA_FUNCTION" original_source_code = "${local.lambda_src_path}" built_output_path = "${local.building_path}/${local.lambda_code_filename}" } depends_on = [ null_resource.build_lambda_function ] }

sam metadata リソースの細部は、Lambda リソースタイプ (関数またはレイヤー) やパッケージタイプ (ZIP またはイメージ) によって異なります。SSML の詳細と例については、「sam metadata resource」を参照してください。

sam metadata リソースを設定し、サポートされている AWS SAM CLI コマンドを使用すると、 AWS SAM CLI は AWS SAM CLI コマンドを実行する前にメタデータファイルを生成します。このファイルを生成したら、今後の AWS SAM CLI コマンドで --skip-prepare-infra オプションを使用することで、メタデータの生成プロセスをスキップして時間を節約できます。このオプションは、インフラストラクチャに新しい Lambda 関数や新しい API エンドポイントの作成などの変更を加えていない場合にのみ使用してください。

AWS SAM CLI を使用して Lambda アーティファクトを構築します。

AWS SAM CLI sam build コマンドを使用して Lambda アーティファクトを構築します。sam build を実行すると、AWS SAM CLI が次のことをします。

  1. Terraform プロジェクト内の sam metadata リソースを探して、Lambda リソースについて調べたり、見つけたりします。

  2. Lambda ビルドロジックを開始して Lambda アーティファクトを構築します。

  3. AWS SAM CLI sam local コマンドで使用する Terraform プロジェクトを整理する .aws-sam ディレクトリを作成します。

サムビルドでビルドするには
  1. Terraform ルートモジュールを含むディレクトリから、以下の操作を実行する。

    $ sam build --hook-name terraform
  2. 特定の Lambda 関数または Layer を構築するには、以下を実行します。

    $ sam build --hook-name terraform lambda-resource-id

    許容される ID は、Lambda 関数名または完全な Terraform リソースアドレス (aws_lambda_function.list_books または module.list_book_function.aws_lambda_function.this[0] など) です。

関数のソースコードやその他の Terraform 設定ファイルが Terraform ルートモジュールを含むディレクトリの外部にある場合は、その場所を指定する必要があります。--terraform-project-root-path オプションを使用して、これらのファイルを含む最上位ディレクトリへの絶対パスまたは相対パスを指定します。以下に例を示します。

$ sam build --hook-name terraform --terraform-project-root-path ~/projects/terraform/demo

コンテナを使用したビルド

AWS SAM CLI sam build コマンドを実行すると、ローカルの Docker コンテナを使用してアプリケーションをビルドするように AWS SAM CLI を設定できます。

注記

Docker がインストールされ、設定されている必要があります。手順については、「AWS SAM CLI で Docker を使用するためのインストール方法」を参照してください。

コンテナを使用してビルドするには
  1. Terraform、Python、および Make ツールを含む Dockerfile を作成します。Lambda 関数ランタイムも含める必要があります。

    次に Dockerfile の例を示します。

    FROM public.ecr.aws/amazonlinux/amazonlinux:2
    
    RUN yum -y update \
        && yum install -y unzip tar gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \
        less libcurl-devel openssl openssl-devel readline-devel xz-devel \
        zlib-devel glibc-static libcxx libcxx-devel llvm-toolset-7 zlib-static \
        && rm -rf /var/cache/yum
    
    RUN yum -y install make \
        && yum -y install zip
    
    RUN yum install -y yum-utils \
        && yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo \
        && yum -y install terraform \
        && terraform --version
    
    # AWS Lambda Builders
    RUN amazon-linux-extras enable python3.8
    RUN yum clean metadata && yum -y install python3.8
    RUN curl -L get-pip.io | python3.8
    RUN pip3 install aws-lambda-builders
    RUN ln -s /usr/bin/python3.8 /usr/bin/python3
    RUN python3 --version
    
    VOLUME /project
    WORKDIR /project
    
    ENTRYPOINT ["sh"]
  2. docker build を使用して Docker イメージをビルドします。

    以下に例を示します。

    $ docker build --tag terraform-build:v1 <path-to-directory-containing-Dockerfile>
  3. --use-container--build-image オプションを指定して AWS SAM CLI sam build コマンドを実行します。

    以下に例を示します。

    $ sam build --use-container --build-image terraform-build:v1

次のステップ

Terraform プロジェクトで AWS SAM CLI を使い始めるには、「Terraform と連携させた AWS SAM CLI をローカルでのデバッグおよびテストに使用する方法」を参照してください。

Terraform Cloud のセットアップ

Terraform v1.6.0 以降を使用することをお勧めします。古いバージョンを使用している場合は、Terraform プランファイルをローカルで生成する必要があります。ローカルプランファイルは、ローカルでのテストとデバッグを実行するために必要な情報を AWS SAM CLI に提供します。

ローカルプランファイルを生成するには
注記

Terraform v1.6.0 以降のバージョンでは、これらの手順は不要です。Terraform Cloud と連携させた AWS SAM CLI の使用を開始するには、「Terraform と連携させた AWS SAM CLI を使用する」を参照してください。

  1. API トークンの設定 — トークンのタイプはアクセスレベルによって異なります。詳細については、「Terraform Cloud ドキュメント」で「API Tokens」を参照してください。

  2. API トークンの環境変数を設定する — 以下はコマンドラインからの例です。

    $ export TOKEN="<api-token-value>"
  3. 実行 ID の取得 — Terraform Cloud コンソールから、AWS SAMCLI で使用したい Terraform ランの実行 ID を探します。

    実行 ID は実行のブレッドクラムパスにあります。

    実行 ID が表示される Terraform Cloud のブレッドクラムパス。
  4. プランファイルの取得 — API トークンを使用して、ローカルのプランファイルを取得します。コマンドからの出力例を次に示します。

    curl \ --header "Authorization: Bearer $TOKEN" \ --header "Content-Type: application/vnd.api+json" \ --location \ https://app.terraform.io/api/v2/runs/<run ID>/plan/json-output \ > custom_plan.json

これで、Terraform Cloud と連携させた AWS SAM CLI の使用の準備ができました。サポートされている AWS SAM CLI コマンドを使用するときは、--terraform-plan-file オプションを使用してローカルプランファイルの名前とパスを指定します。以下に例を示します。

$ sam local invoke --hook-name terraform --terraform-plan-file custom-plan.json

以下は sam local start-api を使用したコマンドの例です。

$ sam local start-api --hook-name terraform --terraform-plan-file custom-plan.json

これらの例で使用できるサンプルアプリケーションについては、aws-samples GitHub リポジトリで「api_gateway_v2_tf_cloud」を参照してください。

次のステップ

Terraform Cloud と連携させた AWS SAM CLI の使用を開始するには、「Terraform と連携させた AWS SAM CLI をローカルでのデバッグおよびテストに使用する方法」を参照してください。