[英]Adding SQS redrive policy using AWS CLI command
我正在尝试使用下面的 AWS CLI 命令为 SQS 设置重新驱动策略,但看到与重新驱动 JSON 相关的错误。你能告诉我如何解决这个问题吗?
redrive_policy="{\"RedrivePolicy\":{\"deadLetterTargetArn\":\"$dlq_arn\",\"maxReceiveCount\":\"15\"}}"
AWS CLI 命令
aws sqs set-queue-attributes --queue-url https://queue.amazonaws.com/12345678/test-queue --attributes $redrive_policy --region=us-east-1
错误信息
参数验证失败:参数 Attributes.RedrivePolicy 的类型无效,值:OrderedDict([(u'deadLetterTargetArn', u'arn:aws:sqs:us-east-1:12345678:dlq'), (u'maxReceiveCount', u '15')]), 类型: , 有效类型:
您是否尝试过仅在单独的文件中创建JSON并将其作为参数传递给AWS CLI命令? 我发现将JSON作为参数传递时,很难正确地进行所有转义。 因此,您基本上可以按照AWS文档中的示例进行操作:
https://docs.aws.amazon.com/cli/latest/reference/sqs/set-queue-attributes.html#examples
{
"DelaySeconds": "10",
"MaximumMessageSize": "131072",
"MessageRetentionPeriod": "259200",
"ReceiveMessageWaitTimeSeconds": "20",
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:80398EXAMPLE:MyDeadLetterQueue\",\"maxReceiveCount\":\"1000\"}",
"VisibilityTimeout": "60"
}
aws sqs set-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyNewQueue --attributes file://set-queue-attributes.json --region=us-east-1
注意:这些解决方案也适用于任何其他需要字符串化 JSON 的 AWS CLI 命令
jq
(推荐)推荐使用此方法的原因有很多:
jq
是使用 AWS CLI 时使用的一个方便的工具,因为经常需要对 JSON 进行字符串化。为 Ubuntu 安装:
sudo apt install jq
基本选项:
jq -R
:返回字符串化的 JSONjq -c
:消除空格和换行符
好处是可以将 JSON 写成 JSON 和 Pipe 结果到jq -R
命令中。
方法一:
aws sqs set-queue-attributes \
--queue-url "https://sqs.ap-south-1.amazonaws.com/IAMEXAMPLE12345678/ExampleQueue" \
--attributes RedrivePolicy=$(echo '{"maxReceiveCount":500,"deadLetterTargetArn":"arn:aws:sqs:ap-south-1:IAMEXAMPLE12345678:ExampleDeadLetterQueue"}' | jq -R)
或者,如果您有sqs-redrive-policy.json
文件:
方法二:
在sqs-redrive-policy.json
中,
{
"maxReceiveCount": 500,
"deadLetterTargetArn": "arn:aws:sqs:ap-south-1:IAMEXAMPLE12345678:ExampleDeadLetterQueue"
}
在命令行中运行:
aws sqs set-queue-attributes \
--queue-url "https://sqs.ap-south-1.amazonaws.com/IAMEXAMPLE12345678/ExampleQueue" \
--attributes RedrivePolicy=$(cat ~/path/to/file/sqs-redrive-policy.json | jq -c | jq -R)
--redrive-policy
而无需触及任何其他属性。常见混淆:一个混淆是名称
set-queue-attributes
(最好命名为put-queue-attributes
)。 因为它不会覆盖所有属性,而只会覆盖命令中提到的属性。 因此,如果您之前在create-queue
期间设置了Policy
属性,则不会将Policy
覆盖为 null。换句话说,这是可以安全使用的。
老实说,这是一种痛苦,我避免了这种情况。
aws sqs set-queue-attributes \
--queue-url "https://sqs.us-east-1.amazonaws.com/IAMEXAMPLE12345678/ExampleQueue" \
--attributes '{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-south-1:IAMEXAMPLE12345678:ExampleDeadLetterQueue\",\"maxReceiveCount\":\"500\"}",
}'
attributes.json
。json NOT sqs-redrive-policy.json
这是我最后的选择。
原因:
attributes.json
文件中指定的所有属性。 在attributes.json
中,
{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-south-1:IAMEXAMPLE12345678:ExampleDeadLetterQueue\", \"maxReceiveCount\":\"5\"}"
}
在命令行中运行:
aws sqs set-queue-attributes \
--queue-url "https://sqs.ap-south-1.amazonaws.com/IAMEXAMPLE12345678/ExampleQueue" \
--attributes file:///home/yourusername/path/to/file/attributes.json
如果你想在相同的命令中运行,你可以使用这个例子:
aws sqs set-queue-attributes \
--queue-url https://sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyNewQueue \
--attributes '{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:80398EXAMPLE:MyDeadLetterQueue\",\"maxReceiveCount\":\"1000\"}",
"MessageRetentionPeriod": "259200",
"VisibilityTimeout": "90"
}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.