AWS api 网关与 AWS SQS 集成中的具体格式消息属性是什么?

设想:

我想要一个将 HTTP POST 调用请求正文转发到 AWS SQS 服务的 AWS API 网关路由。我使用 API 网关的新 AWS 控制台界面和 Amazon Simple Queue Service 作为集成目标成功地做到了这一点。

现在,问题是我想将特定的请求标头值作为消息属性发送给 SQS,但是控制台中可接受的格式是模棱两可的!

我尝试了在我能找到的文档、线程和书籍上找到的任何内容,甚至尝试了来自其他服务值格式的一些类似符号,但没有任何效果。

当我尝试为 Message 属性设置不同的值时,如下所示,它开始返回 400 错误状态代码以响应之前工作的 HTTP 请求。

我只想将请求标头沿着请求正文发送到 SQS,因此我将基本数据存储在请求标头中以处理消息。

尝试值:

 - $request.header.valueX
 - {"somename":"$request.header.valueX"}
 - {"Name":"somename","Value":{"DataType":"String","StringValue":"$request.header.valueX"}}

对于 SQS 的 API 网关集成中的消息属性(可选)高级设置,上述格式均不可接受。

我找不到任何适合消息属性的值格式。

非常感谢

AWS API Gateway console for SQS integration

更新:

我尝试了一个对我有用的解决方案:

因为我可以控制服务的客户端,所以我定义了一个新的自定义标头 (sample1),其值采用以下格式:

{"CUSTOM-ATTRIBUTE-NAME": {"DataType": "String", "StringValue": "CUSTOM-ATTRIBUTE-VALUE"}}

在 API Gateway 的 SQS 集成页面的 Message attribute - optional 中,我将值设置为 $request.header.sample1

custom-attribute-name 将是 SQS 消息属性名称,CUSTOM-ATTRIBUTE-VALUE 将是值。

现在,当我收到来自 SQS 的消息时,消息属性中有完整的请求消息正文和自定义标头。

stack overflow What is the specific format Message attributes in AWS api gateway integration with AWS SQS?
原文答案
author avatar

接受的答案

目前看来,在 HTTP API 中手动定义此类集成是不可能的,如 this 最近的 reddit 帖子所示。该帖子还表明这已得到 AWS 支持部门的确认。

通过 HTTP api 将属性添加到 SQS 消息的唯一方法是将它们与消息一起发布,例如使用卷曲:

curl -i -X POST https://44444444.execute-api.ap-southeast-2.amazonaws.com/sqs -H "Content-Type: application/json" --data '{"MessageBody":"ggg","MessageAttributes":{"newattribte":{"StringValue":"safffmple","DataType":"String"}}}'

Message attributes - optional 设置为 $request.body.MessageAttributes 时。

另一种方法是更改​​为 REST API,这在未来的影响力更大,并且 API 和 SQS 之间的这种集成是可能的。


答案:

作者头像

迟到了一年......但我刚刚在消息属性字段中使用了这个语法:

{
  "product":
  {
    "DataType":"String",
    "StringValue":"${request.path.product}"
  }
}

AWS Console

Resulting SQS message

作者头像

与 Laurie 提到的类似,如果您想将请求标头作为消息属性传递,请在消息属性字段中使用此语法,

{
  "your-message-attribute": {
    "DataType": "String",
    "StringValue": "${request.header.your-header-name-in-request}"
  }
}