【问题标题】:How to add a new statement to an existing SQS QueuePolicy from another template?如何从另一个模板向现有 SQS QueuePolicy 添加新语句?
【发布时间】:2020-02-11 06:19:14
【问题描述】:

我有 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

需要做些什么来改变这种行为?

【问题讨论】:

    标签: amazon-web-services yaml amazon-cloudformation message-queue amazon-sqs


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 猜我必须朝这个方向(宏)前进,因为来自stackoverflow.com/questions/46648346/… 的示例的不同版本仍然会导致不应用第二个策略或重写生产者策略。谢谢!
    • 在上班途中考虑过,自定义资源将是另一种方法。如果您将构建管道部署到多个环境,自定义资源会更好地工作。否则,任何一种方式都应该有效。
    • 是的,它看起来真的很有趣。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-06-29
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多