我已阅读"在政策中指定主体" doc:https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html,我从那里推断出一些行为和其他SO(如aws lambda function getting access denied when getObject from s3)那些没有专门处理Cloudformation的问题。
当我尝试创建一个允许外部角色访问本地存储桶的策略时,我仍然对此错误感到困惑。来自Cloudformation的错误是:Policy document should not specify a principal.
我有两个AWS账户。帐户A创建一个存储桶,我想授予帐户B对它的写入权限。
在帐户A Cloudformation中我创建了一个策略,授予对所述存储桶的帐户B角色访问权限。来自https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html的指南。帐户B存在该角色。
AccountBWriteToS3Policy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyName: AccountBWriteToS3Policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Principal:
AWS: 'arn:aws:iam::123456789876:role/AccountBRole'
Effect: Allow
Action:
- 's3:PutObject'
- 's3:ListBucket'
Resource: !Sub
- '${bucketArn}/*'
- bucketArn: !GetAtt
- AccountABucket
- Arn
Roles:
- AccountARole
但是,cloudformation无法执行,并返回错误
Policy document should not specify a principal.
我很难过。
任何人都可以解释此错误吗?
任何人都可以规定前进的道路吗?
这似乎是一个简单而常见的需求,涵盖在众多例子中。也许我应该在存储桶声明中指定策略,而不是创建一个帐户范围的策略?
答案 0 :(得分:2)
您需要使用"信任政策"创建一个角色?遵循原则,然后是一个许可政策"允许对S3 Bucket进行读/写访问。
以下是我的Cloudformation的摘录。
Role:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub '${RuleName}-Role'
Path: "/"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal: !Sub 'arn:aws:iam::${AccountID}:user/*'
Action: sts:AssumeRole
RolePolicies:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: !Sub '${RuleName}-RolePolicies'
Roles:
- Ref: "Role"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:Get*
- s3:Put*
- s3:List*
- s3:AbortMultipartUpload
Resource:
- !Ref Bucket