2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TerraformでECRのリポジトリを作成しdocker build & pushする

Last updated at Posted at 2023-05-24

terraform applyコマンドの中でECRのリポジトリを作成し、docker build & pushまで実行してしまうサンプルです。

Terraformのファイル本体は以下の通りです。

ECRのリポジトリ作成のほかに null_resource というリソースでスクリプトを実行しています。スクリプトの中身は後述しますが、単にDocker build & pushしているだけのスクリプトです。Dockerイメージ作成時に依存するファイルが変更されたときにのみ実行されるよう triggers を指定するのがポイントです。

main.tf
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リポジトリ名を以下のように書きます。

terraform.tfvars
aws_profile="default"
aws_region="ap-northeast-1"
ecr_repository_name="sample"

Docker build & pushしているスクリプトの中身は以下の通りです。手抜きのため、環境に依存するパラメータを上記 terraform.tfvars から直接読み込んでいます。 tfvars ファイルをシェルスクリプトファイルとみなして読み込ませる反則技です。Terraformのファイルから環境変数を通してパラメータを渡すこともできますが、 build-docker.sh を単独で実行できるようにするためです。

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 できることが前提です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?