【AWS】CodeBuild ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/01/23/231827

でも触れた AWS CodeBuild について、
使うことになったので、勉強

AWS CodeBuild

* 完全マネージド型のビルドサービス
* 以下をまずは、ざっくり読むといいかも

https://www.slideshare.net/ssuser8125c5/codebuild-82151957

成果物例

* Dockerイメージ をビルドして、Amazon ECR に プッシュする
 => Amazon ECR について、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/05/22/165711

公式サイト

ユーザズガイド
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/codebuild-user.pdf
Github / アクセストーク
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-access-tokens.html

■ 使用上の注意

シェルや外部モジュールなどが、Exit code 0 以外が返した場合
異常が発生したとみなし、処理が中断する。

以下の関連記事でも触れているが

CodeBuildに flake8 を組み込む
https://dk521123.hatenablog.com/entry/2020/02/17/220545

コードチェックするモジュール flake8 は、
規約違反があった場合に、Exit code = 1 を返す。
つまり、一件でも規約違反があった場合に、異常が発生したとみなし、
処理が中断する。
 => 分かってしまえば、なんてことはないが、
  作業してると気が付かず、はまる...

■ 大雑把な流れ

[1] Github などからコードを取得
[2] 好きなDockerコンテナを作成
[3] [2]上で buildspec.yml に指定したコマンドを実行
 => CodeBuild は、この「buildspec.yml」がキモになる

■ buildspec ファイル(buildspec.yml)

* YAML形式で記入
 => YAML については、以下の関連記事を参照

https://dk521123.hatenablog.com/entry/2019/10/13/000000
公式サイト
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
サンプル:buildspec.yml

# version: ビルド仕様のバージョン
# (「0.2 を使用することをお勧めします」だそうだ)
version: 0.2

# env : カスタム環境変数(任意)
env:
  variables:
    HELLO: "Hello world!"

# phases : 各ビルドイベントのコマンドを指定(必須)
phases:
  # インストール時イベント
  install:
    runtime-versions:
      # Amazon Linux 2:2.0 および Ubuntu Standard:3.0 なら「3.8」
      # それ以外は「3.7」
      python: 3.8
    commands:
      - echo "Entered the install phase... $HELLO."
      - apt-get update -y
      - pip install pipenv
    finally:
      # finallyで各イベント完了をハンドリングできる
      - echo "Done the install phase..."
  # ビルド前イベント
  pre_build:
    commands:
      - echo 'pre_build'
  # ビルドイベント
  build:
    commands:
      - echo 'build'
  # ビルド後イベント
  post_build:
    commands:
      - echo 'post_build'

Hello World

感じを掴むために、Hello world的なことをやる
(やってることは意味がない)

手順

1)準備

[1] 以下の「フォルダ構成」をZIPファイルとして固める
 => 「hello_world.zip」とする
[2] 任意のS3(s3://hello-world-xxx)にZIPファイルをアップする

2)プロジェクト作成

[1] AWSマネージメントコンソールからAWS CodeBuildに移動
[2]「プロジェクトの作成」を選択
[3] 以下を入力

+ Project Name:hello-world-codebuild
+ ソースプロバイダー:Amazon S3
+ Bucket (バケット):ZIPファイルを保存しているS3バケット名(hello-world-xxx)
+ S3 オブジェクトキー:ZIPファイル(hello_world.zip)
+ 環境イメージ:AWS CodeBuildによって管理されたイメージの使用
+ オペレーティングシステム:Ubuntu
+ ランタイム:Python
他は任意。以下を参考

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/getting-started-create-build-project-console.html

[4] [Create build project (ビルドプロジェクトの作成)] を選択

3)動作確認
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/getting-started-run-build-console.html

[1] [Build projects] を選択
[2] ビルドプロジェクトのリストで、[hello-world-codebuild]-[ビルドの開始] の順に選択
[3] [ビルドの開始] ページで、[ビルドの開始] を選択
 => 「success」になればOK!

フォルダ構成

+ buildspec.yml
+ src
     + hello_world.py
+ libs
     + requirements.txt

buildspec.yml

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - apt-get update -y
      - pip install --upgrade pip
      - pip install -r libs/dependency.txt
  build:
    commands:
      - echo 'Starting'
      - python3 src/hello_world.py
      # ↓ こんな感じでS3にアップすることもできる
      #- aws s3 cp src/hello_world.py s3://hello-world-xxx/src/hello_world.py

      # 複数行は以下のように記述する (YAMLフォーマットに従う)
       #- >
       #  aws s3 cp
       #  src/hello_world.py
       #  s3://hello-world-xxx/src/hello_world.py

YAMLについては、以下の関連記事を参照のこと
https://dk521123.hatenablog.com/entry/2019/10/13/000000
hello_world.py

print('Hello World')

requirements.txt

awscli
boto3

■ 主な環境変数

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html

環境変数 説明
AWS_DEFAULT_REGION
AWS_REGION ビルドが実行されているリージョン (ex: us-east-1)
CODEBUILD_RESOLVED_SOURCE_VERSION ビルドのソースコードのバージョン(ソースリポジトリによって異なる)
CODEBUILD_SOURCE_VERSION バージョン(ソースリポジトリによって異なる)
CODEBUILD_WEBHOOK_EVENT |現在のビルドをトリガーした Webhook イベント

参考文献

https://ohke.hateblo.jp/entry/2019/07/06/230000
https://qiita.com/numa08/items/8cbb602dea429c1c494b
https://dev.classmethod.jp/cloud/aws/codebuild-github-pullrequest-settings/
https://dev.classmethod.jp/cloud/aws/codebuild-with-github-on-cfn/
https://qiita.com/notsatoru/items/f02eca44122528fdcd32
https://qiita.com/oguchy/items/f7a9b537396dad606881
https://www.wakuwakubank.com/posts/660-aws-codepipeline/
https://hackerslab.aktsk.jp/codebuild-batch-operation
https://ohke.hateblo.jp/entry/2019/07/06/230000
https://tech.actindi.net/2018/08/31/120906
https://www.scsk.jp/sp/sysdig/blog/sysdig_secure/aws_codepipelineaws_codebuild.html

関連記事

CodeBuild 関連

CodeBuildに flake8 を組み込む
https://dk521123.hatenablog.com/entry/2020/02/17/220545
CodeBuild で パラメータストア / Secrets Manager を使う
https://dk521123.hatenablog.com/entry/2020/02/18/230358
CodeBuild で Python のバージョンを切り替える
https://dk521123.hatenablog.com/entry/2020/02/19/230909
CodeBuild で カスタムDockerイメージを使ってビルドする
https://dk521123.hatenablog.com/entry/2020/05/23/080655
CodeBuild ~ 各開発フェーズで設定を切り替えることを考える ~
https://dk521123.hatenablog.com/entry/2020/06/06/120734

その他

CodePipeline ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/01/23/231827
Amazon ECR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/22/165711
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
機密データの管理 ~ パラメータストア / Secrets Manager ~
https://dk521123.hatenablog.com/entry/2020/01/31/231636
Github ~ Webhook 編 ~
https://dk521123.hatenablog.com/entry/2020/01/25/224402
YAML (YAML Ain't Markup Language)
https://dk521123.hatenablog.com/entry/2019/10/13/000000