ec2.runinstances 必须用结构体传参,imageid、instancetype、mincount、maxcount 四者缺一不可;安全组传 sg-xxx id,密钥对需预先存在;describeinstances 过滤用 "instance-state-name"="running" 和 "tag:name"="val";terminateinstances 后需 waituntilinstanceterminated 确认;本地调试需确保 aws_profile 匹配且显式指定 region。

aws-sdk-go-v2 的 ec2.RunInstances 怎么传参才不报错
多数人卡在第一个请求就返回 InvalidParameterValue 或 MissingParameter,根本原因是 v2 SDK 不再接受扁平 map,必须用结构体显式构造参数。
常见错误现象:直接把 AWS 控制台生成的 JSON 复制过来,用 map[string]interface{} 强转,结果 RunInstances 根本不认;或者漏掉 MinCount/MaxCount(这两个是必填,哪怕只起 1 台)。
-
ImageId、InstanceType、MinCount、MaxCount四个字段缺一不可 - 安全组必须传 ID(
sg-xxx),不能传名字;若用名字,得先调ec2.DescribeSecurityGroups查 ID - 密钥对(
KeyName)如果没提前创建好,会报InvalidKeyPair.NotFound,不是权限问题 - v2 SDK 默认不自动重试,网络抖动时可能直接失败,建议包装一层带指数退避的调用
如何用 ec2.DescribeInstances 精准过滤运行中的 EC2
很多人写 Filters 时用错字段名或值格式,导致查不到实例——v2 的 filter key 是字符串字面量,不是 Go 字段名,且部分值要加前缀。
使用场景:脚本需要确认某台实例是否已进入 running 状态,或按 Tag 查找(比如 env=prod)。
立即学习“go语言免费学习笔记(深入)”;
- 状态过滤必须用
filter.Name = "instance-state-name",值为"running"(不是"Running"或ec2.InstanceStateNameRunning字符串常量) - Tag 过滤写法是
filter.Name = "tag:Name",值为"my-app-server";注意冒号是字面量,不能写成"tag.Name" - 多个 filter 是 AND 关系,但同一个 filter 的
Values是 OR;想查多个 tag,得加多个Filter结构体 - 别忽略
NextToken:结果超 1000 条时不会报错,但只返回第一页,需循环拉取
终止实例时 ec2.TerminateInstances 返回成功却没关机
这不是 SDK bug,而是 AWS 的“软终止”行为:调用后实例状态变成 shutting-down,但真正关机耗时不定。脚本若立刻退出,可能误判为失败或遗漏清理。
性能影响:频繁轮询 DescribeInstances 会触发 API 限流(默认 5 QPS),尤其批量操作时容易被 throttle。
- 必须检查返回的
TerminatingInstances字段里每个实例的CurrentState.Name是否为"shutting-down"或"terminated",不能只看 HTTP 状态码 200 - 等待终止完成建议用
ec2.WaitUntilInstanceTerminated,它内置了退避和最大重试次数,比手写 for+sleep 更稳 - 如果目标实例已被手动终止,
TerminateInstances仍会返回成功(因为“终止一个已终止的实例”是合法空操作),所以不能靠返回值判断是否真执行了动作
本地调试时 AWS_PROFILE 不生效的几个硬坑
v2 SDK 默认读 AWS_PROFILE,但一旦代码里显式传了 config.WithCredentials 或用了 session.Must(v1 遗留写法),环境变量就会被绕过,且无任何警告。
兼容性影响:CI 环境常用 AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY,而本地开发倾向用 named profile;混用时极易出错。
- 检查是否在
config.LoadDefaultConfig里写了config.WithCredentials——删掉,让 SDK 自己按标准链加载 - profile 名必须完全匹配
~/.aws/credentials里的 section 名,大小写敏感,且不能带空格 - region 必须显式指定:
config.WithRegion("us-east-1"),否则某些操作(如RunInstances)会报MissingRegion,即使 profile 里配置了region - 用
aws configure list验证当前生效的 profile 和 region,比猜更可靠
最麻烦的其实是跨账户角色假设(AssumeRole)后的 credential chain 断裂——这时候 AWS_PROFILE 指向的只是源账户,而 SDK 不会自动帮你换 role session,得自己实现 credentials.Credentials 接口。










