AWS CodePipelineのコンテナビルドが簡単に！？

## はじめに
こんにちは、株式会社ディーネットの大向井です。
本記事はJapan AWS Top Engineers Advent Calendar 2024の23日目の記事です。

この時期はre:Invent2024での画期的なアップデートに目が向きがちですが、折角なので確実に便利になっていて地味に嬉しいやつを拾っていきます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-codepipeline-publishing-ecr-image-aws-inspectorscan-actions/

CodePipelineでコンテナイメージのビルドとECRへの公開が自動でできるようになりました。
（Inspectorの方はこの記事では触れないので注意）

これまでもCodeBuildを使えばできましたがCodeBuildすらも要らなくなって簡単になっていますので紹介します！！

## これまでのやりかた

これまではどうやっていたかと言うと、CodeBuildでビルドしてECRにプッシュするパターンが一般的かと思います。
例としては以下のようなbuildspecを用意してその中でコンテナイメージのビルドやECRへのプッシュをコマンドラインで定義します（実際の運用方法とか対象とかで変わると思いますが一番シンプルな感じで記載）。

```
version: 0.2
phases:
  pre_build:
    commands:
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {ECRのURI}
      - REPOSITORY_URI={ECRリポジトリのURI}

  build:
    commands:         
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest

  post_build:
    commands:
      - docker push $REPOSITORY_URI:latest
```

この程度の内容であればこれ、もう要らないんですよ。

## アップデートについて

CodePipelineのアクションとして「ECRBuildAndPublish」というアクションが追加されました。
このアクション一つでコンテナイメージのビルドとECRへの公開をパパっとやってくれるようになるのでただコンテナイメージをビルドするだけならCodeBuildは要らなくなります。

### 必要な対応

以下の対応が必要です。

- CodePipelineのパイプラインにアクションを追加、設定
- CodePipelineで利用するIAMロールに必要な権限を設定

まずアクションの設定ですがアクションプロバイダーに「ECRBuildAndPublish」を設定して、入力アーティファクト、対象のECRリポジトリ、設定するタグ、Dockerfileのパス、環境変数を指定するだけです。
簡単ですね。

IAM権限については内容自体は基本的にCodeBuildで実施する場合と同じです。
CodePipelineのロールに権限を設定する必要がある点は注意です。

必要な権限は以下のドキュメントに記載があります。これに追加して「ecr:DescribeRepositories」も必要です。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-push-iam.html

## やってみた

最後にやってみたと称してスクショで操作イメージを共有します。

### ソースリポジトリ
まずは今は亡きCodeCommitに適当なリポジトリを作ってソースをプッシュします。

![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/895f7ba5-8303-2f65-859e-c6a39b4a966b.png)

プロジェクト直下にDockerfileを置いています。

### ECRリポジトリ

公開先のコンテナイメージリポジトリとしてECRリポジトリを作成します。
現時点では空です。

![ecr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/21193e32-4c00-41fb-6610-36026c79bc66.png)

### パイプライン

CodeCommitをソースとしてパイプラインを作成しました。
「ECRBuildAndPublish」アクションの設定はこんな感じになっています。

![buildandpublish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/9000bff3-c226-d140-bcc3-121eadf55634.png)

プロジェクト直下にDockerfileがない場合はパスを指定する必要があるので注意です。

これを実行します。
パイプラインの実行に成功しました。

![pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/0fdc12c2-a10c-12ec-d7d9-7f05bc53f5b7.png)

余談ですが最初はベースのイメージとしてDockerHubからコンテナイメージをプルするようにしていましたが、リクエスト数制限による接続IPガチャで検証が進まなくなってしまったのでECR Public Galleryからプルするように変更しました。
CodeBuildでやってたときより大変かも。

閑話休題、パイプラインの実行が完了して、無事にコンテナイメージもECRに登録されています。

![ecr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/b55aa361-ed5d-81be-8ebe-e71f51af2a52.png)

ここまで圧倒的スピード感で出来ました。

最後にApp Runnerからコンテナの動作確認をして締めとします。

![santa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735397/4a96fdba-397c-cb5b-b2ad-1ba0df17c7a6.png)


サ、サンタさん……顔が……！！

## おわりに

buildspecを書かなくてもコンテナのビルドできるようになったのは地味に嬉しいですね。
私が初めて触ったときは書き方も全然分からないしbuildspecとappspecって何が違うのみたいな感じだったので初学者さん的にもよりコンテナ開発がやりやすくなったのかなと思いました。

以上、ありがとうございましたー。