GithubでマージされたLambda関数を、CodeBuildを使ってビルド...と言うべきかzipをs3へ配置してみる。
利用コード
CloudWatchのアラームをSlackへ通知するLambda関数を使う。
これの変更をGitHubへPushしてマージされたらビルドが走り、S3へzipが配置されることになるようにする。
Buildspec.yml
buildspec.ymlの大まかな流れは下記のようになる。 commandsブロックに実行するコマンドを記述できる。
- install: ビルドする環境を構築する。ここではPython 3.7を指定する。
- pre_build: ビルド前の依存ライブラリのインストールなどを行う。ここでは定義しているだけで何もしていない。
- build: ビルド処理を行う。Lambdaへアップするファイルをzip圧縮してs3にアップロードしている。
- post_build: ビルド後のアップロードなどを実行する。ここでは定義しているだけで何もしていない。
CodeBuildのビルドプロジェクト作成
AWSマネジメントコンソールのCodeBuildのダッシュボードへ遷移する。 「ビルドプロジェクトの作成」を選択する。すでに別なCodeBuildのプロジェクトがある場合は、画面左メニューの「ビルド」を展開し、「ビルドプロジェクト」を選択してから、「ビルドプロジェクトの作成」 を選択する。
プロジェクトの設定
ビルドプロジェクトを新規作成する。 「プロジェクト名」を適当に入力する。名前はあとで変更できない。 他の項目は入力しなくても良い。
送信元
「ソースプロバイダ」として「GitHub」を指定する。初回の設定時はGitHubとの認証画面が立ち上がるので設定する。
「リポジトリ」には「GitHubアカウント」を指定する。 「GitHubリポジトリ」には自分が利用したいGitHubのリポジトリを指定する。
他は空欄で構わない。
プライマリソースのウェブフックイベント
「コードの変更がこのリポジトリにプッシュされるたびに再構築する」にチェックを入れる。 「イベントタイプ」には「PULL_REQUEST_MERGED」を指定する。
環境
「環境イメージ」には「マネージド型イメージ」を指定する。 「オペレーティングシステム」はどちらでも良いがここでは「AmazonLinux2」を指定している。 「ランタイム」は「Standard」、「イメージ」は「aws/codebuild/amazonlinux2-x86_64-standard:1.0」を、「イメージのバージョン」は「このランタイムには常に最新のイメージを使用してください」を選択する。
「サービスロール」はどちらでも良い。ここでは新規作成している。 S3にファイルをアップロードするので、ここで作成したロールにS3への読み書きができる権限を追加しておく必要がある。
Buildspec
「ビルド仕様」には「buildspecファイルを使用する」を選択する。 「Buildspec名」には「buildspec.yml」を指定する。
アーティファクト
ビルドした成果物を配置する場所を指定する。 今回はbuildフェーズ内でzipファイルをアップロードするので指定しない。
ログ
必要に応じて設定すれば良い。
まとめ
GithubでPull ReqがマージされたLambda関数をCodeBuildを使ってビルド(zipをs3へ配置)するやり方について書いた。
Lambda関数は現状codedeployではデプロイできないようなのでどうするか悩んでいる。 codebuildのcommandsブロックでLambdaへアップロードすることもできるが、ビルドフェーズでデプロイするというちょっとおかしいことになるのでうまいやり方を見つけたい。