Как добавить новый оператор в существующую SQS QueuePolicy из другого шаблона? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть 2 службы с различными шаблонами YAML Cloudformation и я хочу добавить другую политику в политику очереди, определенную в службе производителя (чтобы позволить потребителю получать и удалять сообщения). Однако мое текущее решение просто переопределяет существующую политику вместо ее добавления (т. Е. В политике остается только роль службы обслуживания клиентов).

Это часть SQS шаблона Cloudformation для производителя:

  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

Что нужно сделать, чтобы изменить это поведение?

1 Ответ

1 голос
/ 14 октября 2019

Если вы просто хотите объединить политики очередей, напишите макрос облачной информации, который считывает определение политики из шаблона и объединяет его с существующей политикой очереди. Макрос получает json-версию шаблона, и вы можете манипулировать ею так, как вам нравится в лямбда-выражении, чтобы вы могли проверить существующую политику очереди и соответствующим образом обновить шаблон.

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

Альтернативный подход - просто ослабить политику очередей, так что большинство операций разрешено любым элементом в учетной записи. Затем добавьте права доступа к чтению и записи в очередь (например, к лямбдам) через отдельные роли. Таким образом, лямбда, выполняющая чтение, будет использовать одну роль, которая позволяет чтение, а лямбда, выполняющую запись, будет использовать другую роль, которая позволяет писать.

Очевидно, что это может не соответствовать тому, как вы устроили вашу безопасностьтак что может не подойти.

...