Serverless 订阅其他区域的 SNS

Posted

技术标签:

【中文标题】Serverless 订阅其他区域的 SNS【英文标题】:Serverless subscribe to SNS in another region 【发布时间】:2021-01-19 16:01:09 【问题描述】:

我在区域 eu-west-1 中有 SNS 主题 SNS1 和所有其他服务 SQS1 并且在 eu-central-1 我想要的是通过无服务器框架将我的 SQS 订阅到 SNS 主题

我当前的无服务器定义是

Resources:
  SNS1:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: "SNS1"
  SQS1:
    Type: "AWS::SQS::Queue"
    Properties:
      QueueName: "SQS1"
  snsSubscription:
    Type: "AWS::SNS::Subscription"
    Properties:
      TopicArn: !Ref SNS1
      Endpoint: !GetAtt
        - SQS2
        - Arn
      Protocol: sqs
      RawMessageDelivery: "true"

但这会在 eu-central-1(我的默认区域)中创建一个新的 SNS 主题,我不希望这样,是否有一些参数可以直接指定 SNS ARN? 或者 指定 SNS 的区域?

我已经尝试过这种配置,但它不起作用

Resources:
  SQS1:
    Type: "AWS::SQS::Queue"
    Properties:
      QueueName: "SQS1"
  snsSubscription:
    Type: "AWS::SNS::Subscription"
    Properties:
      TopicArn: "arn:aws:sqs:eu-west-1:776751225653:SNS1"
      Endpoint: !GetAtt
        - SQS2
        - Arn
      Protocol: sqs
      RawMessageDelivery: "true"

我得到错误:

发生错误:snsSubscription - 无效参数:TopicArn(服务:AmazonSNS;状态代码:400;错误代码:InvalidParameter;请求 ID:9494047a-f933-5ece-9af8-5cfbf94a78a4;代理:null)。

请注意,名称是虚构的,我的资源名称中没有数字

【问题讨论】:

【参考方案1】:

创建两个堆栈:

    在区域 1 中,创建 SNS 主题和所有其他区域 1 资源。 在区域 2 中,创建 SQS 队列、SNS 订阅和其他区域 2 资源。将区域 1 SNS 主题 ARN 作为输入参数传递给此堆栈(或者您可以使用区域 1 堆栈中的 CloudFormation 输出)。

【讨论】:

您能否详细描述一下区域 2 资源部分的外观?正如您在我的第二个片段中看到的那样,我尝试直接用 ARN 指向但不起作用 您已经展示了两个模板片段。它们代表什么?每个区域的堆栈?它们似乎无效(例如,对不存在的 SQS2 的引用)。 我只有一个堆栈,在 eu-central-1 区域,SNS 是由另一个应用程序创建的,我只想订阅

以上是关于Serverless 订阅其他区域的 SNS的主要内容,如果未能解决你的问题,请参考以下文章

五个Serverless技术常见误区

ArkUI eTS 云函数计算十二生肖[Serverless]

Spring Boot Serverless 实战系列“部署篇” | Mall 应用

云原生之上,亚马逊云科技发布多项容器与Serverless服务,持续发力现代化应用

Containers vs Serverless:你选择谁,何时选择?

小组项目