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。
我正在尝试通过 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。