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

通过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的问题:为什么你的创建请求失败?

大概率是这两个原因:

  1. AMI ID是区域绑定的:比如us-east-1的ami-xxxx不能直接用在eu-west-1,跨区域用肯定报错。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:16:25