API Gateway・Lambda・StepFunctionで時差のある処理を実行する
📅 October 22, 2020
•⏱️3 min read
今日も自分のブログがうまく、設定できているか確認のために、雑に記事を書きたいと思います。
以前ブログを更新をトリガーに、API Gateway Lambdaでtwitterに投稿するというところまで作成していました。詳しくはこちらを。 ブログ更新をtweetする | masayukiBlog
今回は、その続きです。
Lambdaの起動を遅らせる
contentfulのwebhookをトリガーにtweetしているので、今のままだとNetlifyのビルドが終わる前にtweetされて、せっかくブログが見られても404になってしまいます。
そこで、apiが叩かれてもすぐに処理を実行せずに5分後とか適当に時間をおいて、lambdaのtweet処理を実行したいと思います。
api gatewayとLambdaはそれぞれ単体では、タイムアウトの時間にも制約があるので、step functionsを使います。
step functionを使ってみる
詳しくはこちらを↓。 AWS Step Functions の開始方法 - AWS Step Functions
まだ、詳しく説明できるほど理解してないので、とりあえず、 api gateway叩かれたら、6分待ってから、lambdaを発火するための、コード?JSON?貼っときます。
{
"Comment": "",
"StartAt": "Wait",
"States": {
"Wait": {
"Type": "Wait",
"Seconds": 360,
"Next": "Lambda"
},
"Lambda": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:{利用するlambdaのarnに変更してください}}",
"Payload": {
"Input.$": "$"
}
},
"End": true
}
}
}
api gatewayをstep functionに繋ぐ
こちらは、いつも通りapi gatewayでREST APIを作成します。
とりあえずリソースは /
にします。
メソッドは POST
にします。
「POST-セットアップ」の画面で、AWSサービスにラジオボタンを合わせ、AWSサービスのメニューから「Step Functions」を選びます。こんな感じ↓
普通だったら、実行するLambdaのarnなど指定するのですが、step functionsを使うことだけを選択して、作成します。実行するstep functionsはpostメソッドのbodyの中に含めるようです。
{
"input": "{}",
"name": "MyExecution",
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorld"
}
step functionsを実行するロールなどを割り当てる必要がありますが、割愛します。詳しくはこちらを、 API Gateway を使用して Step Functions API を作成する - AWS Step Functions
めちゃくちゃ、割愛しましたが、step functionsを使うと、api gatewayが叩かれてから、時間差でlambdaを発火することができるみたいです。
例の如く、動作確認してないので、うまく動かない可能性大なので、うまく動くことを祈りながら記事を公開してみます。
それではまたー。
追記
時間差で実行自体はできるけど、step functionsでapi gatewayからパラメーターを受け取って、lambdaで使うには、
"input": "{\"first_name\" : \"test\"}"
こういう形でinputキーで投げるしか無いみたいで、contentfulのカスタムwebhookだと
"input": {"first_name" : "test"}
こういう形式でしか投げれないから。今回のcontentfulトリガーで時間差で通知ってのは出来ない模様。。。 辛い。。。