はじめに
SREエンジニアやってます。@hayaosatoです。
今回はAWS ECR(以下、ECR)でのリポジトリ作成をTerraformで作成した際に、その勢いでコンテナイメージのpushまでやっちゃおうという小ネタです。
terraform及びプロバイダのバージョンは以下の通りです。
Terraform v0.12.12
+ provider.aws v2.40.0
+ provider.null v2.1.2
ECR
ECRのリポジトリ作成のTerraformは簡単で、Terraformのリソースの中でもArgumentは非常に少ないです。
リポジトリは以下のように作成できます。
resource "aws_ecr_repository" "default" {
name = var.image_name
image_tag_mutability = "MUTABLE"
image_scanning_configuration {
scan_on_push = true
}
}
image_scanning_configuration
でコンテナイメージのセキュリティ診断も行ってくれるようなので有効にしておくと良いと思います。
コンテナイメージのpush
ここからが本題です。
上記のように作成したECRリポジトリにterraform apply
の際に同時にコンテナイメージをpushしてしまいましょう。
ECRへのpushコマンドは以下のようになっています。
$(aws ecr get-login --no-include-email --region ${リージョン})
docker build -t ${コンテナイメージ名} ${Dockerfileのディレクトリ}
docker tag ${コンテナイメージ名}:latest ${リポジトリURL}
docker push ${リポジトリURL}
terraformでは、このようなコマンド実行はprovisioningで実行すると良いのですが、ECRリソースにはprovisionerが提供されていません。
そこで、そのような場合にはnull_resource
というリソースを使うことで任意のコマンドをterraform apply
時に実行することができます。
コンテナイメージのpushコマンドをterraformで実現すると以下のようになります。
resource "null_resource" "default" {
provisioner "local-exec" {
command = "$(aws ecr get-login --no-include-email --region ${var.region})"
}
provisioner "local-exec" {
command = "docker build -t ${var.image_name} ${var.docker_dir}"
}
provisioner "local-exec" {
command = "docker tag ${var.image_name}:latest ${aws_ecr_repository.default.repository_url}"
}
provisioner "local-exec" {
command = "docker push ${aws_ecr_repository.default.repository_url}"
}
}
最後に
このように、ECRのリポジトリを作成してその流れでコンテナイメージのビルド&プッシュも実現しました。
現実的に使うかは別として、Fargateとか作成するときにちょっとだけ使えるんじゃないかな。。。と思っています。