ステップ関数SNS SDK統合によるエラー処理


AWS Step Functions いくつかのサーバーレスワークフローのオーケストレーションを設計する方法です.
異なる状態で統合すると、状態が失敗したときに完全な実行が失敗する可能性があります.プログラム言語のエラー処理技術のように、ステップ関数を使用すると、特定のエラー処理技術に従って実行を終了または再試行することもできます.
このブログ記事では、SNS SDKインテグレーションを持っている状態で、どのようにSTEP機能のエラー処理技術を使用できるかを見ていきます.

ステップ関数のエラー処理
AWS Step Functions ネイティブのエラー処理をサポートしますcatch 定義.
例外は、状態がこのように失敗する可能性がある様々な理由で発生する可能性があります
  • 状態は前のステップまたは呼び出しイベントJSONから渡されたイベントからパラメーターを取得/読み取りできません.
  • SDK統合を使用している状態は、それぞれのSDK APIを呼び出すために必要なアクセス許可を欠くことができます.
  • 状態の処理時間はタイムアウトすることができます.
  • エラー名DataLimitExceeded , Timeout , and Permissions 例外の理由とそれを解決するために必要な手順を定義します.エラーに基づいて、ワークフローデザイナーとしてretry エラー名に基づいて処理するか、catch .

    ステップ関数でのエラー処理についての詳細を読むことができますhere .

    ワークフローの理解
    このワークフローでは、複数の状態を使用します.これらの状態は、Parallel . サービスのいずれかがエラーになった場合、並列状態も停止します.catch SNS SDKを統合してエラー情報に関する特定のトピックに発行する状態で実行します.

    パラレル状態はラムダFN呼び出しを実行します、そして、GetBuckeTacl、ListObjectSv 2と3番目の平行流のためにS 3 SDK統合は説明可能なDynamodb SDK統合を使用しています.

    The catch は、catch 次にステップを実行し、エラーをSNSトピックに通知します.これは、並列状態からの入力として完全なエラーを受け取り、input SDN SDKへPublish APIのMessage パラメータ

    パラレル状態に基づいて、エラーが発生した場合は、エラーをSNSトピックに通知するか、並列状態をSuccess state .
    このワークフローを使用して、実行が例外に遭遇した場合、SNS SDKの統合で処理されsuccess . すべてがうまくいけば、並列状態のすべての状態も成功状態になります.
    {
      "Comment": "State machine to demonstrate error handling with SNS SDK integration",
      "StartAt": "Parallel",
      "States": {
        "Parallel": {
          "Type": "Parallel",
          "Branches": [
            {
              "StartAt": "Lambda Invoke",
              "States": {
                "Lambda Invoke": {
                  "Type": "Task",
                  "Resource": "arn:aws:states:::lambda:invoke",
                  "OutputPath": "$.Payload",
                  "Parameters": {
                    "Payload.$": "$",
                    "FunctionName": "arn:aws:lambda:us-east-1:xxxxxxxx:function:ErrorSNSDemo:$LATEST"
                  },
                  "Retry": [
                    {
                      "ErrorEquals": [
                        "Lambda.ServiceException",
                        "Lambda.AWSLambdaException",
                        "Lambda.SdkClientException"
                      ],
                      "IntervalSeconds": 2,
                      "MaxAttempts": 6,
                      "BackoffRate": 2
                    }
                  ],
                  "End": true
                }
              }
            },
            {
              "StartAt": "GetBucketAcl",
              "States": {
                "GetBucketAcl": {
                  "Type": "Task",
                  "Parameters": {
                    "Bucket": "textract-sample-bucket"
                  },
                  "Resource": "arn:aws:states:::aws-sdk:s3:getBucketAcl",
                  "Next": "ListObjectsV2"
                },
                "ListObjectsV2": {
                  "Type": "Task",
                  "Parameters": {
                    "Bucket": "textract-sample-bucket"
                  },
                  "Resource": "arn:aws:states:::aws-sdk:s3:listObjectsV2",
                  "End": true
                }
              }
            },
            {
              "StartAt": "DescribeTable",
              "States": {
                "DescribeTable": {
                  "Type": "Task",
                  "Parameters": {
                    "TableName": "TextractKeywordsDB"
                  },
                  "Resource": "arn:aws:states:::aws-sdk:dynamodb:describeTable",
                  "End": true
                }
              }
            }
          ],
          "Catch": [
            {
              "ErrorEquals": [
                "States.ALL"
              ],
              "Next": "Notify Error to SNS topic",
              "ResultPath": "$"
            }
          ],
          "Next": "Success"
        },
        "Success": {
          "Type": "Succeed"
        },
        "Notify Error to SNS topic": {
          "Type": "Task",
          "Resource": "arn:aws:states:::aws-sdk:sns:publish",
          "Parameters": {
            "TopicArn": "arn:aws:sns:us-east-1:xxxxxxxx:ErrorNotification",
            "Message.$": "$"
          },
          "Next": "Success"
        }
      },
      "TimeoutSeconds": 20
    }
    
    Note :ステートマシンを作成するとき、IAMロールが作成されますが、自動作成されたポリシーは現在SDKベースのAPIポリシーを含んでいません.作成したときにポリシーをIAMロールに追加する必要があります.

    さまざまなワークフローの実行

    実行1 : IAMロールがない場合dynamodb:DescribeTable 許可.

    パラレル状態はすべての3つのサブプロセスの実行を開始し、DescribeTable APIが起動すると、IAMポリシーはそれを許可しません.エラーが発生しました.DynamoDb.DynamoDbException . そして、パラレル状態はそれをキャッチし、SNSトピック状態に通知エラーを実行する.トピックには、次のJSONベースの電子メールを受信する電子メールベースの加入者があります.


    実行2 : IAMロールがS 3許可を持たない場合.

    パラレル状態はすべての3つのサブプロセスの実行を開始し、S 3としてGetBucketAcl APIは実行を開始します.エラーが発生しました.S3.S3Exception . パラレル状態はそれをキャッチし、SNSトピック状態に通知エラーを実行します.トピックには、次のJSONベースの電子メールを受信する電子メールベースの加入者があります.


    実行3 : IAMロールがないときs3:ListObject 許可はあるがs3:GetBucketAcl .

    パラレル状態はすべての3つのサブプロセスの実行を開始し、S 3プロセスが流れたとき、それは正常に実行されるGetBucketAcl API.それから、それは反応を示しますListObjectv2 API、IAMポリシーはそれを許可しません.エラーが発生しました.S3.S3Exception . そして、パラレル状態がそれをキャッチし、SNSトピック状態に通知エラーを実行します.また、DynamoDB操作も同様に成功しました.トピックには、次のJSONベースの電子メールを受信する電子メールベースの加入者があります.


    実行4 :すべてのパーミッションが追加されました.

    すべてのアクセス許可を使用して、状態が正常に実行され、例外がないため、エラーがSNSトピック状態に通知されません.

    実行5 :ラムダ関数がエラーをスローするとき.

    すべてのアクセス許可を使用して、ラムダ関数コードからのプログラムエラーも処理されますcatch . ラムダ関数では、nodejsランタイムはエラーをスローするようにスニペットを追加しました.
    exports.handler = async (event) => {
        // TODO implement
        const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
        };
        throw new Error("An Error occured in Lambda function code!!!")
        // return response;
    };
    
    このエラーは、電子メールを介して通知されるSNSのトピックの状態に通知エラーでキャッチされ、優雅に処理されます.


    結論
    ステップ関数によってプロビジョニングされたエラー処理技術を使用すると、エラーを正しく処理できます.これらのエラーは、より自動化されたエラー処理のサポートされている200 +サービスと異なるAWS SDK統合で解決できます.