CodePipelineを使用したCodeDeployによるLambdaデプロイ
CodePilelineを使用してLambdaカナリアデプロイするためにCodeDeployを使用してデプロイします。
といってもCodePipelineのデプロイステージは「AWS CloudFormation」を選択します。
samテンプレートにDeploymentPreferenceを定義することにより実現します。
デプロイステージで「AWS CodeDeploy」を選択できますが、ドキュメントを見る限りCodePipelineのデプロイステージで選択するCodeDeployではLambdaをデプロイするのではなくEC2デプロイ用のデプロイプロバイダーになるようです。
ソースステージ
ソースプロバイダーは「CodeCommit」を指定します。
あらかじめリポジトリは作成しておく必要があります。このリポジトリにsamテンプレート(cfn)やLambdaのソース、CodeBuildで使用するbuildspec.ymlをプッシュしておきます。
samテンプレート
cfn_in.ymlファイルで、deploytestというLambdaをデプロイします。末尾3行がCodeDeployの定義です。AutoPublishAliasを指定してエイリアス名を定義します。
AWSTemplateFormatVersion: "2010-09-09" Transform: "AWS::Serverless-2016-10-31" Resources: TestFunction: Type: "AWS::Serverless::Function" Properties: FunctionName: deploytest Handler: index.handler Runtime: nodejs18.x CodeUri: ../src MemorySize: 128 Timeout: 15 AutoPublishAlias: live DeploymentPreference: Enabled: true Type: Canary10Percent5Minutes
ビルドステージ
ビルドプロバイダーは「AWS CodeBuild」を指定します。
ビルドプロジェクトはあらかじめ作成しておくか、この画面から別ウィンドウを開いて作成することができます。
デフォルトでは、CodeCommitリポジトリ直下のbuildspec.ymlを読み込んでビルドします。
buildspec.yml
version: 0.2 phases: install: runtime-versions: nodejs: 16.x commands: - npm install build: commands: - sam package --template-file ./cfn_in.yml --s3-bucket バケット名 --output-template-file cfn_out.yml artifacts: files: - 'cfn_out.yml' discard-paths: yes
artifactsでアーティファクトを書いておくと、アーティファクトストア(S3)にアーティファクトが作成されます。
ここではctn_out.ymlファイルがs3にアップロードされ、デプロイステージのインプットとして使用することができるようになります。
デプロイステージ
デプロイプロバイダーは「AWS Cloudformation」を指定します。
アクションモードは「変更セットを作成または更新する」を指定します。
※こで「スタックを作成または更新」を指定する場合は「AWS CodeBuild,CodePipelineのデプロイステージでCodeCommitリポジトリのLambdaをデプロイする」を参照ください。
スタック名:codedeploy-sample1
変更セット:aaa
テンプレート:cfn_out.yml
一旦CodePipelineを作成して、デプロイステージの後続アクションに「変更セットの実行」を追加します。
変更セットを作成しただけだとLambdaデプロイはされず、変更セットを実行する必要があります。
CloudFormationのマネジメントコンソールを見ると、スタックは作成されますが「REVIEW_IN_PROGRESS」となっていることがわかります。
変更セットの実行
変更セット作成後に変更セットを実行するために、CodePipelineを編集して、デプロイステージの「変更セットを作成または更新する」の後続処理に「変更セットの実行」を追加します。
「アクショングループを追加する」をクリックします。
設定する内容は以下の通りです。
スタック名:codedeploy-sample1
変更セット:aaa
デプロイステージにアクションが追加されました。
これでCodePipelineがCodeCommitのソース変更を検知すると一連の流れが実行されます。
そして最後のデプロイステージで「変更セットを作成または更新する」→「変更セットの実行」が実行され、LambdaがCodeDeployによってカナリアデプロイされるようになります。
Lambdaのソースに修正がない場合はLambdaやバージョンのデプロイはされないようです。
変更セットを見ると、変更セットの実行自体はエラー扱いとなっていますが、CodePipelineとしては正常終了します。
「sam packageしてaws cloudformation deployでlambdaデプロイを行う」参照
sam deploy が sam package の機能を暗黙的に実行するようになりました。sam deploy コマンドを直接使用して、アプリケーションをパッケージ化およびデプロイできます。
参考サイト
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント