【问题标题】:How do I confirm a subscription created using CloudFormation?如何确认使用 CloudFormation 创建的订阅?
【发布时间】:2018-07-19 00:28:57
【问题描述】:

我创建了一个 CF 脚本,该脚本创建了一个包含 Web 服务的 EC2 实例。它还创建了一个 SNS 主题和一个使用此 Web 服务作为其 http 端点的订阅。

脚本成功创建堆栈;主题和订阅存在。但是,订阅仍处于 PendingConfirmation 状态。

我必须做什么才能让我的脚本在创建时确认此订阅?

【问题讨论】:

  • 更好的设计是让您的应用程序在启动时订阅。
  • 事实证明,用于创建订阅的 CloudFormation 脚本是正常的,它是在尝试订阅时尚未完全初始化的端点服务器。这导致订阅结束,并保持在“等待确认”状态。这是由于数据库未及时准备好,导致 Web 服务调用超时。一个简单的 DependsOn 解决了时间冲突,因此是该问题的解决方案。谢谢大家的回答!

标签: amazon-web-services amazon-cloudformation amazon-sns


【解决方案1】:

我遇到了类似的问题,最终我的问题是 CloudFomation 模板配置错误。需要AWS::SQS::QueuePolicy 才能授予您的 SNS 主题向队列发送消息的权限。

    "SQSQueuePolicy": {
        "Properties": {
            "PolicyDocument": {
                "Id": "usecase1",
                "Statement": [
                    {
                        "Action": "SQS:SendMessage",
                        "Condition": {
                            "ArnEquals": {
                                "aws:SourceArn": {
                                    "Ref": "SnsTopic"
                                }
                            }
                        },
                        "Effect": "Allow",
                        "Principal": {
                            "AWS": "*"
                        },
                        "Resource": {
                            "Fn::GetAtt": [
                                "SqsQueue",
                                "Arn"
                            ]
                        },
                        "Sid": "1"
                    }
                ],
                "Version": "2012-10-17"
            },
            "Queues": [
                {
                    "Ref": "SqsQueue"
                }
            ]
        },
        "Type": "AWS::SQS::QueuePolicy"
    }

【讨论】:

    【解决方案2】:

    您需要Subscribe 到端点才能使其工作。

    读取 SubscribeURL 的值并访问该 URL。要确认订阅并开始在端点接收通知,您必须访问SubscribeURLURL(例如,通过向 URL 发送 HTTP GET 请求)

    当您访问该 URL 时,您将收到类似于以下 XML 文档的响应。该文档在 ConfirmSubscriptionResult 元素中返回端点的订阅 ARN。

    <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
      <ConfirmSubscriptionResult>
        <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
        <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId>
      </ResponseMetadata>
      </ConfirmSubscriptionResponse>
    

    作为访问SubscribeURL 的替代方法,您可以使用ConfirmSubscription 操作确认订阅,并将令牌设置为SubscriptionConfirmation 消息中的相应值。如果您希望仅允许主题所有者和订阅所有者能够取消订阅终端节点,请使用 AWS 签名调用 ConfirmSubscription 操作。

    你可以参考这个AWS Documentation

    希望对您有所帮助!

    【讨论】:

    • 感谢您的详细回答。您是否知道如何使用 CloudFormation 实现这些操作?
    • 您可以为此使用 CloudFormation 自定义资源,我想。它是一个您可以编写的可自定义 Lambda 函数,您可以将 SubscribeURL 传递给它,然后在您的 lambda 中使用 Boto 执行 ConfirmSubscription 操作。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2018-12-19
    • 1970-01-01
    • 2021-06-26
    • 2023-03-31
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多