【问题标题】:Why does this SQSQueuePolicy fail to create in AWS CloudFormation?为什么此 SQSQueuePolicy 无法在 AWS CloudFormation 中创建?
【发布时间】:2020-08-13 05:40:44
【问题描述】:

我创建了以下 CloudFormation 模板:

AWSTemplateFormatVersion: 2010-09-09
Description: Creates all resources necessary to send SES emails & track bounces/complaints through AWS
Resources:
  IAMUser:
    Type: 'AWS::IAM::User'
    Properties:
      UserName: iam-ses-sqs
  SQSQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: ses-queue
  SNSTopic:
    Type: 'AWS::SNS::Topic'
    Properties:
      TopicName: sns-notifications
  IAMUserPolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: IAM_Send_SES_Email
      PolicyDocument:
        Statement:
          - Effect: Allow
            Action:
              - 'SES:SendEmail'
              - 'SES:SendRawEmail'
            Resource: 'arn:aws:ses:*:*:identity/*'
      Users:
        - !Ref IAMUser
  SQSQueuePolicy:
    Type: 'AWS::SQS::QueuePolicy'
    Properties:
      Queues:
        - !Ref SQSQueue
      PolicyDocument:
        Statement:
          - Action:
              - 'SQS:ReceiveMessage'
              - 'SQS:DeleteMessage'
              - 'SQS:GetQueueAttributes'
            Effect: Allow
            Resource: !Ref SQSQueue
            Principal:
              AWS:
                - !Ref IAMUser
  SNSTopicSubscription:
    Type: 'AWS::SNS::Subscription'
    Properties:
      Protocol: SQS
      Endpoint: !GetAtt 
        - SQSQueue
        - Arn
      TopicArn: !Ref SNSTopic

我想允许 IAMUser 对 SQSQueue 资源执行 SQS ReceiveMessage、DeleteMessage 和 GetQueueAttributes 操作。 SQSQueue 也应该订阅 SNSTopic。

在 CloudFormation 中使用此模板创建堆栈时,SQSQueue、SNSTopic、SNSTopicSubscription、IAMUser 和 IAMUserPolicy 都按该顺序创建没有问题。但是,SQSQueuePolicy 无法创建并生成错误消息: Invalid value for the parameter Policy. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidAttributeValue; Request ID: {request id})

为什么会失败,我应该如何修改模板以确保成功创建所有资源及其关联的策略/订阅?

【问题讨论】:

  • 将 IAM 用户添加到 SQS 队列策略中是相当奇怪的。如果您向用户授予访问权限,最好自己授予 IAM 用户该权限,而不是将其放入队列策略中。这样,当更多用户需要该权限时,或者当用户离开组织时,无需不断更改队列策略。它也可能达到长度限制。但是,在授予跨帐户权限时使用队列策略是很好的。

标签: amazon-cloudformation amazon-sqs


【解决方案1】:

我在您的 CloudFormation 模板中发现了两个问题。

第一个,就像 Marcin 所说的,资源引用必须是队列 ARN 而不是队列 URL。

Resource: !GetAtt SQSQueue.Arn

第二个是您的 AWS 参考是您的 IAM 用户,但它必须是账户 ID。

Principal:
  AWS:
    - !Ref 'AWS::AccountId'

也就是说,我能够使用此 CloudFormation 模板在我的帐户中成功创建 CloudFormation 堆栈:

AWSTemplateFormatVersion: 2010-09-09
Description: Creates all resources necessary to send SES emails & track bounces/complaints through AWS
Resources:
  IAMUser:
    Type: 'AWS::IAM::User'
    Properties:
      UserName: iam-ses-sqs
  SQSQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: ses-queue
  SQSQueuePolicy:
    Type: 'AWS::SQS::QueuePolicy'
    Properties:
      Queues:
        - !Ref SQSQueue
      PolicyDocument:
        Statement:
          - Action:
              - 'SQS:ReceiveMessage'
              - 'SQS:DeleteMessage'
              - 'SQS:GetQueueAttributes'
            Effect: Allow
            Resource: !GetAtt SQSQueue.Arn
            Principal:
              AWS:
                - !Ref 'AWS::AccountId'

【讨论】:

  • 非常感谢您的详细解释!我没有将 Principal 更改为引用 AWS::AccountId,而是使用了 !GetAtt IamUser.Arn。如果 CloudFormation/AWS 文档更清楚地说明 Ref 函数返回什么以及每个属性需要什么,那就太好了!
【解决方案2】:

以下将返回队列 URL,而不是 ARN:

Resource: !Ref SQSQueue

但您需要在策略中使用 queue ARN

Resource: !GetAtt SQSQueue.Arn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2021-07-30
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2020-12-15
    相关资源
    最近更新 更多