AWS api 网关与 AWS SQS 集成中的消息属性的具体格式是什么?
What is the specific format Message attributes in AWS api gateway integration with AWS SQS?
场景:
我想要一个 AWS API 网关路由,用于将 HTTP POST 调用请求 body 转发到 AWS SQS 服务。
我使用 API 网关的新 AWS 控制台界面和 Amazon Simple Queue 服务作为集成目标成功地做到了这一点。
现在,问题 是我想将特定请求 header 值作为消息属性发送到 SQS,但控制台中可接受的格式非常模糊!
我尝试了我能找到的文档、主题和书籍中的任何内容,甚至尝试了其他服务值格式中的一些类似符号,但没有任何效果。
当我尝试像下面这样为 Message 属性设置不同的值时,它开始返回 400 错误状态代码以响应之前有效的 HTTP 请求。
我只想将请求 header 连同请求 body 一起发送到 SQS,因此我有存储在请求 header 上的基本数据来处理消息。
尝试值:
- $request.header.valueX
- {"somename":"$request.header.valueX"}
- {"Name":"somename","Value":{"DataType":"String","StringValue":"$request.header.valueX"}}
none 以上格式在 API SQS 网关集成中的消息属性(可选)高级设置的 AWS 控制台中是可接受的。
我找不到任何合适的消息属性值格式。
非常感谢
更新:
我尝试了一个对我有用的解决方案:
因为我可以控制服务的客户端,所以我定义了一个新的自定义 header(示例 1),其值采用以下格式:
{"CUSTOM-ATTRIBUTE-NAME": {"DataType": "String", "StringValue": "CUSTOM-ATTRIBUTE-VALUE"}}
在Message属性-optional在API Gateway的SQS集成页面中,我将值设置为$request.header .sample1
custom-attribute-name 将是 SQS 消息属性名称,CUSTOM-ATTRIBUTE-VALUE 将是值。
现在当我收到来自 SQS 的消息时,我在消息属性中同时拥有完整的请求消息 body 和我的自定义 header。
目前看来,在 HTTP API 中手动定义此类集成是不可能的,如 this 最近的 reddit post 所示。 post 还表示这已得到 AWS 支持人员的确认。
通过 HTTP api 将属性添加到 SQS 消息的唯一方法是 post 它们与消息一起简单地添加,例如使用卷曲:
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
场景:
我想要一个 AWS API 网关路由,用于将 HTTP POST 调用请求 body 转发到 AWS SQS 服务。 我使用 API 网关的新 AWS 控制台界面和 Amazon Simple Queue 服务作为集成目标成功地做到了这一点。
现在,问题 是我想将特定请求 header 值作为消息属性发送到 SQS,但控制台中可接受的格式非常模糊!
我尝试了我能找到的文档、主题和书籍中的任何内容,甚至尝试了其他服务值格式中的一些类似符号,但没有任何效果。
当我尝试像下面这样为 Message 属性设置不同的值时,它开始返回 400 错误状态代码以响应之前有效的 HTTP 请求。
我只想将请求 header 连同请求 body 一起发送到 SQS,因此我有存储在请求 header 上的基本数据来处理消息。
尝试值:
- $request.header.valueX
- {"somename":"$request.header.valueX"}
- {"Name":"somename","Value":{"DataType":"String","StringValue":"$request.header.valueX"}}
none 以上格式在 API SQS 网关集成中的消息属性(可选)高级设置的 AWS 控制台中是可接受的。
我找不到任何合适的消息属性值格式。
非常感谢
更新:
我尝试了一个对我有用的解决方案:
因为我可以控制服务的客户端,所以我定义了一个新的自定义 header(示例 1),其值采用以下格式:
{"CUSTOM-ATTRIBUTE-NAME": {"DataType": "String", "StringValue": "CUSTOM-ATTRIBUTE-VALUE"}}
在Message属性-optional在API Gateway的SQS集成页面中,我将值设置为$request.header .sample1
custom-attribute-name 将是 SQS 消息属性名称,CUSTOM-ATTRIBUTE-VALUE 将是值。
现在当我收到来自 SQS 的消息时,我在消息属性中同时拥有完整的请求消息 body 和我的自定义 header。
目前看来,在 HTTP API 中手动定义此类集成是不可能的,如 this 最近的 reddit post 所示。 post 还表示这已得到 AWS 支持人员的确认。
通过 HTTP api 将属性添加到 SQS 消息的唯一方法是 post 它们与消息一起简单地添加,例如使用卷曲:
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