Skip to content

API Gateway・Lambda・StepFunctionで時差のある処理を実行する

  • Jamstack

📅 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」を選びます。こんな感じ↓

API Gateway

普通だったら、実行する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トリガーで時間差で通知ってのは出来ない模様。。。 辛い。。。

← PrevNext →
  • @masayuki031