我想使用 AWS CloudWatch Events 按预定义的计划向 SQS 发送消息。消息正文无关紧要,但它确实需要几个消息属性。
在 CloudFormation 中创建此事件规则时,我找不到任何有关如何指定消息属性的文档。目前资源看起来像这样 -
ScheduledEvent:
Type: AWS::Events::Rule
Properties:
RoleArn: !Ref ScheduledEventRole
ScheduleExpression: !Ref ScheduledEventRule
Targets:
- Arn: !Ref Queue
Id: !GetAtt Queue.Name
Input: "message body"
消息正文应该是什么,以便将属性发送到
SQS
?
几天前我也遇到了同样的问题,我想出了一个解决方法。 Amazon 文档或任何在线资源均未提供有关如何使用 CFT 通过 CloudWatch Events 发送 SQS 消息属性的信息。
在SQS中使用消息属性的目的是传递可以在实际处理消息正文之前使用的元数据。以下内容来自 AWS 文档。
您的消费者可以使用消息属性来处理消息 无需先处理消息正文的特定方式。
但是在我们的场景中,我们找不到发送消息属性的方法。因此,您可以在消息正文中包含消息属性。例如:
ScheduledEvent:
Type: AWS::Events::Rule
Properties:
RoleArn: !Ref ScheduledEventRole
ScheduleExpression: !Ref ScheduledEventRule
Targets:
- Arn: !Ref Queue
Id: !GetAtt Queue.Name
Input: "{\"attribute1\":\"value1\", \"attribute2\":\"value2\"}"
这样,您就可以从消息正文访问属性。但请记住,这违反了属性的实际使用。
看来我参加聚会有点晚了,但事情是这样的:
事实上,有一种方法可以指定从调度程序发送的 SQS 消息的
MessageAttributes
。
但是,为此,您不能将 SQS 目标用于您的日程安排。您必须使用通用目标 (请参阅 https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html)。
将调度程序目标 ARN 设置为
"arn:aws:scheduler:::aws-sdk:sqs:sendMessage"
,然后您可以指定 QueueUrl
、Body
和 MessageAttributes
作为调度输入的一部分:
{
"QueueUrl": "<SQS_QUEUE_ARN>",
"MessageAttributes": {
"<ATTRIBUTE_NAME>": {
"DataType": "String",
"StringValue": "<ATTRIBUTE_VALUE>"
}
},
"Body": "<MESSAGE_BODY>"
}
resource "aws_scheduler_schedule" "testSchedule" {
name = "test-ec1-schedule-weekly"
schedule_expression = "cron(0 3 ? * 2 *)"
schedule_expression_timezone = "Europe/Prague"
flexible_time_window {
mode = "OFF"
}
target {
# Set the universal target, instead of directly setting SQS queue URL
arn = "arn:aws:scheduler:::aws-sdk:sqs:sendMessage"
role_arn = aws_iam_role.testSchedule.arn
input = jsonencode({
# Set the SQS queue URL here
QueueUrl: aws_sqs_queue.testQueue.url,
# And specify your MessageAttributes
MessageAttributes: {
myAttributeName: {
DataType: "String",
StringValue: "myAttributeValue",
},
},
MessageBody: jsonencode({
some: "payload",
}),
})
}
}
(以防万一有人劫持你的家人,现在强迫你写CF...)
ScheduledEvent:
Type: AWS::Events::Rule
Properties:
RoleArn: !Ref ScheduledEventRole
ScheduleExpression: !Ref ScheduledEventRule
Targets:
- Arn: "arn:aws:scheduler:::aws-sdk:sqs:sendMessage"
Input: |
{
"QueueUrl": "<SQS_QUEUE_URL>",
"MessageAttributes": {
"myAttributeName": {
"DataType": "String",
"StringValue": "myAttributeValue"
}
},
"MessageBody": "{\"foo\":\"bar\"}",
}