AWS Lambda がコンテナイメージをサポートするようになりましたが、Terraform で Lambda のリソースを定義するのにてこづったので書き方を残しておきます。
動作確認時のソフトウェア
- awscli 2.1.11
- terraform 0.14.2
- terraform-provider-aws 3.21.0
Terraform の書き方
Lambda のリソースを作るときに ECR にイメージがすでにある必要があるので、Lambda を作る前に ECR のリポジトリと Lambda で使う IAM を作っておきます。 ECR リポジトリができたら Docker image を push しておきます。
resource "aws_lambda_function" "lambda_container" { function_name = "lambda_container" role = aws_iam_role.lambda_container.arn package_type = "Image" image_uri = "${aws_ecr_repository.lambda_containter.repository_url}:latest" timeout = 60 lifecycle { ignore_changes = [image_uri] } } resource "aws_iam_role" "lambda_container" { ... } resource "aws_ecr_repository" "lambda_containter" { ... }
Terraform で Lambda を作るときは package_type = "Image"
にし、image_uri
に ECR にイメージ URI をタグを含めて指定します。
Lambda 関数を update するとそのたびに Terraform で差分が出てしまうので ignore_changes
に image_uri
を入れておくと良いです。
Terraform の公式ドキュメントを見ると handler
が Required になっていますが、package_type
を Image
にした場合は不要です。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function
実際に使用したコード github.com