Java
CloudFormation
lambda
CodePipeline
CodeBuild

JavaのLambdaをCodePipelineでリリースするサンプル周辺の豆知識

TL;DR

こんな記事を書きました。
JavaによるLambdaをCodepipelineで自動リリースする最小構成サンプル

この記事で書かれているCodePipelineの周辺情報の私的メモです。

CodePipeline全体の流れ

1. Source ステージ

githubリポジトリの定時監視と更新があったらコードを取得する。

2. Build ステージ

CodeBuild によるビルド。buildspec.ymlの記載通りビルドが実行される。

  1. gradlew でjarファイルの作成がされる。
  2. aws cloudformation package が実行され、以下の処理が実行される。
    1. 生成された jarファイルを S3::auto-release-sample に配置される。
    2. テンプレートファイル(packaged-minimum-lambda-java-model.yaml)を生成され、Codepipeline用に作られたS3バケットに配置される。

3. Staging ステージ

テンプレートファイルとjarファイルから、Lambda関数が構築される。

  1. 前回実行結果との差分の抽出。(アクションモード:変更セットの作成または置換)
  2. 差分から実際にLambda関数の構築を行う。(アクションモード:変更セットの実行)

雑駁な周辺知識

S3

CodePipeline作成時にS3バケットが作られる。命名パターンは
codepipeline-<リージョン名>-<乱数値>
例: codepipeline-ap-northeast-1-?????????????/

内容としては、githubからダウンロードしたファイルすべてや、ビルド実行で生成されたテンプレートファイルが、それぞれzipで圧縮されて保存される。各ステップでの入出力アーティファクト名でフォルダが内部に作られる。

関連するロール

  • cloudformation-lambda-execution-role

Staging ステージでのCloudFormationが動作するためのロール。予め開発者が準備するロール。s3:GetObject lambda:* cloudformation:CreateChangeSetなど。

  • code-build-<ビルドプロジェクト名>-service-role

CodeBuild が動作できるようにするためのロール。 S3::auto-release-samples3:PutObjectができること。codepipeline-ap-northeast-1-121111111111/へ、s3:PutObject s3:GetObject ができることなど。

参考:
http://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/setting-up.html?icmpid=docs_acb_console#setting-up-service-role

  • AWS-CodePipeline-Service

AWS CodePipeline が動作するためのロール。ポリシーの中身を見るに、codecommitや、codedeploy elasticbeanstalk, autoscalingなど、今回やりたい処理以外の設定も入っているので、典型的な設定が全て入っているものと思われる。

  • <スタックの名前>-AutoReleasedLambdaRole-<乱数値>

Lambda が実行されるときのロール。CloudFormationでLambdaが作成される際に自動的に生成される。AutoReleasedLambdaRoleはおそらく固定文字列。
内容は、AWSLambdaBasicExecutionRole が付いているもの。(詳細未検証)

Lambdaの実行に色々なロール設定が必要な場合は別途用意必要かも。(未検証)(予め用意するか、CloudFormationのテンプレートに設定するか)