首页 > 解决方案 > 错误:“主题不存在”使用 SAM 模板创建 SNS 主题?

问题描述

我一直在尝试创建 SNS 主题并将消息发布到这些主题?但是在 dev 上部署后,我收到错误“主题不存在”?

SNS 主题 SAM 代码:

    ItemServiceTopic:
        Type: AWS::SNS::Topic
        Properties:
            DisplayName: 'ItemServiceTopic'
            FifoTopic: true
            KmsMasterKeyId: !Ref KMSDecryptKey
            TopicName: 'item-service-dev-topic.fifo'

用于向 SNS 发布消息的 Lambda

    PostItem:
        Type: AWS::Serverless::Function
        Properties:
            Handler: handlers/item-handler.postItem
            Layers:
                - !Ref NodeDependenciesLayer
            Events:
                PostItemApi:
                    Type: Api
                    Properties:
                        RestApiId: !Ref ItemServiceApiG
                        Path: /v0/items
                        Method: POST
            Policies:
                - AWSSecretsManagerGetSecretValuePolicy:
                    SecretArn: !Sub 'arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:ItemServiceSecrets-d768io'
                
                - KMSDecryptPolicy:
                    KeyId: !Ref KMSDecryptKey 

                - SNSPublishMessagePolicy:
                    TopicName: !Sub 'arn:aws:sns:${AWS::Region}:${AWS::AccountId}:item-service-topic.fifo'

有没有办法解决上述错误?

注意:我已将 SNS 添加到现有的 SAM 模板文件中,但我觉得它没有创建 SNS,因此在运行“postItem”处理程序时它失败说没有找到 SNS 主题

标签: amazon-web-servicesamazon-snsaws-samaws-sam-cli

解决方案


尝试使用 REFSNSPublishMessagePolicy

PostItem:
  Type: AWS::Serverless::Function
  Properties:
    Handler: handlers/item-handler.postItem
    Layers:
      - !Ref NodeDependenciesLayer
    Events:
      PostItemApi:
        Type: Api
        Properties:
          RestApiId: !Ref ItemServiceApiG
          Path: /v0/items
          Method: POST
    Policies:
      - AWSSecretsManagerGetSecretValuePolicy:
          SecretArn: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:ItemServiceSecrets-d768io"
      - KMSDecryptPolicy:
          KeyId: !Ref KMSDecryptKey
      - SNSPublishMessagePolicy:
          TopicName: !Ref ItemServiceTopic

这样 Cloudformation 应该知道在更新 lambda 函数之前,更新函数需要 SNS 主题首先存在


推荐阅读