terraform apply
コマンドの中でECRのリポジトリを作成し、docker build & pushまで実行してしまうサンプルです。
Terraformのファイル本体は以下の通りです。
ECRのリポジトリ作成のほかに null_resource
というリソースでスクリプトを実行しています。スクリプトの中身は後述しますが、単にDocker build & pushしているだけのスクリプトです。Dockerイメージ作成時に依存するファイルが変更されたときにのみ実行されるよう triggers
を指定するのがポイントです。
variable aws_profile {}
variable aws_region {}
variable ecr_repository_name {}
terraform {
backend "s3" {
}
}
provider "aws" {
profile = var.aws_profile
region = var.aws_region
}
################################################################################
# ECR
################################################################################
resource "aws_ecr_repository" "default" {
name = var.ecr_repository_name
force_delete = true # terraform destroyしたときにリポジトリが削除されるように
}
################################################################################
# docker build & push
################################################################################
resource "null_resource" "default" {
triggers = {
file_content_sha1 = sha1(join("", [for f in ["build-docker.sh", "Dockerfile"]: filesha1(f)]))
}
provisioner "local-exec" {
# docker build & push
command = "sh ./build-docker.sh"
}
}
################################################################################
Terraformの変数定義は、AWS環境の指定やECRリポジトリ名を以下のように書きます。
aws_profile="default"
aws_region="ap-northeast-1"
ecr_repository_name="sample"
Docker build & pushしているスクリプトの中身は以下の通りです。手抜きのため、環境に依存するパラメータを上記 terraform.tfvars
から直接読み込んでいます。 tfvars
ファイルをシェルスクリプトファイルとみなして読み込ませる反則技です。Terraformのファイルから環境変数を通してパラメータを渡すこともできますが、 build-docker.sh
を単独で実行できるようにするためです。
#!/bin/bash
. ./terraform.tfvars
aws_account_id=$(aws --profile $aws_profile sts get-caller-identity --query 'Account' --output text)
# Docker login
aws --profile $aws_profile --region $aws_region ecr get-login-password | docker login --username AWS --password-stdin $aws_account_id.dkr.ecr.$aws_region.amazonaws.com
# Build image
docker build -t $aws_account_id.dkr.ecr.$aws_region.amazonaws.com/$ecr_repository_name .
# Push image
docker push $aws_account_id.dkr.ecr.$aws_region.amazonaws.com/$ecr_repository_name
※Dockerfileも同じディレクトリに置き、 docker build
できることが前提です。