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バケットを作成します。

バケット名は任意。
その他のオプションはデフォルトのままで作成しました。

b13_01.png

b13_02.png



CodeCommitでリポジトリの作成



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

b13_03.png

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

b13_04.png


b13_05.png


コミット資産



テスト用にコミットする資産を準備します。
レイヤー化のテストも行いたいので、uuidを使用するサンプルを作成しました。


$ npm init
$ npm instal uuid



これでpackage.json、package-lock.jsonが生成されます。

プログラムのサンプル

・index.js


  1. const { v4: uuidv4 } = require('uuid');
  2. exports.handler = async(event, context, callback) => {
  3.     console.log(uuidv4());
  4.     console.log("pipeline test!");
  5. }




続いてデプロイ用のserverless.ymlを用意します。

・serverless.yml


  1. service: deploy-test
  2. # 使用するクラウドサービス(AWS)と言語(Node.js)を指定
  3. provider:
  4. name: aws
  5. region: ap-northeast-1
  6. runtime: nodejs14.x
  7. stage: stage
  8. lambdaHashingVersion: 20201221
  9. deploymentBucket:
  10.     name: [作成したS3バケット名]
  11. functions:
  12. deploy-test-sites:
  13.     handler: index.handler
  14.     name: deploy-test
  15.     description: 'deploy-test'
  16.     runtime: nodejs14.x
  17.     role: arn:aws:iam::xxx[Lambdaで使用するロール]
  18.         
  19. custom:
  20. serverless-layers:
  21.     layersDeploymentBucket: [作成したS3バケット名]
  22. plugins:
  23. - serverless-layers
  24. # Exclude files from deployment
  25. package:
  26. patterns:
  27.     - '!package.json'
  28.     - '!package-lock.json'



最後にCodeBuildで使用する、buildspec.yamlを用意します。

・buildspec.yaml


  1. version: 0.2
  2. phases:
  3. install:
  4.     commands:
  5.      - npm install -g serverless
  6.      - npm install -g serverless-layers
  7. build:
  8.     commands:
  9.      - serverless deploy
  10. post_build:
  11.     commands:
  12.      - 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」としました。

b13_06.png

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

b13_07.png

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

b13_08.png

もっと少ない権限で良いはずですが、なかなかビルドエラーが消せなかったので、以下のポリシーを設定しました。

AWSCodeCommitFullAccess
AmazonS3FullAccess
CloudWatchFullAccess
AWSCodeDeployRoleForLambda
AWSCodePipelineFullAccess
AWSCodeBuildAdminAccess
AWSCloudFormationFullAccess
AWSLambda_FullAccess



作成したロールは、CodePipeline、CodeBuildで同じものを使用しました。




CodePipelineの設定



下準備が整ったので、CodePipelineの作成を行います。
パイプライン名は任意。
サービスロールは「既存のサービスロール」を選択し、作成したIAMロールを指定します。

b13_09.png

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

b13_10.png

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

b13_11.png

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

b13_12.png

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

b13_13.png

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

b13_14.png

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

b13_15.png

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

b13_16.png


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

b13_17.png


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

b13_18.png


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

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ