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

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

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

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

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

关于amazon-web-services - 如何从另一个模板向现有 SQS QueuePolicy 添加新语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58379911/

相关文章:

ruby-on-rails - 超时::错误:Capistrano/Rubber 执行已过期

python - 在 python 中为文件名 (amazon S3) 添加动态内容配置

amazon-web-services - 是否可以为我在 AWS 上从头构建的当前 VPC 创建 YAML 文件?

arrays - 是否有用于共享列表或 map 的一部分的 YAML 语法?

amazon-web-services - LoadBalancer 中的 AWS 实例显示 "OutOfService"

aws-cloudformation - Amazon CloudFormation 是否规定将 RDS 实例部署到多可用区配置中的不同环境?

amazon-web-services - cloudformation 中的 YAML 格式错误。我该如何修复这个错误?

go - 我如何阅读这个 YAML?

mongodb - Mongod 无法识别 yaml 配置中的 net.http?

amazon-web-services - Binderhub 是否有 AWS 支持?