Edited at

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

More than 1 year has passed since last update.


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のテンプレートに設定するか)