CloudFormation 角色使用 QueuePolicy Ref 作为 IAM 角色资源中的 ManagedPolicy?

CloudFormation Role using QueuePolicy Ref as a ManagedPolicy in IAM Role Resource?

我正在尝试通过 CloudFormation 创建 IAM 角色,但在尝试将 QueuePolicy 资源附加到 IAM::Role 资源时遇到此错误。

ARN stack-personSQSPolicy-3F02ILJ96DB1 is not valid. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: InvalidInput; Request ID: 4410ba76-30ce-4d15-be3c-6d5040f971f0)

这是我的 CloudFormation 角色和策略定义:

APIGatewaySQSRole:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Statement:
        - Action: 'sts:AssumeRole'
          Effect: Allow
          Principal:
            Service: apigateway.amazonaws.com
          Version: 2012-10-17
    ManagedPolicyArns:
      - !Ref personSQSPolicy
      - 'arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs'
personSQSPolicy:
  Type: 'AWS::SQS::QueuePolicy'
  Properties:
    PolicyDocument:
      Version: 2012-10-17
      Statement:
        Effect: Allow
        Action: 'sqs:SendMessage'
        Resource: !GetAtt personSQS.Arn
    Queues:
      - !Ref personSQS

如果不允许在 Role 资源中用作 Arn,Type: 'AWS::SQS::QueuePolicy' 有什么意义?看来我仍然需要在 IAM 角色资源块中手动创建该策略。

Policies:
  - PolicyDocument:
    Statement:
      - Action: sqs:SendMessage
        Effect: Allow
        Resource: !GetAtt 'personSQS.Arn'
      PolicyName: apig-sqs-send-msg-policy

有没有办法避免这种情况?

由于 SQS 队列可以公开访问,因此如果人们要在没有角色的情况下访问它,它们需要一种安全机制。

这就是为什么你有一个 QueuePolicy AWS::SQS::QueuePolicy,你可以为队列定义它,它可以应用于一个或多个队列。它将帮助您直接从队列的角度定义谁可以访问它,如何访问等等。

然后您使用 Cloudformation 属性 Queues 将您的 QueuePolicy 附加到您的队列(参见:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-policy.html#cfn-sqs-queuepolicy-queues

如果你想定义一个角色来访问你的队列,是的,你必须描述某种相同的策略,但这次是从访问它的资源的角度来看,但我仍然建议你保护使用队列策略访问您的队列。

关于你的最后一个问题,定义 QueuePolicy 并将其附加到你的队列是正确的方法。

注意,Queues 属性需要一个队列 URL 列表,而不是 ARN。