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

8qgya5xd  于 2022-11-28  发布在  Jenkins
关注(0)|答案(3)|浏览(209)

我正在尝试使用下面的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

错误消息

参数验证失败:参数属性的类型无效。RedrivePolicy,值:(),(最大接收计数',u'15')]),类型:,有效类型:

pcrecxhr

pcrecxhr1#

您是否尝试过在一个单独的文件中创建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
kuhbmx9i

kuhbmx9i2#

如果要在同一命令中运行,可以使用以下示例:

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"
}'
5gfr0r5j

5gfr0r5j3#

实现此目的的三种方法:

注意:这些解决方案也适用于需要字符串化JSON的任何其他AWS CLI命令

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

建议使用此方法的原因有很多:

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

安装Ubuntu:sudo apt install jq
基本选项:

  • jq -R:返回字符串化JSON
  • jq -c:消除空格和换行符

这样做的好处是,您可以将JSON写成JSON,然后将结果通过管道传输到jq -R命令中。

    • 方法1:**
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覆盖为空。换句话说,这是安全的。

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.使用指向attributes.json而不是sqs-redrive-policy.json的JSON文件的filePathURL

这是我最后的选择。

    • 原因**:
  • 这意味着一次性再次设置在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

相关问题