问题描述
当我想在 EC2 上启动 Ubuntu 实例时,如何找到合适的实例?有数以千计的公共图像的名称中带有 “Ubuntu”。我只对运行官方 Ubuntu 映像感兴趣。我现在如何确定哪个 AMI 是正确的?
最佳方法
Ubuntu 作为平台的成功以及 Ubuntu 对更新 AMI 的承诺意味着 Amazon EC2 上实际上有数千个映像,其名称为 “ubuntu”。再加上 “Quick Start” 菜单上没有 Ubuntu,这使得选择正确的 AMI 成为一项重要的任务。
一些通用的 Ubuntu 信息
您可能已经知道这些项目,但我想向那些刚开始使用 Ubuntu 或 EC2 的人指出它们。
-
Ubuntu 每 6 个月发布一次。每个版本都有一个版本号和一个代号。这里要注意的最重要的事情是每 2 年发布一次 LTS(长期支持)版本。如果您想要 5 年的稳定性和支持,请选择 LTS 版本。如果您需要最新的软件包,请选择最新的版本。有关更多信息,请参阅维基百科条目。
-
在撰写本文时,Amazon EC2 中有 5 个 “regions”。每个区域代表一个地理位置。每个区域都有自己的 AMI ID。每个区域内有 2 种架构(x86_64、i386)和 2 种 “root store” 类型(EBS 或实例)。这意味着对于每个构建 Ubuntu 版本,我们生成 20 个 ami id。
最简单:从您的 Web 浏览器中查找 AMI
您可以选择用于选择图像的界面。转到:
-
http://cloud.ubuntu.com/ami 在此页面底部,您可以选择区域、版本、拱门或 root-store。此处仅向您显示最新版本。做出选择后,您可以复制并粘贴 ami 编号,或者只需单击它即可直接转到该 AMI 的 EC2 控制台启动页面。
或者
-
https://cloud-images.ubuntu.com/server/releases/
-
按编号或 code-name 选择您的版本
-
选择 ‘release/’:我们保留历史构建用于调试,但 ‘release/’ 目录将始终是最新的。
-
从表中选择您的 AMI,然后单击以在控制台中启动或复制并粘贴命令行。
-
通过 Amazon EC2 控制台搜索
EC2 控制台是一种对 AMI 进行排序并选择要启动的图形方式。要在此处启动官方 Ubuntu 映像,请按照以下步骤操作。
-
在左上角 ‘Navigation’ 下选择您想要的区域 示例:“美国东部(弗吉尼亚州)”
-
点击 “AMIs” 不要点击 “Launch Instance” [见下面的注释]
-
对于 ‘Viewing’,选择 “All Images”
-
通过键入 ubuntu-images/将结果限制为 Ubuntu 稳定版映像 您应该尽可能宽地扩展 ‘AMI Name’ 字段(可能缩小其他字段)。
-
通过附加 ‘.*’ 将结果限制为特定版本。例如:ubuntu-images/.*10.04
-
通过附加 ‘.*i386’ 或 ‘.*amd64’ 将结果限制为给定的拱形 注意:如果您想运行 m1.small 或 c1.medium,则需要 ‘i386’。如果要运行 t1.micro,则需要选择 ‘ebs’ 映像。
-
按 AMI 名称对结果进行排序并进行选择 通过按 AMI 名称排序,您可以更轻松地查看给定集合的最新 AMI。每个 AMI 都以 YYYYMMDD(年、月、日)格式的数字结尾。你想要最新的。
-
验证所有者是 099720109477!任何用户都可以以任何名称注册 AMI。没有什么可以阻止恶意用户注册与上述搜索匹配的 AMI。所以,为了安全起见,你需要验证ami的所有者是’099720109477’。
-
如果 “Owner” 不适合您,请单击右上角的 “Show/Hide” 并选择要显示的 “Owner”。
-
单击 AMI 名称,然后单击 ‘Launch’
笔记
-
HTTPS 访问:在上述选项中,目前 https://cloud-images.ubuntu.com/server/releases/ 是唯一通过 https 提供数据的选项。如果您在查找 AMI id 时担心潜在的“中间人”攻击,这对您来说可能很重要。我已经请求 Ahmed [kim0 in irc] 支持 https 访问 https://cloud.ubuntu.com/ami 。
-
Web 控制台 ‘Launch Instance’ 对话框:我在 ‘Launch Instance’ 对话框中没有看到查看所有者 ID 的方法。因为如果是这样,我建议不要使用该对话框来查找 “Community AMIs”。您根本无法从控制台中可靠地知道图像的所有者是谁。对于高级用户,我将很快在博客中介绍一种以编程方式查找 AMI 的方法 [提示]。
次佳方法
新的和改进的版本。
# needed as json list returned by ubuntu site is mal-formed
remove_last_comma() { sed '
$x;$G;/\(.*\),/!H;//!{$!d
}; $!x;$s//\1/;s/^\n//'
}
curl -s "https://cloud-images.ubuntu.com/locator/ec2/releasesTable" \
| remove_last_comma \
| jq -c '.aaData[] | select(contains(["16.04", "us-west-2", "hvm:ebs"]))' \
| grep -o 'ami-[a-z0-9]\+' | head -1
基本上抓取用于 ubuntu 的 ami 查找页面的原始数据,并使用 jq 解析出我想要的行,然后使用 grep 提取该值。比旧版本快得多。
——原版
这是另一个例子。我只是写这个来获取最新的可信赖的 AMI id。它使用 aws cli 工具来查询 API,使用名称按日期顺序排序以获得最新的事实。
name=$(\
aws --region us-west-2 ec2 describe-images --owners 099720109477 \
--filters Name=root-device-type,Values=ebs \
Name=architecture,Values=x86_64 \
Name=name,Values='*hvm-ssd/ubuntu-trusty-14.04*' \
| awk -F ': ' '/"Name"/ { print $2 | "sort" }' \
| tr -d '",' | tail -1)
ami_id=$(\
aws --region us-west-2 ec2 describe-images --owners 099720109477 \
--filters Name=name,Values="$name" \
| awk -F ': ' '/"ImageId"/ { print $2 }' | tr -d '",')
它分为两部分。第一部分获取满足各种标准(ebs、x86_64 和名称模式)的 ubuntu trusty 的所有 AMI。它拉出名称并按它排序。名称已格式化,以便按日期对它们进行排序,因此最后一个将是最新的。然后将该名称分配给 ‘name’ 变量。
第二部分使用该名称为具有该名称的 AMI 请求 AMI ID。它仅解析 id 并将其分配给 ‘ami_id’。
第三种方法
使用 ruby aws-sdk,您可以像这样以编程方式发现最新的 Ubuntu AMI
ec2 = AWS::EC2.new
root_device_type = "ebs"
ami_owner = '099720109477'
ami_name = "*ubuntu/images/#{root_device_type}/ubuntu-precise-12.04*" # hardcoded to ubuntu 12.04. You can apply your own criteria here.
AWS.memoize do
linux_ami = ec2.images.with_owner(ami_owner).
filter("root-device-type", root_device_type).
filter("architecture", "x86_64"). # use 'i386' for 32 bit and 'x86_64' for 64 bit
filter("name", ami_name)
# this only makes one request due to memoization
begin
return linux_ami.to_a.sort_by(&:name).last
rescue
abort red "Error discovering latest AMI. Terminating."
end
end
第四种方法
您可以使用 https://cloud-images.ubuntu.com/locator/ec2/,它提供基于版本、发布日期等的全面比较。
搜索您想要的版本、地区并根据发布日期排序以获取最新版本。