如何从另一个模板向现有 SQS QueuePolicy 添加新语句?

How to add a new statement to an existing SQS QueuePolicy from another template?

我有 2 个具有不同 Cloudformation YAML 模板的服务,我想将另一个策略添加到生产者服务中定义的队列策略(以允许消费者接收和删除消息)。但是,我当前的解决方案只是覆盖现有策略而不是附加它(即,策略中只保留消费者服务角色)。

这是生产者的 Cloudformation 模板 SQS 部分:

  ProducerQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Id: SQSPolicy
        Statement:
        - Effect: Allow
          Principal:
            AWS:
            - !GetAtt ServiceRole.Arn
          Resource: !GetAtt ProducerQueue.Arn
          Action:
          - 'sqs:DeleteMessage'
          - 'sqs:ReceiveMessage'
          - 'sqs:ListQueues'
          - 'sqs:SendMessage'
          - 'sqs:GetQueueUrl'
          - 'sqs:GetQueueAttributes'
      Queues: [ !Ref ProducerQueue ]

  ProducerDeadLetterQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: !Sub "${AWS::StackName}-ProducerDLQ.fifo"
      FifoQueue: true
      ContentBasedDeduplication: false

  ProducerQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: !Sub "${AWS::StackName}-ProducerQueue.fifo"
      FifoQueue: true
      MessageRetentionPeriod: 1209600
      ContentBasedDeduplication: false
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt ProducerDeadLetterQueue.Arn
        maxReceiveCount: 9

# Outputs -------------------------------------------------------------------------
Outputs:
  ProducerQueueUrl:
    Value: !Ref ProducerQueue
    Export:
      Name: ProducerQueueUrl
  ProducerQueueArn:
    Value: !GetAtt ProducerQueue.Arn
    Export:
      Name: ProducerQueueArn

这是面向消费者的 Cloudformation:

#SQS policy configuration for consumer
  ProducerQueueConsumptionPolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Id: SQSConsumptionPolicy
        Statement:
          - Effect: Allow
            Principal:
              AWS:
                - !GetAtt ServiceRole.Arn
            Resource:
              Fn::ImportValue: ProducerQueueArn
            Action:
              - 'sqs:DeleteMessage'
              - 'sqs:ReceiveMessage'
              - 'sqs:GetQueueUrl'
              - 'sqs:GetQueueAttributes'
      Queues:
        - Fn::ImportValue: ProducerQueueUrl

需要做什么才能改变这种行为?

如果您只想合并队列策略,请编写一个 cloudformation 宏,从模板中读取策略定义并将其与现有队列策略合并。该宏获得了模板的 json 版本,您可以在 lambda 中按照自己喜欢的方式操作它,以便您可以检查现有的队列策略并适当地更新模板。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html

另一种方法是削弱队列策略,以便帐户中的任何内容都允许大多数操作。然后通过不同的角色向队列(例如 lambdas)读取和写入任何内容添加权限。因此执行读取的 lambda 将使用一个允许读取的角色,而执行写入的 lambda 将使用允许写入的不同角色。

显然,这可能不符合您的安全安排,因此可能不合适。