使用AWS CLI命令订阅带有筛选器的主题

7

我正在尝试编写一个跨账户的 AWS CLI 命令,以同时订阅主题并为该订阅创建过滤器。以下是我的命令示例:

aws sns subscribe --topic-arn arn:aws:sns:region:accountId:my_topic --protocol sqs --notification-endpoint arn:aws:sqs:region:differentAccountId:my_sqs_queue --attributes "{'RawMessageDelivery': 'true', 'FilterPolicy': '{\"filter\": [\"value1\", \"value2\"]}'}"

当我运行这个程序时,出现了以下错误。
Unknown options: --attributes, [\value1\,, \value2\]}'}, {'RawMessageDelivery': 'true', 'FilterPolicy': '{" filter\:

我可以访问两个AWS账户的管理员权限,你有什么建议我做错了什么吗?

编辑: 我在Windows的VS Code PowerShell终端中运行此命令。


问题似乎与AWS CLI如何解释命令中的反斜杠有关。您是在Windows还是Linux上运行该命令?您可以尝试使用KeyName1=string,KeyName2=string的“简写语法”,而不是使用JSON格式。 - John Rotenstein
@JohnRotenstein:感谢您抽出时间回答。我正在Windows中使用PowerShell运行此命令。我更新了命令,使用缩写语法,例如--attributes "RawMessageDelivery=true",但仍然遇到相同的错误。我尝试过--attributes "RawMessageDelivery=\"true\""--attributes "RawMessageDelivery='true'",但它抛出了类似的错误Unknown options: --attributes, RawMessageDelivery=true - user007
3个回答

20

可能有更简单的方法来完成它(例如使用--cli-input-json并在文件中提供JSON数据),但我已经让它起作用:

可能有更简便的方法可以实现(例如使用--cli-input-json并提供一个JSON文件),但是我已经成功了:

aws sns subscribe \
  --topic-arn arn:aws:sns:region:accountId:my_topic \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:region:differentAccountId:my_sqs_queue \
  --attributes '{\"RawMessageDelivery\": \"true\", \"FilterPolicy\": \"{\\\"filter\\\": [\\\"value1\\\", \\\"value2\\\"]}\"}'

问题在于JSON被包含在字符串中,需要将\"转义为\\\"


3
谢谢。这份文档太糟糕了。在我的代码里我不需要那么多的转义符... --attributes '{"FilterPolicy":"{\"filter\":[\"value1\",\"value2\"]}"}' - Phil
即使使用 --attributes '{\"RawMessageDelivery\": \"true\"}',我仍然收到错误。 - Snow

4
此Github库有一个示例:https://github.com/Haple/sns-sqs-subscribe

#!/bin/sh

# SETUP

queue_arn=$(awslocal sqs create-queue --queue-name test_queue --output text)

echo "Queue ARN: $queue_arn"

topic_arn=$(awslocal sns create-topic --name test_topic --output text)

echo "Topic ARN: $topic_arn"

subscription_arn=$(awslocal sns subscribe \
    --topic-arn "$topic_arn" \
    --protocol sqs \
    --notification-endpoint "$queue_arn" \
    --output text)

echo "Subscription ARN: $subscription_arn" 

awslocal sns set-subscription-attributes \
    --subscription-arn "$subscription_arn" \
    --attribute-name FilterPolicy \
    --attribute-value "{ \"EVENT_TYPE\": [\"SUCCESS\"] }"

# TEST

awslocal sns publish \
    --topic-arn "$topic_arn" \
    --message "SUCCESS PAYLOAD (SHOULD GO TO THE QUEUE)" \
    --message-attributes '{"EVENT_TYPE" : { "DataType":"String", "StringValue":"SUCCESS"}}'

awslocal sns publish \
    --topic-arn "$topic_arn" \
    --message "ERROR PAYLOAD (SHOULD NOT GO TO THE QUEUE)" \
    --message-attributes '{"EVENT_TYPE" : { "DataType":"String", "StringValue":"ERROR"}}'


awslocal sqs get-queue-attributes \
    --queue-url http://localhost:4576/queue/test_queue \
    --attribute-names All


我认为这个更加简洁。 - Seto

0

前面的回答中总体过程是正确的,但有一个巨大的问题:

我不知道为什么没有人提到这一点,但如果您没有正确设置SQS队列策略文档,则整个过程都无法正常工作

Github示例没有做到这一点,而且由于某种原因,AWS文档甚至没有提到它。

请参考此问题:使用AWS CLI设置SQS策略文档

我浪费了几天时间来解决这个问题。希望能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接