跨AWS账户:IAM组无法作为Principal时,如何让Account2用户访问Account1的S3桶?
跨账户S3访问解决方案:无需频繁更新桶策略
错误原因
你遇到的Invalid principal in policy错误,是因为AWS资源策略(如S3桶策略)不支持将其他账户的IAM组直接设为Principal。IAM组仅能在同一账户的IAM策略中使用,跨账户场景下无法作为资源策略的信任主体。
解决方案:IAM角色+组策略联动
采用角色中转的方式,后续新增用户到Account2的robots-group时,无需修改Account1的任何配置,步骤如下:
1. Account1创建S3访问角色
创建名为VehicleS3AccessRole的IAM角色(名称可自定义):
- 信任策略:允许Account2的用户Assume该角色(替换
1234567890为Account2的账户ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1234567890:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::1234567890:user/*" } } } ] }
- 权限策略:赋予角色访问目标S3桶的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::company-vehicle-configurations-test/*" } ] }
2. Account2配置robots-group权限
编辑robots-group的IAM策略,允许组内用户AssumeAccount1的角色(替换0987654321为Account1的账户ID,VehicleS3AccessRole为你创建的角色名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::0987654321:role/VehicleS3AccessRole" } ] }
3. 物理机器访问流程
Account2的物理机器IAM用户需先调用sts:AssumeRole获取Account1角色的临时凭证,再用该凭证访问S3桶。主流AWS SDK均支持自动处理角色切换,只需配置角色ARN即可。
方案优势
- 新增用户到
robots-group时,仅需将用户加入组,无需修改Account1的任何策略,完全适配你的需求。 - 通过角色实现跨账户权限中转,兼顾安全性与可维护性。
内容的提问来源于stack exchange,提问作者Esben von Buchwald
相关产品推荐
相关产品推荐

