CodePipelineを使用したCodeDeployによるLambdaデプロイ

CodePipelineを使用したCodeDeployによるLambdaデプロイ

CodePilelineを使用してLambdaカナリアデプロイするためにCodeDeployを使用してデプロイします。

といってもCodePipelineのデプロイステージは「AWS CloudFormation」を選択します。

samテンプレートにDeploymentPreferenceを定義することにより実現します。

AWS Lambda でトラフィックの移行と AWS CodeDeploy のデプロイをサポート
Deploying serverless applications gradually - AWS Serverless Application Model
Use CodeDeploy to gradually deploy your AWS SAM applications.

デプロイステージで「AWS CodeDeploy」を選択できますが、ドキュメントを見る限りCodePipelineのデプロイステージで選択するCodeDeployではLambdaをデプロイするのではなくEC2デプロイ用のデプロイプロバイダーになるようです。

CodePipeline アクションタイプとの統合 - AWS CodePipeline
アクションの種類に基づいた他の AWS のサービス および AWS パートナー会社の製品やサービスと CodePipeline の統合について説明します。

ソースステージ

ソースプロバイダーは「CodeCommit」を指定します。

あらかじめリポジトリは作成しておく必要があります。このリポジトリにsamテンプレート(cfn)やLambdaのソース、CodeBuildで使用するbuildspec.ymlをプッシュしておきます。

CodePipelineを使用したCloudformationによるデプロイ

CodePipelineを使用したCloudformationによるLambdaデプロイ

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を読み込んでビルドします。

CodePipelineを使用したCloudformationによるLambdaデプロイ

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にアップロードされ、デプロイステージのインプットとして使用することができるようになります。

CodePipelineを使用したCloudformationによるデプロイ

CodePipelineを使用したCloudformationによるデプロイ

デプロイステージ

デプロイプロバイダーは「AWS Cloudformation」を指定します。

CodePipelineを使用したCloudformationによるデプロイ

アクションモードは「変更セットを作成または更新する」を指定します。

※こで「スタックを作成または更新」を指定する場合は「AWS CodeBuild,CodePipelineのデプロイステージでCodeCommitリポジトリのLambdaをデプロイする」を参照ください。

スタック名:codedeploy-sample1
変更セット:aaa
テンプレート:cfn_out.yml

CodePipelineを使用したCloudformationによるLambdaデプロイ

一旦CodePipelineを作成して、デプロイステージの後続アクションに「変更セットの実行」を追加します。

変更セットを作成しただけだとLambdaデプロイはされず、変更セットを実行する必要があります。

変更セットを使用したスタックの更新 - AWS CloudFormation
変更セットを実行して AWS CloudFormation スタックを更新する方法について説明します。それにより、スタックを更新する前に AWS CloudFormation が実行する変更をプレビューできます。

CloudFormationのマネジメントコンソールを見ると、スタックは作成されますが「REVIEW_IN_PROGRESS」となっていることがわかります。

CodePipelineを使用したCloudformationによるLambdaデプロイ

変更セットの実行

変更セット作成後に変更セットを実行するために、CodePipelineを編集して、デプロイステージの「変更セットを作成または更新する」の後続処理に「変更セットの実行」を追加します。

「アクショングループを追加する」をクリックします。

CodePipelineを使用したCloudformationによるLambdaデプロイ

設定する内容は以下の通りです。

スタック名:codedeploy-sample1
変更セット:aaa

CodePipelineを使用したCloudformationによるLambdaデプロイ

デプロイステージにアクションが追加されました。

CodePipelineを使用したCloudformationによるLambdaデプロイ

これでCodePipelineがCodeCommitのソース変更を検知すると一連の流れが実行されます。

そして最後のデプロイステージで「変更セットを作成または更新する」→「変更セットの実行」が実行され、LambdaがCodeDeployによってカナリアデプロイされるようになります。

CodePipelineを使用したCodeDeployによるLambdaデプロイ

Lambdaのソースに修正がない場合はLambdaやバージョンのデプロイはされないようです。

変更セットを見ると、変更セットの実行自体はエラー扱いとなっていますが、CodePipelineとしては正常終了します。

sam packageしてaws cloudformation deployでlambdaデプロイを行う」参照

CodePipelineを使用したCodeDeployによるLambdaデプロイ

sam deploy が sam package の機能を暗黙的に実行するようになりました。sam deploy コマンドを直接使用して、アプリケーションをパッケージ化およびデプロイできます。

コチラ参照

参考サイト

AWS CodePipeline "An AppSpec file is required, but could not be found in the revision"
I'm trying to set up a deployment pipeline using CodeCommit, ECR and ECS. My pipeline passes the source and build steps ...

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました