S3へのコードのアップロードを検知してCodeBuildを実行するCodePipelineの作成

## 記事の概要
本記事では以下の構成となるようAWSリソースを作成していきます。  

![image (3)-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/9d5ee287-41a0-d8ca-0d76-c9ea30417434.png)


以下の記事で、S3に配置したソースコードからDockerイメージを作成し、ECRへpushする部分をCodeBuidで自動化しました。  
[DockerイメージのビルドとAmazon ECRへのプッシュをCodeBuildで自動化する](https://qiita.com/e52yamada/items/9ef696737d20285c7498)

この状態だと、S3にzip化したソースコードをアップロードした後、逐一CodeBuildプロジェクトを実行する必要があります。本記事では、S3へのアップロードを検知したら自動でCodeBuildプロジェクトを実行するようにCodePipelineを設定するまでの手順を紹介します。

## 作成済みリソースの変更
CodePipelineでS3へのソースコードのアップロードを検知し、CodeBuildの実行をするにあたって、S3とCodeBuildをそれぞれ変更する必要があります。
### S3バージョニングの有効化
下記のとおり、CodePipelineのソースにS3を指定する場合、S3のバージョニングを有効化する必要があります。
> 注記
ソースバケットを作成するときは、バケットでバージョニングを有効にしてください。  
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/action-reference-S3.html

バージョニングを有効化していない場合は、該当のS3バケットの「プロパティ」タブから変更します。  

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/7cce57f0-1b2b-2cd9-ad25-096c23f9b239.png)  

- バケットのバージョニングで「編集」ボタンをクリックし、バケットのバージョニングを「有効にする」を選択

![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/96845e92-8399-b794-65ce-68d3f75d4f4c.png)


### ソースコードをzip化する
CodePipelineでは、必要なソースコードをzipで圧縮する必要があります。今回は、`app.py` と `Dockerfile` , `buildspec.yml` の3つのファイルを圧縮して再アップロードします。  

### Codebuildの変更
ソースコードのzip化に合わせて、CodeBuildプロジェクトのソースの設定を変更します。
- ビルドプロジェクトを開いて「編集」ボタンをクリックし、「ソース」セクションで「S3 オブジェクトキーまたは S3 フォルダ」にアップロードするzipファイルの名前を入力  

![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/fdf5314c-1c3d-88fa-dbf1-3a1435ac11a7.png)

## CodePipelineの設定
今回は、ソースコードの置き場などを設定する「ソースステージ」と、Codebuildで行っていた「ビルドステージ」の2つを設定します。デプロイステージの作成はスキップします。
### ソースステージの設定
- CodePipelineの画面で「パイプラインを作成する」ボタンをクリック
-  Create optionsは「Build custom pipeline」を選択

![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/0d37cd2f-931f-e7b8-ea29-da1a746ce735.png)

- パイプライン名は任意の値を入力し、他はデフォルトの設定のままにする
- ソースの設定で、ソースプロバイダーは「Amazon S3」を選択し、S3の構成に従って「バケット」と「S3 オブジェクトキー」を入力する。検出オプションは「Amazon CloudWatch Events (推奨)」を選択  

:::note info   
S3 オブジェクトキーには、アップロードするzipファイル名まで含めること  
:::  

![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/fe2c9cda-dc07-ac54-1b3d-df6e175e29f0.png)

### ビルドステージの設定  
- ビルドのプロバイダーは「Other build providers」を選択し、「AWS CodeBuild」を指定して、プロジェクト名に作成済みのビルドプロジェクトを指定する  

![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/cc08d4f2-95c6-a733-75d9-a807809f14b6.png)

- デプロイステージは追加しないため、「スキップする」ボタンをクリックしてパイプラインを作成する  

パイプラインが作成されると同時に、実行されます。  

![image (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/afa62d30-f2af-3534-c9e8-3fd1923e2f83.png)

## 動作確認  
S3の指定したパスに、指定したファイルをアップロードする(今回だと、`<s3バケット名>/build-resource` に `artifact.zip` をアップロードする)と、自動でパイプラインのなかでビルドプロジェクトが実行されます。

パイプラインの実行が成功したら、ビルドプロジェクトが実行され、buildspecで指定したECRに新しいイメージが追加されているはずなので、それぞれ確認してみましょう。  

- パイプライン

![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/82e692e4-390d-a9de-3751-c018aae1a358.png)


- ビルドプロジェクト  

![image (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261789/debd2f61-af04-4a3b-95c6-e14804e462d2.png)

---
この記事はここまでとなります。

#### Next:  
ここまでの設定内容をIaCで実装する▼  
[CDKで一発作成！S3→Codebuild→ECRでDockerイメージをpushするCodePipeline](https://qiita.com/e52yamada/items/5af111df7c3890bc364a#cdk%E3%82%B3%E3%83%BC%E3%83%89)