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