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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

AWS Serverless Application Model (AWS SAM) には、段階的なAWS Lambdaデプロイを提供するために CodeDeployが組み込まれています。数行設定するだけで、AWS SAM が以下を実行します。

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

  • 新しいバージョンが期待どおりに動作していることを確認するまで、カスタマートラフィックを新しいバージョンに段階的に移行する。更新が正しく動作しない場合は、変更をロールバックできます。

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

  • CloudWatch アラームがトリガーされた場合、デプロイを自動的にロールバックします。

注記

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

次の例は、 を使用して、顧客 CodeDeploy を新しくデプロイしたバージョンの Lambda 関数に徐々に移行する方法を示しています。

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 関数のバージョニングとエイリアスについて参照してください。

  • Deployment Preference Type: 上記の例では、カスタマートラフィックの 10% が直ちに新しいバージョンに移行され、10 分後にすべてのトラフィックが新しいバージョンに移行されます。ただし、トラフィック前またはトラフィック後のテストが失敗した場合、または CloudWatch アラームがトリガーされた場合、 はデプロイを CodeDeploy ロールバックします。次の方法で、バージョン間のトラフィックの移行方法を指定できます。

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

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

    • AllAtOnce: すべてのトラフィックは元の Lambda 関数から最新バージョンの Lambda 関数に一度に移行されます。

    以下の表は、この例で使用したもの以外で利用可能なその他のトラフィック移行オプションの概要です。

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

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10PercentEvery10Minutes

    Linear10PercentEvery1Minute

    Linear10PercentEvery2Minutes

    Linear10PercentEvery3Minutes

    AllAtOnce

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

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

    • PreTraffic: トラフィックシフトが開始される前に、 はトラフィック前のフック Lambda 関数を CodeDeploy 呼び出します。この Lambda 関数は を呼び出し CodeDeploy 、成功または失敗を示す必要があります。関数が失敗すると移行が中止され、AWS CloudFormation に失敗が報告されます。関数が成功すると、 CodeDeploy はトラフィックシフトに進みます。

    • PostTraffic: トラフィックシフトが完了すると、 はトラフィック後のフック Lambda 関数を CodeDeploy 呼び出します。これは、関数が成功または失敗を報告する CodeDeploy ために を呼び出す必要がある、トラフィック前フックに似ています。post-traffic hook を使用して、統合テストやその他の検証アクションを実行します。

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

初めて Lambda 関数を段階的にデプロイする

Lambda 関数を徐々にデプロイする場合、 にはトラフィックの移行元となる、以前にデプロイされた関数バージョン CodeDeploy が必要です。したがって、最初のデプロイは次の 2 つのステップで実行する必要があります。

  • ステップ 1: Lambda 関数をデプロイし、AutoPublishAlias を使用してエイリアスを自動的に作成します。

  • ステップ 2: DeploymentPreference を使用して段階的にデプロイします。

最初の段階的なデプロイを 2 つのステップで実行すると CodeDeploy 、トラフィックの移行元となる以前の Lambda 関数バージョンが得られます。

ステップ 1: Lambda 関数をデプロイする

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live

ステップ 2: 段階的にデプロイする

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 and after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction

詳細はこちら

段階的なデプロイを設定する実践的な例については、「包括的な AWS SAM ワークショップ」の「モジュール 5 - canary デプロイ」を参照してください。