ecctl(Elastic Compute Control CLI)是阿里云弹性计算资源的命令行控制器,面向 Agent 和运维人员,提供一致的 产品/资源/动作 语法、JSON 优先的输出、可通过 ecctl schema 查询的命令说明,以及内置的等待与回读能力。关于 ecctl 的详细信息,请参考 ecctl 文档。
与 aliyun CLI 的区别
aliyun CLI 以「产品 + OpenAPI 操作」组织命令,例如 aliyun ecs RunInstances,参数使用 OpenAPI 原始字段名(InstanceType、ImageId、SecurityGroupId)。ecctl 则使用资源动作模型 ecctl ecs instance create,参数使用更短的资源字段(--type、--image、--sg),并提供以下增强能力:
自动将镜像名称解析为镜像 ID;
幂等创建,自动附带
ClientToken幂等键;自动等待实例进入
Running状态,并返回实例的最终信息;结构化的错误对象与恢复建议。
两者参数对应关系见文末 FAQ 的参数对照表。
准备工作
准备阿里云账号与权限
阿里云账号(主账号)拥有资源的所有权限,其 AccessKey 一旦泄露风险巨大。建议使用满足最小化权限需求的 RAM 用户的 AccessKey 来调用 ecctl。准备工作如下:
创建 RAM 用户并获取 AccessKey(AccessKey ID 和 AccessKey Secret),具体操作请参见创建 RAM 用户和创建 AccessKey。
给步骤一中创建的 RAM 用户授予操作云服务器 ECS 和专有网络 VPC 相关资源的权限,授权方式请参照为 RAM 用户新增授权。本文示例需要创建 ECS 实例、VPC、VSwitch、安全组、密钥对等资源,建议授予以下系统策略:
云产品
授予权限
专有网络 VPC
AliyunVPCFullAccess
云服务器 ECS
AliyunECSFullAccess
安装 ecctl
如果是临时调试,也可使用阿里云提供的云命令行 Cloud Shell,无需在本地安装 CLI。
根据操作系统选择安装方式:
macOS
使用 Homebrew 安装:
brew tap aliyun/ecctl https://github.com/aliyun/elastic-compute-control-cli
brew install ecctlWindows
在 GitHub Releases 下载 Windows 压缩包:
windows_amd64.zip(x86 架构)或windows_arm64.zip(ARM 架构)。解压,确认解压后包含
ecctl.exe。将该目录加入
PATH环境变量。右键点击开始,点击设置 > 系统。在左侧导航栏中,点击关于。
在关于面板中,找到相关设置。单击高级系统设置 > 环境变量。
在系统变量的
Path中新增一行,填入解压路径,并点击确定。
Linux
使用 Go 安装(需要 Go 1.25 或更高版本):
go install github.com/aliyun/elastic-compute-control-cli/cmd/ecctl@latest安装后若提示找不到 ecctl 命令,说明安装目录 $(go env GOPATH)/bin(默认 ~/go/bin)不在 PATH 中,可执行以下命令补充(以 bash 为例):
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc && source ~/.bashrc安装验证
打开新终端执行:
ecctl --version配置凭据与地域
如果本机已经存在 aliyun CLI 的本地配置(即已执行过 aliyun configure),可以直接使用,无需重新配置:ecctl 会读取同一份配置中的 profile、地域和凭据。
执行以下命令配置地域和 RAM 用户的 AccessKey 即可(<AccessKeyId>、<AccessKeySecret> 即步骤一中获取的 AccessKey):
ecctl configure set region cn-hangzhou
ecctl configure set access-key-id <AccessKeyId>
ecctl configure set access-key-secret <AccessKeySecret>更多配置项(输出格式、语言、profile、环境变量等)请参考 ecctl 配置文档。
查看命令(可选)
调用命令前可以查看命令说明:
# 查看命令说明(JSON 格式)
ecctl schema ecs.instance.create --brief
# 查看参数帮助
ecctl ecs instance create --helpschema:输出结构化 JSON,方便 Agent 解析。其中params字段列出各参数的说明与是否必填,contract字段声明 dry-run、幂等、等待等行为约定。--help:输出人类可读的帮助,包含用法示例(Examples)与参数列表(Resource Flags),必填参数以*标注。schema支持逐层查询:ecctl schema ecs→ecctl schema ecs.instance,可逐层定位可用命令。
创建 ECS 实例
查询库存(可选)
创建前可先确认目标地域、可用区是否有对应规格与系统盘库存。以查询杭州地区的 ecs.g7.large 规格实例为例,该命令会返回在杭州哪些可用区存在可用库存。
# 查询实例规格库存
ecctl call ecs DescribeAvailableResource \
--region cn-hangzhou \
--DestinationResource InstanceType \
--IoOptimized optimized \
--InstanceType ecs.g7.large确认目标实例规格和可用区库存后,可查询系统盘库存。使用 DestinationResource=SystemDisk 指定查询资源为系统盘,搭配 InstanceType、ZoneId 指定实例规格和可用区:
ecctl call ecs DescribeAvailableResource \
--region cn-hangzhou \
--ZoneId cn-hangzhou-b \
--ResourceType instance \
--DestinationResource SystemDisk \
--InstanceType ecs.g7.large \
--SystemDiskCategory cloud_essd若创建时因库存不足失败,ecctl 会在错误信息中自动给出对应的 DescribeAvailableResource 查询命令,详见错误处理。
创建前置资源
创建实例前需要先准备网络和安全组等资源。以下命令按顺序创建 VPC、交换机、安全组,为安全组放通所需端口,以及密钥对(可选);如果已有可用资源,可跳过此步骤,直接在创建实例时填入已有资源 ID:
# 1. 创建 VPC
ecctl vpc create --name demo-vpc --cidr 10.0.0.0/16 --region cn-hangzhou
# → 可通过 vpc.id 字段获取 VPC Id,如 vpc-bp1234567890example
# 2. 在 VPC 内创建交换机
ecctl vpc vswitch create \
--vpc vpc-bp1234567890example \
--zone cn-hangzhou-b \
--cidr 10.0.1.0/24 \
--name demo-vsw \
--region cn-hangzhou
# → 可通过 vswitch.id 字段获取交换机 Id,如 vsw-bp1234567890example
# 3. 创建安全组
ecctl ecs sg create \
--vpc vpc-bp1234567890example \
--name demo-sg \
--region cn-hangzhou
# → 可通过 security_group.id 字段获取安全组 Id,如 sg-bp1234567890example
# 4. 为安全组放通 SSH 登录所需的 22 端口入方向规则
ecctl ecs sg authorize sg-bp1234567890example --region cn-hangzhou --rule tcp:22@0.0.0.0/0
# 5.(可选)创建密钥对,用于后续 SSH 登录
# 生成密钥文件
ssh-keygen -t rsa -b 2048 -f <本地密钥文件路径>
# 导入已有密钥对, --public-key 需以 @ 开头并指向公钥文件(后缀为.pub)。
ecctl ecs keypair create \
--name web-key \
--region cn-hangzhou \
--public-key "@<本地公钥文件路径>"设置安全组规则时,0.0.0.0/0 表示允许任意 IP 访问 22 端口,仅适合测试环境快速验证。生产环境请改为授权指定 IP 或 IP 段(如 tcp:22@203.0.113.10/32),避免 SSH 端口暴露公网带来的暴力破解风险。
创建实例
把前置流程中得到的vSwitch、安全组 ID 填入 --vswitch、--sg。正式创建前,可先在命令末尾加上 --dry-run 触发服务端校验而不真正创建(仅支持 1 台实例,请不要设置 --amount参数):
ecctl ecs instance create \
--region cn-hangzhou \
--type ecs.g7.large \
--image aliyun_3 \
--sg sg-bp1234567890example \
--vswitch vsw-bp1234567890example该命令会:
先发起
RunInstances创建请求(自动携带幂等ClientToken);轮询
DescribeInstances,等待实例状态变为Running;返回实例的最终视图。
上述幂等与等待均为默认行为,可按需调整:
--idempotency-key:显式指定幂等标识(默认自动生成);--no-wait:创建后立即返回,不等待实例进入Running;--timeout:修改等待上限(默认等待实例进入Running,超时 300s),如--timeout 10m。
常用参数
下表列出创建实例时常用的参数。完整参数可执行 ecctl ecs instance create --help 查看,或参见 create 完整参数。ecctl 还内置镜像名称解析等 ECS 专项优化。
ecctl 参数 | 类型 | 说明 |
| string | 实例名称 |
| string | 镜像 ID 或名称;传名称时创建前自动解析为镜像 ID |
| string | 可用区 ID(不传时由系统在交换机所在可用区分配) |
| integer | 创建数量 |
| key_value,可重复 | 打标签,如 |
| string | 付费类型: |
| string | 实例登录密码 |
| string | 密钥对名称(与密码二选一,推荐) |
| object(JSON) | 系统盘配置,示例见下文「磁盘配置示例」 |
| object(JSON) | 数据盘配置,示例见下文「磁盘配置示例」 |
| string | 公网计费类型,如 |
| integer | 公网出带宽(Mbps),大于 0 即分配公网 IP |
磁盘配置示例
对象参数如 --system-disk、--data-disk 支持 key=value、JSON、@文件三种传入方式,本文以 JSON 为例:
# 系统盘:磁盘类型、容量(GiB)、ESSD 性能等级
--system-disk '{
"category": "cloud_essd",
"size": 40,
"performance_level": "PL1"
}'
# 数据盘:磁盘类型、容量(GiB)
--data-disk '{
"category": "cloud_essd",
"size": 100
}'结果与查询
创建成功时,ecctl 返回结构化 JSON(--output json 为默认输出模式),包含以下三部分:
actions:本次命令实际调用过的每个 OpenAPI 及其request_id,可用于排查问题或提交工单。等待阶段会轮询多次DescribeInstances,因此数组中通常包含多条记录;ecctl_capabilities_used:本次命令用到的ecctl内置能力,如auto_wait(自动等待实例就绪);instance:实例创建完成后的完整视图,包含id、status、网络配置等字段,后续操作(连接、释放)所需的实例 ID 即从这里获取。
输出示例(仅保留关键字段):
{
"actions": [
{"action_name": "RunInstances", "request_id": "A1B2C3D4-..."},
{"action_name": "DescribeInstances", "request_id": "B2C3D4E5-..."}
],
"ecctl_capabilities_used": ["auto_wait"],
"instance": {
"id": "i-bp1234567890example",
"name": "web-01",
"status": "Running"
// 其余字段省略
}
}创建完成后,也可以随时查询实例信息:get 按实例 Id 查看单台实例的详情,list 分页列出实例并通过 --filter 按状态、标签等条件过滤:
ecctl ecs instance get i-bp1234567890example --region cn-hangzhou
ecctl ecs instance list --region cn-hangzhou \
--filter status=Running --filter tag.env=prod完整示例
创建一台开通公网 IP、使用密钥对、挂载系统盘和数据盘、配置了标签和资源组的实例:
ecctl ecs instance create \
--region cn-hangzhou \
--zone cn-hangzhou-b \
--type ecs.g7.large \
--image aliyun_3 \
--sg sg-bp1234567890example \
--vswitch vsw-bp1234567890example \
--name web-01 \
--host-name web-01 \
--key-pair web-key \
--system-disk '{"category":"cloud_essd","size":40,"performance_level":"PL1"}' \
--data-disk '{"category":"cloud_essd","size":100}' \
--internet-charge-type PayByTraffic \
--internet-bandwidth-out 10 \
--tag env=prod --tag app=web \
--resource-group rg-bp1234567890example连接实例
创建完成后,可以通过公网 SSH 登录,也可以通过 ecctl 调用云助手在实例内执行命令。
SSH 登录
前提:分配公网 IP
通过公网 SSH 登录需要实例具备公网 IP。创建实例时添加以下两个参数即可分配,--internet-bandwidth-out 用于指定公网出带宽,取值大于 0 即分配公网 IP:
--internet-charge-type PayByTraffic \
--internet-bandwidth-out <带宽(单位Mbps)>创建时未分配公网 IP 的实例,可通过以下命令事后补充:
ecctl ecs instance update i-bp1234567890example \
--region cn-hangzhou \
--internet-bandwidth-out 5 \
--allocate-public-ip获取公网 IP
通过 --filter id=<实例 ID> 过滤目标实例:
ecctl ecs instance list --region cn-hangzhou --filter id=i-bp1234567890example公网 IP 位于输出的 instances[].public_ip_addresses 字段(数组,首个元素即实例公网 IP):
{
"instances": [
{
"id": "i-bp1234567890example",
"public_ip_addresses": [
"47.xx.xx.xx"
]
// 其余字段省略
}
]
}执行登录
根据创建时选择的登录凭据,执行对应的登录命令:
使用密钥对(
--key-pair):ssh -i <私钥文件路径> root@<公网 IP>使用密码(
--password):ssh root@<公网 IP>,按提示输入密码
通过云助手执行命令(无需公网 IP)
ecctl 通过云助手在实例内执行命令,自动等待执行完成并返回结果:
ecctl ecs instance exec i-bp1234567890example --region cn-hangzhou --command 'uname -a'释放资源
验证完实例后要及时释放,避免继续产生费用。删除前需先停止实例;运行中的实例需要显式 --force 才能强制释放:
# 停止后删除
ecctl ecs instance stop i-bp1234567890example --region cn-hangzhou
ecctl ecs instance delete i-bp1234567890example --region cn-hangzhou
# 或强制释放运行中的实例
ecctl ecs instance delete i-bp1234567890example --region cn-hangzhou --force释放后可用 list 确认实例已不存在:
ecctl ecs instance list --region cn-hangzhou --filter id=i-bp1234567890example错误处理
ecctl 的失败信息写到 stdout 的结构化 error 对象里,原始 OpenAPI 错误码与 RequestId 保留在 actions 中。创建实例时若规格在目标可用区无库存,会自动附加恢复建议:
{
"error": {
"kind": "service",
"code": "CloudAPIError",
"field": "type",
"retryable": false,
"suggested_action": "ecctl call ecs DescribeAvailableResource --region cn-hangzhou --DestinationResource InstanceType --InstanceType ecs.g7.large"
},
"actions": [
{
"action_name": "RunInstances",
"code": "InvalidResourceType.NotSupported",
"message": "instance type ecs.g7.large not exists in [cn-hangzhou-b]",
"request_id": "..."
}
]
}镜像名称不存在时返回 not_found 错误,提示 image not found。
FAQ
参数对照表
aliyun ecs RunInstances(部分)与 ecctl ecs instance create 参数对应关系:
aliyun CLI / OpenAPI | ecctl | 说明 |
|
| 地域(必填) |
|
| 实例规格(必填) |
|
| 镜像 ID 或名称(必填) |
|
| 安全组 ID(必填) |
|
| 交换机 ID(必填) |
|
| 实例名称 |
|
| 可用区 |
|
| 创建数量 |
|
| 付费类型 |
|
| 密钥对 |
|
| 密码 |
|
| 主机名 |
|
| 标签 |
|
| 系统盘 |
|
| 数据盘 |
|
| 公网计费类型 |
|
| 公网出带宽 |
|
| 幂等键 |
|
| 校验 |
|
| 用户数据 |