簡體   English   中英

AWS Step Functions State 來自 SQS 的機器結果選擇器

[英]AWS Step Functions State Machine Result Selctor from SQS

我正在構建我的第一個簡單 AWS Step Function: 第 1 步:從 SQS 讀取消息 第 2 步:運行 Redshift 查詢

我已經設法設置了我的初始工作流程和對資源的權限。 我正在嘗試格式化我的

這是我第一步的結果選擇器代碼:

"ResultSelector": {
        "startTime.$": "$.Body.startTime",
        "endTime.$": "$.Body.endTime"
      }

這是錯誤 output:

{
  "error": "States.Runtime",
  "cause": "An error occurred while executing the state 'ReceiveMessage from SQS' (entered at the event id #2). The JSONPath '$.Body.startTime' specified for the field 'startTime.$' could not be found in the input '{\"Messages\":[{\"Body\":\"{\\\"startTime\\\": 12828373, \\\"endTime\\\": 12828374}\",\"Md5OfBody\":\"1ca004b811be50a7579f3a7e6affaeb1\",\"MessageId\":\"5b6b72d6-3fb7-451a-9053-26b72de32768\",\"ReceiptHandle\":\"AQEBjgttgZBNSuGZb0LFjo16Xc2+5uc48k9QPh9af4vTGy1xzb/BZZ6mBFx0FQ4ALWUoLfppWHIJbb7Zax2+Jv2dqekvLoCWWrdjasyrJnGfduXwsY20cPuW86kXz4RJfP4qbnyvWcV5Cb63u26XUE3S+3AqREo2BNwi01mI3ceYWxguXzgSgDIMg/07Lt5kBcNvB6qCIexQDMDgH91ZmmINLuX0j5gd3spHCmzBvFoQKv4PbLBS18PsC6vL1YLGxplZ+eVyzD3eoK/5AU0jqmI0l0vjn4qZCVf2iOupkwEmMe4V2AaEdxI1FJ9dSU8zPkqFhbB3na56eIXgIGwsTWs5WBvlHikTuyYjWNFn6r27qCVfwADGkENoXZG1++vRoRse9X3p5fNqqVNBL1NTBL3k3/hoxB7/A922PT0MTn7rm1I=\"}]}'"
}

問題很明顯:我仍然沒有創建合適的結果選擇器。

我有 json 在 Python 中格式化了我的輸入:

message = {
    'startTime': 12828373,
    'endTime': 12828374
}

# Send message to SQS queue
response = sqs.send_message(
    QueueUrl=queue_url,
    DelaySeconds=10,
    MessageBody=json.dumps(message)
)

但是,似乎 function 步驟正在抓取多條消息。 我也沒有正確提取數據。

請幫助結果選擇器應該如何提取 startTime 和 endTime。 我還有什么遺漏或應該做的不同嗎?

我的整個步驟 function 如下:

{
  "Comment": "Run Redshift Queries",
  "StartAt": "ReceiveMessage from SQS",
  "States": {
    "ReceiveMessage from SQS": {
      "Type": "Task",
      "Parameters": {
        "QueueUrl": "******"
      },
      "Resource": "arn:aws:states:::aws-sdk:sqs:receiveMessage",
      "Next": "Run Analysis Queries",
      "ResultSelector": {
        "startTime.$": "$.Body.startTime",
        "endTime.$": "$.Body.endTime"
      }
    },
    "Run Analysis Queries": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "ClusterIdentifier": "******",
        "Database": "prod",
        "Sql": "select * from ******"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement"
    }
  },
  "TimeoutSeconds": 3600
}

從錯誤消息中,您的第一個 state 的 output 是:

{
  "Messages": [
    {
      "Body": "{\"startTime\": 12828373, \"endTime\": 12828374}",
      "Md5OfBody": "1ca004b811be50a7579f3a7e6affaeb1",
      "MessageId": "5b6b72d6-3fb7-451a-9053-26b72de32768",
      "ReceiptHandle": "AQEBjgtt...."
    }
  ]
}

所以目標在$.Messages[0].Body ,它是一個 JSON 字符串。 您可以使用內置的內在函數來處理它:

{
  "Comment": "Run Redshift Queries",
  "StartAt": "ReceiveMessage from SQS",
  "States": {
    "ReceiveMessage from SQS": {
      ...
      "ResultSelector": {
        "body.$": "States.StringToJson($.Messages[0].Body)"
      },
      ...
    }
  },
  ...
}

第一個 state 的 output 將是:

{
  "body": {
    "startTime": 12828373,
    "endTime": 12828374
  }
}

如果您經常使用 AWS SFN 開發應用程序,您可以訂閱他們的What's New Feed 他們將在這里宣布新功能或改進,這可能會有所幫助。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM