错误:使用SAM模板创建SNS主题的“主题不存在”?

问题描述

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

SNS主题SAM代码

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

Lambda,它将用于将消息发布到SNS

    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主题

解决方法

尝试为SNSPublishMessagePolicy使用REF

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主题的更新函数