Lambdaのカスタムランタイム(package_type = "Image")をTerraformで書く場合、image_uriにECRのリポジトリURLを指定する必要があります(Public ECRはエラーで弾かれる..)
この時、当然ECRもTerraformで書きたくなりますがLambdaの構築を行う前にイメージがないのでどうするのかと疑問でした。
どうやらTerraformのnull_resourceを使うと良いようです。
まずリポジトリ。
ecr.tf
resource "aws_ecr_repository" "example-ecr-repository" {
name = "${terraform.workspace}-example-repository"
}
M1 Macの場合、ビルド時に--platform amd64 を付けろとの先人達の教えが。
local.tf
resource "null_resource" "example-local-apply" {
provisioner "local-exec" {
command = "aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${aws_ecr_repository.example-ecr-repository.repository_url}"
}
provisioner "local-exec" {
command = "docker build --platform amd64 . -t ${aws_ecr_repository.example-ecr-repository.repository_url}"
}
provisioner "local-exec" {
command = "docker push ${aws_ecr_repository.example-ecr-repository.repository_url}"
}
}
lambda.tf
aws_lambda_functionに下記を追加します
depends_on = [
null_resource.example-local-apply,
]
これで初回apply時は突破できるようになりました。
ただビルド用のCIは結局必要になるケースが多いと思うので、あんまりスッキリしないですかね。個人開発だとローカルでビルドすればコスト削減になるのでちょっぴりメリットあるけど。
Lambdaのカスタムランタイムはこちらを参照。