繁体   English   中英

使用 AWS CLI 命令添加 SQS 重新驱动策略

[英]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

  1. 因此,首先您将创建一个名为“ set-queue-attributes.json”的新文件,如下所示:
    {
      "DelaySeconds": "10",
      "MaximumMessageSize": "131072",
      "MessageRetentionPeriod": "259200",
      "ReceiveMessageWaitTimeSeconds": "20",
      "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-1:80398EXAMPLE:MyDeadLetterQueue\",\"maxReceiveCount\":\"1000\"}",
      "VisibilityTimeout": "60"
    }
  1. 然后运行如下命令:
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 命令

1. 使用命令行 JSON 处理器jq (推荐)

推荐使用此方法的原因有很多:

  • 我发现jq是使用 AWS CLI 时使用的一个方便的工具,因为经常需要对 JSON 进行字符串化。

为 Ubuntu 安装: sudo apt install jq

基本选项:

  • jq -R :返回字符串化的 JSON
  • jq -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。换句话说,这是可以安全使用的。


2. 使用字符串化的 JSON

老实说,这是一种痛苦,我避免了这种情况。

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\"}",
}'

3. 使用 JSON 文件的 filePathURL 获取attributes.json 。json NOT sqs-redrive-policy.json

这是我最后的选择。

原因

  • 这意味着在单个 go 中再次设置attributes.json文件中指定的所有属性。
  • 无法逃避将字符串化的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM