ECRのイメージをプルするCodebuildをTerraformで作る


はじめに

ECRに保存しているイメージをCodebuildで使用したかったので、その設定をTerraformでやってみました。
Terraformを使用したからといって特別なことをやっているわけではありませんが、備忘録として。

環境

  • Terraform : 0.12.29
  • Terraform aws provider : 3.3.0

ECRリポジトリ

以下のようなECRリポジトリを作成します。
このリポジトリにCodebuildで動かすイメージを保存していきます。

resource "aws_ecr_repository" "example" {
  name                 = "example"
  image_tag_mutability = "MUTABLE"

  image_scanning_configuration {
    scan_on_push = true
  }
}

公式のガイドを参考に、CodebuildからイメージをプルできるECRのポリシーを設定します。

AWS ECRサンプル

 [アクション] で、プル専用アクションとして [ecr:GetDownloadUrlForLayer]、[ecr:BatchGetImage]、および [ecr:BatchCheckLayerAvailability] を選択します。

また、今回はCodebuildとECRリポジトリでクロスアカウントを行わないので

 プロジェクトで CodeBuild の認証情報を使用して Amazon ECR のイメージをプルする場合は、[サービスプリンシパル] に「codebuild.amazonaws.com」と入力します。

以上を参考にTerraformでポリシーを書くとこうなります。

resource "aws_ecr_repository_policy" "example" {
  repository = aws_ecr_repository.example.name

  policy = data.aws_iam_policy_document.example.json
}

data "aws_iam_policy_document" "example" {
  statement {

    actions = [
      "ecr:BatchCheckLayerAvailability",
      "ecr:BatchGetImage",
      "ecr:GetDownloadUrlForLayer"
    ]

    principals {
      type        = "Service"
      identifiers = ["codebuild.amazonaws.com"]
    }
  }
}

ECRリポジトリの設定は以上です。

Codebuildプロジェクト

今回は、ECRからのプルを検証することが目的なのでシンプルなプロジェクトを作成します。

ECRの方でCodebuildの認証情報を用いてプルするようにしたので
image_pull_credentials_type = "CODEBUILD"を設定する必要があります。
特に指定しない場合、デフォルトでCODEBUILDが設定されるようですがここでは明示的に
設定しています。

Terraform codebuild_project image_pull_credentials_type

resource "aws_codebuild_project" "example" {
  name          = "example-project"
  description   = "example-project"
  service_role  = aws_iam_role.this.arn

  artifacts {
    type = "NO_ARTIFACTS"
  }

  environment {
    compute_type                = "BUILD_GENERAL1_SMALL"
    image                       = "{ECRリポジトリー内のイメージURI}"
    type                        = "LINUX_CONTAINER"
    image_pull_credentials_type = "CODEBUILD"
  }

  source {
    type            = "GITHUB"
    location        = "{ビルドに使用するGitリポジトリのURL}"
    git_clone_depth = 1
  }
}

ECR側でプルを許可しているため、Codebuildのにアタッチするポリシーは
ログの作成に関わるものだけでいいみたいです。

resource "aws_iam_role_policy" "example" {
  name = "example"
  role = aws_iam_role.this.id
  policy = data.aws_iam_policy_document.example.json
}

data "aws_iam_policy_document" "example" {
  statement {

    actions = [
      "logs:CreateLogStream",
      "logs:PutLogEvents"
    ]

    resources = [
      "*",
    ]

  }
}

これらの設定でECRのイメージを使用してビルドができます。

Codebuild側にもプルするために権限が必要だと思っていたのですが、
不要だったみたいです。