【AWS】CodePipelineを使ってcodeCommitのプルリクでLamdaをデプロイ
自分の備忘録的なものです。AWS公式をキャプチャ付きに簡単にまとめたものです。文章をだらだら読むより視覚的に理解したい人用です。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/build-pipeline.html
1. AWS CloudFormation ロールを作成する
ここで予め、デプロイ時に必要となるロールを作成します。
コンソールからIAMへ行きます。
メニューから【Roles】を選択します。
trusted EntityでAWS Serviceを選択し、use Caseとして、下の方にある【Cloud formation】を選択し、【Next Permission】を選択
【Create policy】を選択し、ポリシーを作成します。
【JSON】タブを選択して以下をコピペします。
{ "Statement": [ { "Action": [ "apigateway:*", "codedeploy:*", "lambda:*", "cloudformation:CreateChangeSet", "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy", "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy", "iam:PassRole", "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" }
ポリシーに名前を付けます。
2.リポジトリをセットアップする
index.js
var time = require('time'); exports.handler = (event, context, callback) => { var currentTime = new time.Date(); currentTime.setTimezone("America/Los_Angeles"); callback(null, { statusCode: '200', body: 'The time in Los Angeles is: ' + currentTime.toString(), }); };
ソースファイルになり、現在の時刻を返すLambda関数になります。
buildspec.yml
version: 0.2 phases: install: runtime-versions: nodejs: 10 build: commands: - npm install time - export BUCKET=ここは自身のS3バケットを指定する - aws cloudformation package --template-file template.yml --s3-bucket $BUCKET --output-template-file outputtemplate.yml artifacts: type: zip files: - template.yml - outputtemplate.yml
ビルド時に必要なパッケージをインストールしたりするファイル ※BUCKETの部分は自身のS3のバケット名に置き換えてください。
template.yml
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Outputs the time Resources: TimeFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs10.x CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET
デプロイ時の環境を定義するファイル。APIゲートウェイにURLを指定して展開するとこまで書かれています。
故にこのファイルが無事実行されれば、URLを叩けば↑のLambdaが実行されることになります。
全て直下に置くので、ファイル構成をまとめると以下のようになります。
※ソースは別に直下であればどんな構成でも構いません。
3. CodepipelineでPipelineを作成する
コンソールから【CodePipeline】を検索して選択します。
【Create Pipeline】を選択します。
ソースの詳細を選択していきます。
まず、Source providerとして例としてAWS Code Commitを選択します。選択すると自動的にリポジトリ名入力などの入力欄が出てきます。
クリックするとドロップダウンで存在するレポジトリやブランチを選択できます。
今回は既に作成しているlambda-pipeline-repoとブランチとしてmasterを選択します。
Change detection optionsとしてCloud Watch Eventを選択することで、リポジトリの更新でCodePipelineが走るようになります。
ビルドの詳細を選択していきます。ソース同様、Build providerでAWS CodeBuildを選択するとリージョンの選択とプロジェクト名の入力が出ます。
プロジェクトはまだ作成していないので、【Create project】を選択します。
ビルドの設定を作成します。
Environmentを以下のように設定
・Operating system ・・・ Ubuntu
・Runtimes ・・・ Standard
・image ・・・ aws/codebuild/standard:2.0
・image version ・・・ 最新
・Environment type ・・・ Linux
他はデフォルトで構いません。ロールも新しく作成する設定にしておきます。
デプロイの設定をします。
それぞれ以下のように設定します。
・Deploy provider ・・・ CloudFormation
・Region ・・・ お好きなリージョン
・Action mode ・・・ Create or replace a changeset
・Stack name ・・・ lambda-pipeline-stack
・Change set name ・・・ lambda-pipeline-changeset
Stack nameとChange set nameは入力した名前で作成されます。
Templateの項目を埋めます。指定した名前のファイルがS3上に作成されます。
・Artifact name ・・・ BuildArtifact
・File name ・・・ outputtemplate.yml
Capabilities - optionalは【CAPABILITY_IAM】を選択します。
4.ビルドステージロールを更新する
ポリシーをアタッチします。S3にファイルを添付するのでS3のフルアクセスをアタッチします。
5.デプロイステージの完了
メニューにある【edit】を選択し、編集していきます。
デプロイにある【edit deploy】を選択してデプロイを編集していきます。
【Add action group】を選択します。
以下のように設定します。
・Action name ・・・ excute-changeset
・Action provider ・・・ AWS Cloudformation
・Region ・・・ お好きなリージョン
・Input artifacts ・・・ BuildArtifact
・Action mode ・・・ Excute a changeset
・Stack name ・・・ lambda-pipeline-stack
・Change set name ・・・ lambda-pipeline-changeset
6.アプリケーションのテスト
ここまでで、CodePipelineの設定は終了です。ここまでで、エラー等あれば、指定しているproviderや操作しているIAMユーザーのロールなどを確認してください。基本的にエラー内容に従えば解決するはずです。
アプリケーションのテストの前にCodePipelineの実行を行います。【Release Change】を選択して実行します。
※初回だと変更セット実行で変更セットがないというエラーが出ることがあるが、再実行で解決します。
アプリケーションのテストを行う為、コンソールからLamdaへ移ります。
下の方へ行き、Resourcesにある【Serverless RestApi】を展開し、【Prod API endpoint】を選択します。
以上で、CodePipelineでのLambdaのデプロイは終わりです。複数ラムダを展開したい場合は、template.ymlをいじればできます。
その際、ラムダ毎にインストールするパッケージを変えたい場合は、buildspec.ymlを上手くいじる必要あります。
何かアプリを作る時など機会があれば備忘録として書こうと思います。
※2020/3/22現在、デプロイステージで変更セットの実行がたまに失敗します。原因が分かれば追記します。再実行で解決するので今のとこ個人での使用であればそんなに影響はないと思います。
※2020/4/21追記
今更ながらしっかりエラー見て気づきましたが、Deployの同ステージ内で変更セットの作成と実行を同時にやってしまっているようでした。
正しくは【Add action group】で、変更セット実行は後にすると失敗はしませんでした。