You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boto3创建EC2实例时如何指定securitygroup、实例类型等参数

boto3 client调用run_instances指定配置的方法

直接在run_instances方法里传入对应参数即可,常用配置对应参数如下:

  • 实例类型:InstanceType,传标准实例类型字符串,比如t3.micro、m5.large
  • 安全组:默认VPC环境下用SecurityGroups传安全组名称列表;非默认VPC环境下用SecurityGroupIds传安全组ID列表,该参数优先级高于名称传参
  • 其他常用启动参数:KeyName指定登录密钥对、SubnetId指定部署子网、BlockDeviceMappings覆盖存储卷配置、TagSpecifications给实例打标签、IamInstanceProfile指定实例绑定的IAM角色

完整示例代码:

import boto3

client = boto3.client('ec2', region_name="eu-central-1")
response = client.run_instances(
    ImageId="ami-0df63501d4a3233e8",
    MinCount=1,
    MaxCount=1,
    # 指定实例类型
    InstanceType="t3.micro",
    # 指定SSH登录密钥对
    KeyName="your-prod-key",
    # 非默认VPC传安全组ID
    SecurityGroupIds=["sg-0123456789abcdef"],
    # 指定部署子网
    SubnetId="subnet-0123456789abcdef",
    # 自定义根卷配置,覆盖AMI默认值
    BlockDeviceMappings=[
        {
            "DeviceName": "/dev/sda1",
            "Ebs": {
                "VolumeSize": 30,
                "VolumeType": "gp3",
                "DeleteOnTermination": True
            }
        }
    ],
    # 实例打标签
    TagSpecifications=[
        {
            "ResourceType": "instance",
            "Tags": [{"Key": "Name", "Value": "app-server-01"}]
        }
    ]
)
配置项与AMI的存储关系

AMI不会存储你提到的实例类型、安全组这类运行时配置,具体存储边界如下:

  • AMI内仅固化根卷快照数据、操作系统预装环境、默认块设备映射模板、CPU架构/虚拟化类型这类镜像基础信息
  • 实例类型、安全组、子网、密钥对、IAM角色、标签都属于实例启动时的外部配置,完全不随AMI保存,启动时如果不显式传参,会使用AWS平台默认值(比如不传实例类型会默认用老旧的通用实例类型,不传安全组会绑定默认VPC的默认安全组)
  • AMI自带的默认块设备配置可以被BlockDeviceMappings参数覆盖,不会强制生效
单元测试适配

基于boto3 client的实现可以直接用mock工具模拟接口返回,不需要依赖resource层的封装,测试逻辑更可控,pytest环境下的测试示例:

from moto import mock_aws
import boto3

@mock_aws
def test_ec2_creation():
    ec2_client = boto3.client("ec2", region_name="eu-central-1")
    # 前置创建测试安全组
    test_sg = ec2_client.create_security_group(GroupName="test-sg", Description="unit test sg")
    # 调用创建接口
    resp = ec2_client.run_instances(
        ImageId="ami-0df63501d4a3233e8",
        MinCount=1,
        MaxCount=1,
        InstanceType="t3.micro",
        SecurityGroupIds=[test_sg["GroupId"]]
    )
    # 断言校验
    created_ins = resp["Instances"][0]
    assert created_ins["InstanceType"] == "t3.micro"
    assert created_ins["SecurityGroups"][0]["GroupId"] == test_sg["GroupId"]

内容的提问来源于stack exchange,提问作者codedor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:36:23