如何使用Boto3为AWS组织子账号创建EC2实例?
为AWS组织子账号创建EC2实例的Boto3实现方案
AWS组织的子账号是独立的AWS账号,无法通过主账号的Boto3客户端直接指定子账号创建EC2实例,需通过子账号身份凭证或跨账号角色扮演两种方式实现,现有创建实例的核心逻辑无需改动,仅需调整Boto3资源的初始化部分。
方式一:直接使用子账号凭证
子账号侧准备:
- 给子账号的IAM用户(不推荐用根用户)分配EC2实例创建权限,比如附加
AmazonEC2FullAccess管理策略,或自定义仅允许RunInstances等必要操作的策略。 - 生成该IAM用户的Access Key ID和Secret Access Key。
- 给子账号的IAM用户(不推荐用根用户)分配EC2实例创建权限,比如附加
修改Boto3初始化代码,替换为子账号凭证:
import boto3 # 替换为子账号的凭证信息 sub_account_ak = "子账号Access Key ID" sub_account_sk = "子账号Secret Access Key" region = "你的目标区域" # 用子账号身份初始化EC2资源 ec2 = boto3.resource( "ec2", region_name=region, aws_access_key_id=sub_account_ak, aws_secret_access_key=sub_account_sk ) # 原创建实例的代码完全保留,无需修改 instances = ec2.create_instances( ImageId="ami-xxxxxx", # 替换为你的AMI ID MinCount=1, MaxCount=1, InstanceType="t2.micro" )
方式二:主账号扮演子账号IAM角色(更安全,无需硬编码凭证)
如果不想在脚本中硬编码子账号凭证,可通过STS服务让主账号扮演子账号中创建的IAM角色,获取临时凭证后操作:
子账号侧配置:
- 创建一个IAM角色,信任策略中添加主账号的账号ID,允许主账号扮演该角色。
- 给该角色分配EC2实例创建权限(同方式一的权限要求)。
主账号侧Boto3代码调整:
import boto3 # 主账号调用STS服务获取子账号角色的临时凭证 sts_client = boto3.client("sts") assume_role_response = sts_client.assume_role( RoleArn="arn:aws:iam::子账号ID:role/你的角色名称", RoleSessionName="CreateEC2Session" # 自定义会话名称 ) temp_creds = assume_role_response["Credentials"] # 用临时凭证初始化EC2资源 ec2 = boto3.resource( "ec2", region_name="你的目标区域", aws_access_key_id=temp_creds["AccessKeyId"], aws_secret_access_key=temp_creds["SecretAccessKey"], aws_session_token=temp_creds["SessionToken"] ) # 原创建实例代码无改动 instances = ec2.create_instances(...)
关键注意事项
- 若要让子账号使用独立信用卡付费,需在AWS组织控制台开启成员账户自行付费模式,否则默认由主账号统一承担所有子账号费用。
- 凭证管理建议:不要硬编码凭证到代码中,优先使用环境变量、AWS Secrets Manager,或在EC2实例上关联IAM角色(若脚本运行在EC2上)。
内容的提问来源于stack exchange,提问作者rare77
相关产品推荐
相关产品推荐

