サーバーレスアプリケーションの段階的なデプロイ - AWS Serverless Application Model

サーバーレスアプリケーションの段階的なデプロイ

サーバーレスアプリケーションの作成に AWS SAM を使用する場合、これには段階的な Lambda デプロイのための AWS CodeDeploy が組み込まれています。数行設定するだけで、AWS SAM が以下を実行します。

  • Lambda 関数の新しいバージョンをデプロイし、新しいバージョンをポイントするエイリアスを自動的に作成する。

  • 新しいバージョンが期待どおりに動作していることを確認する、または更新をロールバックするまで、カスタマートラフィックを新しいバージョンに徐々に移行する。

  • トラフィック前およびトラフィック後のテスト関数を定義して、新しくデプロイされたコードが正しく設定されており、アプリケーションが期待どおりに動作していることを確認する。

  • CloudWatch アラームがトリガーされた場合にデプロイをロールバックする。

注記

AWS SAM テンプレートを通じて段階的なデプロイを有効にすると、CodeDeploy リソースが自動的に作成されます。CodeDeploy リソースは、AWS Management Console で直接表示できます。

以下の例は、カスタマーを新しくデプロイされたバージョンに徐々に移行させるための CodeDeploy の使用の簡易版を示すものです。

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before & after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction

AWS SAM テンプレートに対するこれらの修正は、以下を実行します。

  • AutoPublishAlias: このプロパティを追加し、エイリアス名を指定することで、AWS SAM が以下を実行します。

    • Lambda 関数の Amazon S3 URI に対する変更に基づいて、新しいコードがデプロイされていることを検出する。

    • 最新のコードでその関数の更新バージョンを作成し、発行する。

    • ユーザーが提供する名前でエイリアスを作成し (エイリアスが既に存在する場合を除く)、Lambda 関数の更新バージョンをポイントする。これを活用するには、関数の呼び出しがエイリアス修飾子を使用する必要があります。Lambda 関数のバージョニングとエイリアスになじみがない場合は、AWS Lambda 関数のバージョニングとエイリアスについて参照してください。

  • デプロイプリファレンスのタイプ: 上記の例では、カスタマートラフィックの 10% が直ちに新しいバージョンに移行され、10 分後にすべてのトラフィックが新しいバージョンに移行されます。ただし、pre-hook/post-hook テストが失敗した場合、または CloudWatch アラームがトリガーされた場合は、CodeDeploy がデプロイをロールバックします。以下の表は、先ほど使用したもの以外で利用可能なその他のトラフィック移行オプションの概要です。以下の点に注意してください。

    • Canary: トラフィックは 2 つの増分で移行されます。事前定義された Canary オプションから選択できます。このオプションは、最初の増分で更新された Lambda 関数バージョンに移行されるトラフィックの割合と、2 番目の増分で残りのトラフィックが移行されるまでの間隔を分単位で指定します。

    • Linear :トラフィックは等しい増分で移行され、増分間の間隔 (分) も同じです。増分ごとに移行されるトラフィックの割合と、増分間の間隔 (分) を指定する事前定義された Linear オプションから選択できます。

    • All-at-once: すべてのトラフィックが、元の Lambda 関数から更新された Lambda 関数バージョンに一括で移行されます。

    デプロイプリファレンスのタイプ

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10PercentEvery10Minutes

    Linear10PercentEvery1Minute

    Linear10PercentEvery2Minutes

    Linear10PercentEvery3Minutes

    AllAtOnce

  • アラーム: デプロイで発生したエラーによってトリガーされる CloudWatch アラームです。デプロイは自動的にロールバックされます。デプロイしている更新されたコードがアプリケーション内にエラーを生じさせている場合がその例です。別の例は、AWS Lambda、または指定した カスタム CloudWatch メトリクスがアラームのしきい値を超えた場合です。

  • フック: トラフィックが新しいバージョンに移行を開始する前、および移行が完了した後で健全性チェックを実行する、トラフィック前とトラフィック後のテスト関数です。

    • PreTraffic: トラフィックの移行を開始する前に、CodeDeploy が pre-traffic hook Lambda 関数を呼び出します。この Lambda 関数は、CodeDeploy にコールバックして成功したか失敗したかを伝える必要があります。関数が失敗すると移行が中止され、AWS CloudFormation に失敗が報告されます。関数が成功すると、CodeDeploy はトラフィックの移行に進みます。

    • PostTraffic: トラフィックの移行が完了した後で、CodeDeploy が post-traffic hook Lambda 関数を呼び出します。pre-traffic hook と同様に、この関数は CodeDeploy にコールバックして成功したか失敗したかを伝える必要があります。post-traffic hook を使用して、統合テストやその他の検証アクションを実行します。

    詳細については、「SAM Reference to Safe Deployments」を参照してください。