CDK 2.x:如何为AWS组织/组织单元内账户授予ECR拉取权限?
AWS组织/跨账户ECR仓库拉取权限配置
你之前的代码是给特定IAM用户授予拉取权限,要实现基于组织单元(OU)或单独账户的跨账户访问,需要直接给ECR仓库添加资源策略,而非通过IAM用户授权。以下是完整的TypeScript实现:
核心代码实现
import * as iam from 'aws-cdk-lib/aws-iam'; import * as ecr from 'aws-cdk-lib/aws-ecr'; // 1. 配置授权目标(替换为实际值) const YOUR_ORG_ID = 'o-xxxxxxxxxx'; // 你的AWS组织ID const ALLOWED_OUS = ['ou-xxxx-yyyyyyyy', 'ou-xxxx-zzzzzzzz']; // 允许访问的OU ID列表 const ALLOWED_ACCOUNTS = ['123456789012']; // 额外允许的单独账户ID(可选) // 假设你的ECR仓库实例已经定义,比如: // const repository = ecr.Repository.fromRepositoryName(this, 'MyRepo', 'my-repo-name'); // 2. 构建OU权限策略语句 const ouPolicyStatements = ALLOWED_OUS.map(ouId => new iam.PolicyStatement({ actions: [ 'ecr:GetDownloadUrlForLayer', 'ecr:BatchGetImage', 'ecr:BatchCheckLayerAvailability' ], principals: new iam.AnyPrincipal(), resources: [repository.repositoryArn], conditions: { StringEquals: { 'aws:PrincipalOrgID': YOUR_ORG_ID, 'aws:PrincipalOrgPaths': [`${ouId}/*`] // 匹配该OU及其所有子OU下的账户 // 若仅需匹配当前OU(不含子OU),替换为 `${ouId}` } } })); // 3. 构建单独账户权限策略语句(可选) const accountPolicyStatements = ALLOWED_ACCOUNTS.map(accountId => new iam.PolicyStatement({ actions: [ 'ecr:GetDownloadUrlForLayer', 'ecr:BatchGetImage', 'ecr:BatchCheckLayerAvailability' ], principals: new iam.AccountPrincipal(accountId), resources: [repository.repositoryArn] })); // 4. 将策略附加到ECR仓库 repository.addToResourcePolicy(new iam.PolicyDocument({ statements: [...ouPolicyStatements, ...accountPolicyStatements] }));
关键说明
- 组织ID/OU ID获取:可在AWS Organizations控制台的对应OU详情页查看ID。
- 权限动作:这三个动作是容器拉取镜像的核心必要权限,不可省略。
- 条件匹配逻辑:
aws:PrincipalOrgPaths: "${ouId}/*":允许该OU下所有账户(包括子OU中的账户)访问。- 若只需授权当前OU直接下属的账户,去掉
/*,使用"${ouId}"。
- 与原有IAM用户授权的兼容性:原有给
build-docker-access用户授权的代码可以保留,两种授权方式互不冲突。
内容的提问来源于stack exchange,提问作者Setjmp
相关产品推荐
相关产品推荐

