AWS Lambdaに記述するエラー処理コードの量を減らすために、AWS Step Functions を使用して関数のエラー処理をサポートするサーバーレスワークフローを作成していきます。
Lambdaの言語はPythonです。
ちなみに今回はAWSの公式にあるハンズオンを実施したものになります。
目次
- StepFunctionで呼び出すLambdaの作成
- Stepfunctionの作成
- 実行結果
1.StepFunctionで呼び出すLambdaの作成
まずはLambdaの作成をクリックしてLambdaを作成していきます。
今回は自前のコードを入力するので「一から作成」をクリックして関数名とランタイムを選択していきます。
私は関数名をハンズオン通り「MockAPIFunction」とします。
ロールについてですが、今回はステップファンクションからのLambdaへの許可があればよいので、
Lambdaのロールの方は適当に作って、特にポリシーもアタッチしなくてよいです。
Lambdaが作成されたら下記のコードを入力してください。
class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass
def lambda_handler(event, context):
statuscode = event["statuscode"]
if statuscode == "429":
raise TooManyRequestsException('429 Too Many Requests')
elif statuscode == "503":
raise ServerUnavailableException('503 Server Unavailable')
elif statuscode == "200":
return '200 OK'
else:
raise UnknownException('Unknown error')
class 例外クラス: pass
例外を発生させるための例外クラスを作っている。
def lambda_handler(event, context):以下
引数のステータスコードによって、例外とメッセージを発生させる。
raiseコマンドについては下記の動画が分かりやすかったので例外について分からない人はぜひご覧ください。
【Pythonプログラミング】意図的に例外を発生させる方法 (raise) !なぜ、そんなことをする必要があるのかを解説します!
これでLambdaの方は完成です。
2.Stepfunctionの作成
Stepfunctionには視覚的に設計ができる画期的な技術がありますが、
今回はコードを入力するので「コードでワークフローを記述」を選択。
定義で下記のコードを入力してください。
{
"Comment": "An example of using retry and catch to handle API responses",
"StartAt": "Call API",
"States": {
"Call API": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next" : "OK",
"Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
"Retry" : [ {
"ErrorEquals": [ "TooManyRequestsException" ],
"IntervalSeconds": 1,
"MaxAttempts": 2
} ],
"Catch": [
{
"ErrorEquals": ["TooManyRequestsException"],
"Next": "Wait and Try Later"
}, {
"ErrorEquals": ["ServerUnavailableException"],
"Next": "Server Unavailable"
}, {
"ErrorEquals": ["States.ALL"],
"Next": "Catch All"
}
]
},
"Wait and Try Later": {
"Type": "Wait",
"Seconds" : 1,
"Next" : "Change to 200"
},
"Server Unavailable": {
"Type": "Fail",
"Error":"ServerUnavailable",
"Cause": "The server is currently unable to handle the request."
},
"Catch All": {
"Type": "Fail",
"Cause": "Unknown error!",
"Error": "An error of unknown type occurred"
},
"Change to 200": {
"Type": "Pass",
"Result": {"statuscode" :"200"} ,
"Next": "Call API"
},
"OK": {
"Type": "Pass",
"Result": "The request has succeeded.",
"End": true
}
}
}
タスク「Call API」の下記の部分は作成したLambdaのARNを入力してください。
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
コードを簡単に説明すると、タスク「Call API」から始まり、
タスク「Call API」で引数によって、エラーがなければ、タスク「OK」へ遷移し、
エラーによって下記に分岐する内容です。
・TooManyRequestsException
・ServerUnavailableException
・States.ALL
"Seconds" : 1,
"Next" : "Change to 200"
「TooManyRequestsException」の場合は、一秒待ってから次に「Change to 200」が指定されています。
"Change to 200": {
"Type": "Pass",
"Result": {"statuscode" :"200"} ,
"Next": "Call API"
「Change to 200」はそのままステータスコード200の出力をして、
タスク「Call API」に戻します。
作成後、ワークフローは下記のように表示されます。
次にロールとステップファンクションの名前を入力し手作成完了です。
ロールはLambdaにアクセスできるようにしてください。
これでステップファンクションも完了です。
3.実行結果
次は引数を503にします。
{
"statuscode": "503"
}
他の引数も試していきます。
{
"statuscode": "429"
}
最後に想定外の引数を入力します。
{
"statuscode": "999"
}
うまくいきましたね。
本記事は以上になります。ご覧いただきありがとうございました。