LocalStack中CloudFormation创建AWS::SNS::Subscription失败报错
问题解决方案:LocalStack中CloudFormation部署SNS订阅失败(
not enough values to unpack) 核心问题原因
LocalStack 3.1.1.dev开发版本存在SNS订阅ARN解析的内部bug:当直接通过字符串拼接生成TopicArn而非引用资源时,无法正确解析ARN的完整结构,导致内部逻辑抛出解包错误。
解决方案
1. 切换到LocalStack稳定版本
开发版可能包含未修复的问题,改用正式稳定版启动:
docker stop localstack docker run -d -p 4566:4566 -v /var/run/docker.sock:/var/run/docker.sock localstack/localstack:3.1.0
2. 修改CloudFormation模板,正确引用资源ARN
避免直接拼接字符串生成ARN,改为通过资源引用获取标准格式的ARN:
修改后的infrastructure.yaml关键部分:
Resources: # 其他资源保持不变 QueuePolicy: Type: AWS::SQS::QueuePolicy Properties: Queues: - !Ref CreateAccountEventQueue PolicyDocument: Statement: - Effect: Allow Principal: Service: sns.amazonaws.com Action: - sqs:SendMessage Resource: !GetAtt CreateAccountEventQueue.Arn Condition: ArnEquals: aws:SourceArn: !GetAtt CreateAccountEventTopic.Arn # 引用SNS Topic的ARN CreateAccountEventSubscription: Type: AWS::SNS::Subscription Properties: TopicArn: !Ref CreateAccountEventTopic # 直接引用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"
3. 重新部署栈
awslocal cloudformation deploy --template-file infrastructure.yaml --stack-name teststack
验证步骤
- 检查栈是否创建成功:
awslocal cloudformation describe-stacks --stack-name teststack
- 验证SNS订阅是否存在:
awslocal sns list-subscriptions-by-topic --topic-arn $(awslocal sns list-topics | jq -r '.Topics[] | select(.TopicName | contains("create_account_event")) | .TopicArn')
内容的提问来源于stack exchange,提问作者framilano
相关产品推荐
相关产品推荐

