如何自动化分配IAM Identity Center用户到CDK创建的AWS账户?
解决方案:自动化IAM Identity Center用户分配到新建AWS账户
一、核心背景说明
目前AWS CDK确实没有直接封装IAM Identity Center(原AWS SSO)的用户/组到账户权限集分配的专属构造,AWS CLI也没有一键式的批量分配命令,但可以通过在CDK中集成AWS SDK或CLI脚本结合部署流程两种方式实现自动化分配。
二、方式1:TypeScript CDK中集成AWS SDK实现
利用CDK的CustomResource或部署钩子,调用IAM Identity Center的SDK接口,在新建账户完成后自动执行分配操作。
步骤示例
提前准备必要信息
先在IAM Identity Center控制台创建好目标权限集,再通过CLI获取实例ARN和权限集ARN:# 获取IAM Identity Center实例ARN aws sso-admin list-instances # 获取目标权限集ARN aws sso-admin list-permission-sets --instance-arn <你的实例ARN> # 获取要分配的用户ID(若分配组则替换为list-groups) aws sso-admin list-users --instance-arn <你的实例ARN>CDK代码中添加自动分配逻辑
在创建AWS账户的Stack中,新增CustomResource通过Lambda调用CreateAccountAssignmentAPI:import * as cdk from 'aws-cdk-lib'; import * as iam from 'aws-cdk-lib/aws-iam'; import * as customres from 'aws-cdk-lib/custom-resources'; import { Construct } from 'constructs'; export class AccountProvisionStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 假设已通过CDK创建新账户,这里用变量存储账户ID const newAccountId = '123456789012'; // 替换为你的实际参数 const ssoInstanceArn = 'arn:aws:sso:::instance/ssoins-xxxxxxxxx'; const permissionSetArn = 'arn:aws:sso:::permissionSet/ssoins-xxxxxxxxx/ps-xxxxxxxxx'; const targetUserId = 'user-xxxxxxxxx'; // 创建执行分配操作的Lambda角色 const ssoAssignRole = new iam.Role(this, 'SsoAccountAssignRole', { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'), ], }); // 赋予角色SSO账户分配权限 ssoAssignRole.addToPolicy(new iam.PolicyStatement({ actions: ['sso:CreateAccountAssignment'], resources: [ `${ssoInstanceArn}/accountAssignments/*`, permissionSetArn, ], })); // 自定义资源执行用户分配 new customres.AwsCustomResource(this, 'AssignUserToNewAccount', { onCreate: { service: 'SSOAdmin', action: 'createAccountAssignment', parameters: { InstanceArn: ssoInstanceArn, TargetId: newAccountId, TargetType: 'AWS_ACCOUNT', PermissionSetArn: permissionSetArn, PrincipalType: 'USER', PrincipalId: targetUserId, }, physicalResourceId: customres.PhysicalResourceId.of(`assign-${targetUserId}-${newAccountId}`), }, role: ssoAssignRole, // 添加重试逻辑,应对账户同步延迟 retryAttempts: 3, retryDelay: cdk.Duration.minutes(2), }); } }若需分配组而非用户,仅需将
PrincipalType改为GROUP,PrincipalId替换为目标组ID即可。
三、方式2:AWS CLI脚本结合部署流程
如果偏好轻量化脚本方案,可在CDK部署完成后,通过Shell脚本调用CLI完成分配:
示例bash脚本
#!/bin/bash # 配置参数 SSO_INSTANCE_ARN="arn:aws:sso:::instance/ssoins-xxxxxxxxx" PERMISSION_SET_ARN="arn:aws:sso:::permissionSet/ssoins-xxxxxxxxx/ps-xxxxxxxxx" NEW_ACCOUNT_ID="123456789012" TARGET_USER_ID="user-xxxxxxxxx" # 检查账户是否已同步到SSO(避免因同步延迟导致失败) check_account_sync() { aws sso-admin list-accounts --instance-arn $SSO_INSTANCE_ARN | grep -q $NEW_ACCOUNT_ID return $? } # 等待账户同步 echo "等待新账户同步到IAM Identity Center..." until check_account_sync; do sleep 60 done # 执行用户分配 aws sso-admin create-account-assignment \ --instance-arn $SSO_INSTANCE_ARN \ --target-id $NEW_ACCOUNT_ID \ --target-type AWS_ACCOUNT \ --permission-set-arn $PERMISSION_SET_ARN \ --principal-type USER \ --principal-id $TARGET_USER_ID echo "用户分配完成"
可将该脚本与cdk deploy命令串联,比如在CDK部署成功后自动执行:
cdk deploy --require-approval never && ./assign-sso-user.sh
四、关键注意事项
- 权限要求:执行CDK或脚本的身份必须拥有
SSOAdmin:CreateAccountAssignment权限,以及访问IAM Identity Center实例和权限集的权限。 - 账户同步延迟:新创建的AWS账户同步到IAM Identity Center需要几分钟,需添加等待或重试逻辑避免分配失败。
- 批量处理:若需批量分配多用户/多账户,可通过循环遍历用户列表、账户列表实现批量操作。
内容的提问来源于stack exchange,提问作者arhe10
相关产品推荐
相关产品推荐

