【问题标题】:How to add a redrive policy (dead-letter queue / DLQ) to a SNS subscription, with Ansible and AWS如何使用 Ansible 和 AWS 将重新驱动策略(死信队列/DLQ)添加到 SNS 订阅
【发布时间】:2020-08-07 05:55:27
【问题描述】:

在我的 Ansible 脚本中:

- name: Subscribe lambda to SNS topic example1
  sns_topic:
    name: "example1-{{env_name}}"
    purge_subscriptions: no
    subscriptions:
      - endpoint: "arn:aws:lambda:{{ aws.region }}:{{ aws.account }}:function:{{repo_name}}-{{env_name}}"
        protocol: "lambda"

它有效,结果是我的 lambda 订阅了我的 SNS 主题。

现在,我想向此订阅添加 DLQ。 我已经有一个 SQS,我想将其声明为我的 DLQ。

所以我这样重写我的代码:

- name: Subscribe lambda to SNS topic example1
  sns_topic:
    name: "example1-{{env_name}}"
    purge_subscriptions: no
    subscriptions:
      - endpoint: "arn:aws:lambda:{{ aws.region }}:{{ aws.account }}:function:{{repo_name}}-{{env_name}}"
        protocol: "lambda"
        redrive_policy:
          dead_letter_target_arn: "arn:aws:{{ aws.region }}:{{ aws.account }}:dlq-for-example1"

这不起作用,我在 Ansible 或谷歌搜索中没有找到任何东西......

我做错了什么?

【问题讨论】:

    标签: amazon-web-services aws-lambda ansible amazon-sqs amazon-sns


    【解决方案1】:

    看起来您在最后一行的arn:aws:{{aws.region}} 之间缺少sqs

    dead_letter_target_arn: "arn:aws:sqs:{{ aws.region }}:{{ aws.account }}:dlq-for-example1"
    

    【讨论】:

    • 经过多次不同的尝试,没有解决方案。然而,与此同时,发生了一些变化,所以我添加了一个从 SNS 接收消息的 SQS。因此,我为 SQS 设置了 DLQ 并且它可以工作(当 SQS 之后的 lambda 无法正确处理消息时)。现在这种情况相当严重。
    • 如果 SQS 关闭,SNS 将无法传递通知。所以为 SNS 设置 DLQ 可能是个好主意。
    【解决方案2】:

    问题是嵌入在 SNS Topic 中的 Subscription 属性只有两个属性:Endpoint 和 Protocol(参见Subscription Property)。

    对于更高级的设置,例如 RedrivePolicy,您需要使用独立的 AWS::SNS::Subscription 资源(请参阅 Subscription Resource)。

    由于 AWS::SNS::Subscription 是独立的,因此您必须包含订阅绑定到的 TopicArn。另请注意,RedrivePolicy 是 Json 格式。

    这是来自Redrive Syntax 的 Cloud Formation 语法的简单示例:

    {
      "Resources": {
        "mySubscription": {
          "Type" : "AWS::SNS::Subscription",
          "Properties" : {
            "Protocol": "sqs",
            "Endpoint": "arn:aws:sqs:us-east-2:123456789012:MyEndpoint",
            "TopicArn": "arn:aws:sns:us-east-2:123456789012:MyTopic",
            "RedrivePolicy": {
              "deadLetterTargetArn":
                "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"
            }
          }
        }
      }
    }
    

    但我不知道 Ansible 是如何进行这些翻译的。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 2021-02-07
      • 2022-06-10
      • 1970-01-01
      • 2021-06-24
      • 2015-12-07
      • 2021-12-05
      • 2018-04-23
      • 2019-12-07
      相关资源
      最近更新 更多