CodeCommitにpushした資産を自動的にLambdaへデプロイする(CodePipeline + Serverless)
AWS上のLambdaへServerlessを使用してデプロイしてみました。Node.js serverless-express LambdaのデプロイにServerlessを使用する
node_modulesをレイヤー化する方法も試しています。
Lambda serverless-layersを使用し、node_modulesをレイヤー化する
この方法を用いて、CodeCommitにpushしたら自動的にLambdaへ反映する環境を構築してみます。
cloudformationを用いた方法が一般的だと思いますが、
・serverlessを用いるとレイヤーの作成が簡単
・既存資産でノウハウがある
という理由で、serverlessを使用してのデプロイを選択しました。
【aws】CodeCommitにpushするだけでlambda関数をデプロイするパイプラインを作る【CodePipeline】
こちらのサイトが非常に参考になりました。
S3バケットの作成
デプロイ時の一時領域として使用するS3バケットを作成します。
バケット名は任意。
その他のオプションはデフォルトのままで作成しました。


CodeCommitでリポジトリの作成
CodeCommitでリポジトリを作成します。

gitの認証情報はIAMユーザーの「認証情報」タブ。
「AWS CodeCommit の HTTPS Git 認証情報」で生成できます。


コミット資産
テスト用にコミットする資産を準備します。
レイヤー化のテストも行いたいので、uuidを使用するサンプルを作成しました。
$ npm init
$ npm instal uuid
これでpackage.json、package-lock.jsonが生成されます。
プログラムのサンプル
・index.js
- const { v4: uuidv4 } = require('uuid');
- exports.handler = async(event, context, callback) => {
- console.log(uuidv4());
- console.log("pipeline test!");
- }
続いてデプロイ用のserverless.ymlを用意します。
・serverless.yml
- service: deploy-test
- # 使用するクラウドサービス(AWS)と言語(Node.js)を指定
- provider:
- name: aws
- region: ap-northeast-1
- runtime: nodejs14.x
- stage: stage
- lambdaHashingVersion: 20201221
- deploymentBucket:
- name: [作成したS3バケット名]
- functions:
- deploy-test-sites:
- handler: index.handler
- name: deploy-test
- description: 'deploy-test'
- runtime: nodejs14.x
- role: arn:aws:iam::xxx[Lambdaで使用するロール]
- custom:
- serverless-layers:
- layersDeploymentBucket: [作成したS3バケット名]
- plugins:
- - serverless-layers
- # Exclude files from deployment
- package:
- patterns:
- - '!package.json'
- - '!package-lock.json'
最後にCodeBuildで使用する、buildspec.yamlを用意します。
・buildspec.yaml
- version: 0.2
- phases:
- install:
- commands:
- - npm install -g serverless
- - npm install -g serverless-layers
- build:
- commands:
- - serverless deploy
- post_build:
- commands:
- - echo Build completed on `date`
これはビルド時に使用するサーバーを構築するための定義です。
Dockerfileみたいなものだと理解しています。
serverless、serverless-layersを-gオプション付きでグローバル領域にインストール。
buildのコマンドで、serverless deployを実行。Lambdaへデプロイします。
post_buildは特に不要ですが、終了時刻を出力するよう構成しました。
コミットする資産は以下となります。
buildspec.yaml
index.js
package.json
package-lock.json
serverless.yml
IAMロールの作成
デプロイ時に使用するIAMロールを作成します。
信頼されたエンティティタイプは「AWSのサービス」を選択。
ユースケースは「CodeBuild」としました。

ロール名は任意の名称を設定。

許可するポリシーを追加します。

もっと少ない権限で良いはずですが、なかなかビルドエラーが消せなかったので、以下のポリシーを設定しました。
AWSCodeCommitFullAccess
AmazonS3FullAccess
CloudWatchFullAccess
AWSCodeDeployRoleForLambda
AWSCodePipelineFullAccess
AWSCodeBuildAdminAccess
AWSCloudFormationFullAccess
AWSLambda_FullAccess
作成したロールは、CodePipeline、CodeBuildで同じものを使用しました。
CodePipelineの設定
下準備が整ったので、CodePipelineの作成を行います。
パイプライン名は任意。
サービスロールは「既存のサービスロール」を選択し、作成したIAMロールを指定します。

ソースステージの追加では、
ソースプロバイダーに「AWS CodeCommit」
リポジトリに作成したリポジトリ名。
ブランチ名には「master」を指定しました。

ビルドステージの追加では、プロバイダーに「AWS CodeBuild」を選択。
「プロジェクトを作成する」をクリックします。

プロジェクトの作成が別画面で表示されます。
任意のプロジェクト名を設定。

環境イメージは「マネージド型イメージ」
オペレーティングシステムは「Amazon Linux 2」
ランタイムは「Standard」
イメージは最新のものを選択しました。

サービスロールは事前に作成したロールを指定します。

Buildspecは「buildspecファイルを使用する」を選択。

残りの項目はデフォルトのまま作成しました。

プロジェクトの作成が終わると、CodePipelineの画面に戻ります。
ビルドステージでの設定はないので、「ビルドステージをスキップ」を選択し、設定を終了します。

これでCodeCommitにpushすればCodePipelineが起動。
serverlessによりLambdaへデプロイされる環境が構築できました。

【参考URL】
【aws】CodeCommitにpushするだけでlambda関数をデプロイするパイプラインを作る【CodePipeline】