AWS Lambda をコンテナイメージで動かすときの Terraform の書き方

AWS Lambda がコンテナイメージをサポートするようになりましたが、Terraform で Lambda のリソースを定義するのにてこづったので書き方を残しておきます。

aws.amazon.com

動作確認時のソフトウェア

  • 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_changesimage_uri を入れておくと良いです。

Terraform の公式ドキュメントを見ると handler が Required になっていますが、package_typeImage にした場合は不要です。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function

実際に使用したコード github.com