通过AWS JavaScript API管理EC2实例:列表示例及AMI ID获取方法
嘿,刚好我之前在做EC2自动化的时候也碰到过AMI ID的坑,这就帮你一步步解决这些问题!
解决AWS EC2 JavaScript API的两个核心问题:列出实例 + 正确使用AMI ID创建实例
一、先搞定「列出所有可用EC2实例」的JS代码
我用AWS SDK v3来写,这是现在官方推荐的版本,代码更模块化。记得先安装依赖:npm install @aws-sdk/client-ec2
import { EC2Client, DescribeInstancesCommand } from "@aws-sdk/client-ec2"; // 初始化EC2客户端,AWS凭证可以通过环境变量、~/.aws/credentials文件或者IAM角色配置 const ec2Client = new EC2Client({ region: "us-east-1" }); // 替换成你实际使用的区域 async function listEC2Instances() { try { const command = new DescribeInstancesCommand({}); const response = await ec2Client.send(command); // 把嵌套的实例列表扁平化,方便输出 const instances = response.Reservations?.flatMap(reservation => reservation.Instances) || []; console.log(`找到 ${instances.length} 个EC2实例:`); instances.forEach(instance => { console.log(`- 实例ID: ${instance.InstanceId}, 状态: ${instance.State.Name}, 可用区: ${instance.Placement.AvailabilityZone}`); }); return instances; } catch (error) { console.error("列出实例时出错了:", error); throw error; } } // 直接调用函数就能看到结果 listEC2Instances();
二、关于有效AMI ID的问题:为什么你的创建请求失败?
大概率是这两个原因:
- AMI ID是区域绑定的:比如us-east-1的
ami-xxxx不能直接用在eu-west-1,跨区域用肯定报错。 - AMI权限问题:有些AMI是私有(比如你自己创建的)或者仅限特定AWS账户访问,你没有权限使用也会提示无效。
1. 获取有效AMI ID的几个靠谱途径
- AWS控制台手动找:
登录EC2控制台,进入「AMIs」页面,选择「公共AMIs」(如果用官方镜像),筛选你需要的操作系统(比如Amazon Linux 2、Ubuntu 22.04),然后复制对应区域的AMI ID就行。 - 用AWS CLI快速查:
比如查当前区域的Amazon Linux 2官方最新AMI:aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" --query "Images[0].ImageId" --output text - 通过JS API自动获取:这就是你要的方法,直接上代码!
2. 用JavaScript API获取有效AMI ID列表
同样用SDK v3,我们可以指定筛选条件,只拿官方的、可用的镜像:
import { EC2Client, DescribeImagesCommand } from "@aws-sdk/client-ec2"; const ec2Client = new EC2Client({ region: "us-east-1" }); // 替换成你的区域 async function getValidAMIs() { try { // 这里以获取Amazon Linux 2的官方HVM镜像为例,你可以修改过滤器适配其他系统 const command = new DescribeImagesCommand({ Owners: ["amazon"], // 只看亚马逊官方的镜像,避免第三方的 Filters: [ { Name: "name", Values: ["amzn2-ami-hvm-*-x86_64-gp2"] }, // 匹配Amazon Linux 2的镜像名称格式 { Name: "state", Values: ["available"] } // 只获取处于可用状态的AMI ] }); const response = await ec2Client.send(command); const amis = response.Images || []; console.log(`找到 ${amis.length} 个可用的官方AMI:`); amis.forEach(ami => { console.log(`- AMI ID: ${ami.ImageId}, 名称: ${ami.Name}, 创建时间: ${ami.CreationDate}`); }); // 返回最新创建的那个AMI(按时间排序取第一个) const latestAmi = amis.sort((a, b) => new Date(b.CreationDate) - new Date(a.CreationDate))[0]; return latestAmi?.ImageId; } catch (error) { console.error("获取AMI列表时出错:", error); throw error; } } // 调用后就能拿到最新的AMI ID,直接用来创建实例 getValidAMIs().then(amiId => { if (amiId) { console.log("准备用这个最新AMI创建实例:", amiId); // 这里可以直接调用下面的创建实例函数 } });
3. 用有效AMI ID创建EC2实例的JS代码
把上面获取到的AMI ID传进去,注意替换密钥对和安全组为你自己的:
import { EC2Client, RunInstancesCommand } from "@aws-sdk/client-ec2"; const ec2Client = new EC2Client({ region: "us-east-1" }); async function createEC2Instance(amiId) { try { const command = new RunInstancesCommand({ ImageId: amiId, // 这里传入我们刚获取的有效AMI ID InstanceType: "t2.micro", // 免费套餐可用的实例类型,你也可以换其他的 MinCount: 1, MaxCount: 1, KeyName: "your-key-pair-name", // 替换成你在EC2控制台创建的密钥对名称 SecurityGroupIds: ["your-security-group-id"] // 替换成你的安全组ID,确保开放必要端口(比如22用于SSH) }); const response = await ec2Client.send(command); const newInstance = response.Instances[0]; console.log(`成功创建EC2实例啦!实例ID: ${newInstance.InstanceId}`); return newInstance; } catch (error) { console.error("创建实例时出错:", error); throw error; } } // 组合起来:先拿最新AMI,再创建实例 getValidAMIs().then(amiId => { if (amiId) { createEC2Instance(amiId); } });
几个必须注意的点
- 区域要一致:AMI ID、EC2客户端的区域、你控制台操作的区域,三个必须完全一样,不然绝对会报错。
- 权限要够:确保你的AWS凭证有
ec2:DescribeInstances、ec2:DescribeImages、ec2:RunInstances这些权限,不然会被拒绝访问。 - 密钥对和安全组要存在:创建实例时必须指定已经在当前区域创建好的密钥对和安全组,不然实例启动会失败。
内容的提问来源于stack exchange,提问作者user1405338
相关产品推荐
相关产品推荐

