github enterprise × codebuild でビルドプロセスを自動化する -前編-

## はじめに
先日実施した開発で、githubへのpushをトリガーに、awsのECRを自動で更新するパイプラインをを作成したので、そちらについて記載します。

この設定を行うことで、ローカルでdockerファイル上のコードを修正しgithubにpushした際、自動でECRに反映されるようになります！
また、ECRのイメージを使用しているlambdaも自動で最新のイメージでビルドされるように設定することが可能です。

前編ではECRをアップデートする部分まで記載します。
後編では、ECRがアップデートされたタイミングで、lambdaのイメージも自動で最新化される設定方法を記載します。

## アーキテクチャ概要
Lambdaを使用する際、ローカルでzipしたものをアップロードするのが一般的です。
しかし、Dockerを使用することにより、メンバーの環境を同じに揃えることができます。
そのため、PCの種類や、言語のバージョン、pipなど、ローカルの環境に依存せずチーム開発を行うことができます！
また、awsから動かすときなども、移行がしやすい設計にすることが可能です！

![スクリーンショット 2023-10-15 23.24.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351273/023e22be-9422-7020-e052-8507b0fcccb3.png)

※前提として、github上ではリポジトリの作成や設定がされているものとします。

## 実装方法
### ECR
コンソールから、リポジトリを作成（プライベートでOK）します。
特に特殊な設定はないです！
### codebuild
ビルドプロジェクトを作成します。
* ソースプロバイダをgithub Enterpriseに設定
    * アクセストークンを未設定の場合は、アクセストークンを発行し保存することで、githubと接続する
        * プロフィール
        * settings
        * developer settings
        * personal access token
        * generate new token
* リポジトリのURLを入力
    * https://github.xxx.com/プロジェクト名/リポジトリ名 みたいなやつです
* ウェブフックの設定
    * 「コードの変更がこのリポジトリにプッシュされるたびに再構築する」にチェック
    * ビルドタイプを単一ビルドに設定
    * イベントタイプで「プッシュ」を選択
    * HEAD_REFにブランチ名を設定することで、そのリポジトリの対象ブランチが最新化された際にビルドを実行させるようにも設定可能です！
    * ウェブフックの作成を実施すると、下記の情報が表示されるので、メモしておきます
        * payload URL
        * シークレットキー

![スクリーンショット 2023-10-09 15.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351273/be2c694c-4aab-dc8d-8aeb-b724d9a119fa.png)
* 環境イメージを「マネージド型イメージ」に設定
* OSなどはお好きなものを、下記は私が実行したときに使用した例です！
![スクリーンショット 2023-10-09 15.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351273/aa881ee3-8776-39d9-8151-589df299bc01.png)
* サービスロールは別途適切なロールを設定し、codebuildに付与してください！
* 追加設定 >> 環境変数で、buildの設定に使用した環境変数を設定
    * buildspec.ymlの変数を入れる
    * 下記のbuildspec.ymlに出てくるREPOの中身
        * < account-id >.dkr.ecr.ap-northeast-1.amazonaws.com/< リポジトリ名 >
    * DIRECTORYには、docker-compose.ymlでargsに指定した値を設定
![スクリーンショット 2023-10-15 22.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351273/fc03c85c-9019-9b86-93c4-44fd0af56114.png)


### ビルドの設定
```dockerfile:buildspec.yml
version: 0.2

phases:
  build:
    commands:
      - echo Build started on `date`
      - echo Building Docker image
      - docker build -t $REPO . --build-arg DIRECTORY=$DIRECTORY
      - echo Logging in to Amazon ECR
      - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $REPO
      - echo Pushing Docker image to ECR
      - docker push $REPO:latest
  post_build:
    commands:
      - echo Build completed on `date`
```

```dockerfile:Dockerfile
FROM public.ecr.aws/lambda/python:3.10

# ビルド変数の受け取り
ARG DIRECTORY

# requirement.txtに記載したライブラリインストール
COPY ./src/${DIRECTORY}/requirements.txt ./
RUN pip install -r requirements.txt

# コードコピー
COPY ./src/${DIRECTORY} ${LAMBDA_TASK_ROOT}

CMD [ "main.handler" ]
```

### github
webhookを許可する設定をします。
github Enterprise >> Setting >> Hooks >> Add webhook
* codebuildでwebhookを設定した際に出てきたPayload URLとシークレットを入力
* Content typeを「application/json」に設定
* 「Just the push event.」を選択
* Activeのチェックボックスにチェックしてwebhookを追加

ここまで設定が完了したら、github上のリポジトリの特定のブランチにpushされると、自動でcodebuildが実行され、ECRのリポジトリが最新化されます！
### lambda
dockerファイルからlambda関数のイメージを設定する方法です。
* コンソールからlambda関数を作成（スペックは任意）
* 必要であれば、設定から環境変数を設定
* 下記の手順で、ECRのリポジトリからイメージを選択し、lambdaをビルド
    * イメージ >> 新しいイメージをデプロイ >> イメージを参照 >> ECRイメージリポジトリ >> latestのイメージを選択 >> イメージを選択

後編ではこちらのイメージアップデートの自動化について記載しようと思います！

### 参考
github enterpriseとcodebuildの設定: https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-github-enterprise.html

githubアクセストークンの設定: https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens