在 LocalStack 上通过 Cloudformation 创建 AWS::SNS:订阅时出错

问题描述 投票:0回答:1

当前行为

使用时出现错误

awslocal cloudformation deploy --template-file infrastructure.yaml --stack-name teststack

关于这个

infrastructure.yaml

Parameters:

  Environment:
    Default: svts
    Description: Deployment environment
    Type: String

  AwsSt:
    Default: test
    Description: Project technical service
    Type: String

  AwsTeam:
    Default: fra
    Description: Team id
    Type: String

  Component:
    Default: relm-adapter
    Description: An identifier for the app
    Type: String

Resources:

  CreateAccountEventQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Sub "${AwsTeam}_${AwsSt}_${Environment}_sqs_create_account_event"
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt CreateAccountEventDLQueue.Arn
        maxReceiveCount: 3

  CreateAccountEventDLQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Sub "${AwsTeam}_${AwsSt}_${Environment}_sqs_dlq_create_account_event"

  QueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      Queues:
        - !Ref CreateAccountEventQueue
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: sns.amazonaws.com
            Action:
              - sqs:SendMessage
            Resource: "*"
            Condition:
              ArnEquals:
                aws:SourceArn:
                  !Sub "${AwsTeam}_${AwsSt}_${Environment}_sns_create_account_event_topic"

  CreateAccountEventSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Sub "${AwsTeam}_${AwsSt}_${Environment}_sns_create_account_event_topic"
      Endpoint: !GetAtt CreateAccountEventQueue.Arn
      Protocol: sqs

  CreateAccountEventTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub "${AwsTeam}_${AwsSt}_${Environment}_sns_create_account_event_topic"
      TopicName: !Sub "${AwsTeam}_${AwsSt}_${Environment}_sns_create_account_event_topic"

堆栈创建失败并出现此错误(从

awslocal describe-stack-events
检索):

{
            "StackId": "arn:aws:cloudformation:us-east-1:000000000000:stack/teststack/f91977a8",
            "EventId": "36f1855e-d41e-410a-a2cb-2d08b61f8918",
            "StackName": "teststack",
            "LogicalResourceId": "CreateAccountEventSubscription",
            "PhysicalResourceId": "arn:aws:cloudformation:us-east-1:000000000000:stack/teststack/f91977a8",
            "ResourceType": "AWS::SNS::Subscription",
            "Timestamp": "2024-01-30T09:42:19.531000Z",
            "ResourceStatus": "CREATE_FAILED",
            "ResourceStatusReason": "An error occurred (InternalError) when calling the Subscribe operation (reached max retries: 4): exception while calling sns.Subscribe: not enough values to unpack (expected 6, got 1)"
},

这是错误日志:

2024-01-30 10:47:53 2024-01-30T09:47:53.376 ERROR --- [   asgi_gw_0] l.aws.handlers.logging     : exception during call chain: not enough values to unpack (expected 6, got 1)
2024-01-30 10:47:54 2024-01-30T09:47:54.202 ERROR --- [   asgi_gw_0] l.aws.handlers.logging     : exception during call chain: not enough values to unpack (expected 6, got 1)
2024-01-30 10:47:54 2024-01-30T09:47:54.932 ERROR --- [   asgi_gw_0] l.aws.handlers.logging     : exception during call chain: not enough values to unpack (expected 6, got 1)
2024-01-30 10:47:56 2024-01-30T09:47:56.430 ERROR --- [   asgi_gw_0] l.aws.handlers.logging     : exception during call chain: not enough values to unpack (expected 6, got 1)
2024-01-30 10:47:58 2024-01-30T09:47:58.517 ERROR --- [   asgi_gw_0] l.aws.handlers.logging     : exception during call chain: not enough values to unpack (expected 6, got 1)
2024-01-30 10:47:58 2024-01-30T09:47:58.521  WARN --- [functhread12] l.s.c.resource_provider    : Error calling <bound method ClientCreator._create_api_method.<locals>._api_call of <botocore.client.SNS object at 0xffff4efcfc10>> with params: {'TopicArn': 'test_fra_svts_sns_create_account_event_topic', 'Protocol': 'sqs', 'Endpoint': 'arn:aws:sqs:us-east-1:000000000000:test_fra_svts_sqs_create_account_event', 'Attributes': {}} for resource: {'Type': 'AWS::SNS::Subscription', 'LogicalResourceId': 'CreateAccountEventSubscription', 'Properties': {'TopicArn': 'test_fra_svts_sns_create_account_event_topic', 'Endpoint': 'arn:aws:sqs:us-east-1:000000000000:prov_fra_svts_sqs_create_account_event', 'Protocol': 'sqs'}, 'SpecifiedProperties': {'TopicArn': 'test_fra_svts_sns_create_account_event_topic', 'Endpoint': 'arn:aws:sqs:us-east-1:000000000000:test_fra_svts_sqs_create_account_event', 'Protocol': 'sqs'}}

预期行为

它应该创建我的堆栈资源

您如何启动 LocalStack?

使用

docker run
命令

重现步骤

从 Docker Desktop 运行 localstack,暴露端口 4566 并安装 /var/run/docker.sock

环境

- OS: Ubuntu 23.10 / MacOs Sonoma 14.3
- LocalStack: LocalStack version: 3.1.1.dev
amazon-web-services aws-cloudformation amazon-sns localstack
1个回答
0
投票

我怀疑这可能是一个依赖性问题。尝试使用

!GetAtt
将其更改为引用主题 ARN,以确保在 CloudFormation 尝试订阅主题之前已完成创建主题。

  CreateAccountEventSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !GetAtt CreateAccountEventTopic.TopicArn
      Endpoint: !GetAtt CreateAccountEventQueue.Arn
      Protocol: sqs

或者将订阅设置为主题的属性

© www.soinside.com 2019 - 2024. All rights reserved.