当我想在 EC2 上启动 Ubuntu 实例时,如何找到正确的实例?千名称中包含“Ubuntu”的公共映像。我只对运行官方 Ubuntu 映像感兴趣。我如何知道哪个 AMI 是正确的?
答案1
Ubuntu 作为一个平台的成功以及 Ubuntu 致力于更新 AMI 意味着 Amazon EC2 上有成千上万个名称中带有“ubuntu”的映像。再加上“快速启动”菜单中没有 Ubuntu,选择正确的 AMI 就变得非常困难。
一些常规 Ubuntu 信息
您可能已经知道这些项目,但我想向那些刚开始使用 Ubuntu 或 EC2 的人指出它们。
- Ubuntu 每 6 个月发布一次。每个版本都有一个版本号和代号。这里要注意的最重要的一点是,每 2 年会发布一个 LTS(长期支持)版本。如果您想要 5 年的稳定性和支持,请选择 LTS 版本。如果您想要最新的软件包,请选择最新版本。有关更多信息,请参阅维基百科条目。
- 在撰写本文时,Amazon EC2 中有 5 个“区域”。每个区域代表一个地理位置。每个区域都有自己的 AMI ID。每个区域内有 2 种架构(x86_64、i386)和 2 种“根存储”类型(EBS 或实例)。这意味着对于每个构建 Ubuntu 版本,我们都会生成 20 个 ami ID。
最简单:从 Web 浏览器查找 AMI
您可以选择用于选择图像的界面。转到:
https://cloud-images.ubuntu.com/locator/
在此页面底部,您可以选择区域、版本、架构或根存储。此处仅显示最新版本。选择完成后,您可以复制并粘贴 AMI 编号,或者直接单击它即可直接转到该 AMI 的 EC2 控制台启动页面。
或者
- https://cloud-images.ubuntu.com/server/releases/
- 按编号或代号选择您的版本
- 选择“release/”:我们保留历史构建以供调试,但“release/”目录始终是最新的。
- 从表中选择您的 AMI,然后单击在控制台中启动或复制并粘贴命令行。
通过 Amazon EC2 控制台搜索
EC2 控制台是一种图形方式,用于对 AMI 进行排序并选择一个进行启动。要在此处启动官方 Ubuntu 映像,请按照以下步骤操作。
在左上角的“导航”下选择所需的区域,例如:“美国东部(弗吉尼亚)”
点击“AMI”不是单击“启动实例”[参见下面的注释]
对于“查看”,选择“所有图像”
通过输入 ubuntu-images/ 将结果限制为 Ubuntu 稳定版本图像
您应该尽可能扩大“AMI 名称”字段(或许缩小其他字段)。
通过附加“.*”将结果限制为特定版本。
例如:ubuntu-images/.*10.04
通过附加 '.*i386' 或 '.*amd64' 将结果限制为给定的架构
笔记:如果您想要运行 m1.small 或 c1.medium,则需要“i386”。如果您想要运行 t1.micro,则需要选择“ebs”映像。
按 AMI 名称对结果进行排序并进行选择
通过按 AMI 名称排序,您可以更轻松地查看给定集合的最新 AMI。每个 AMI 都以 YYYYMMDD(年、月、日)格式的数字结尾。您需要最新的一个。
验证所有者是 099720109477!
任何用户都可以用任何名称注册 AMI。没有什么可以阻止恶意用户注册与上述搜索相匹配的 AMI。因此,为了安全起见,您需要验证 AMI 的所有者是否是 '099720109477“”。
如果“所有者”不是适合您的列,请单击右上角的“显示/隐藏”,然后选择要显示的“所有者”。
单击 AMI 名称,然后单击“启动”
笔记
- Web 控制台“启动实例”对话框:我没有在“启动实例”对话框中看到所有者 ID。如果是这样,我建议不要使用该对话框查找“社区 AMI”。您根本无法从控制台中可靠地知道谁是映像的所有者。对于高级用户,我将很快在博客中介绍一种以编程方式查找 AMI 的方法 [提示]。
答案2
全新改进的版本。
# 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”。
答案3
使用 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
答案4
我认为演示如何使用 Ansible 来实现这一点很有用,方法是使用ec2_ami_find模块。
在撰写本文时(2017-06-07),如果您从控制台手动启动 EC2 实例,AWS 将在 ap-southeast-2 区域中建议这些 Ubuntu LTS 映像:
- Ubuntu Server 16.04 LTS (HVM),SSD 卷类型 -ami-96666ff5
- Ubuntu Server 14.04 LTS (HVM),SSD 卷类型 -ami-807876e3
这符合他们的建议使用 HVM 虚拟化和 EBS 支持的 SSD 卷。
为了获得最佳性能,我们建议您在启动实例时使用当前一代实例类型和 HVM AMI。
要获取 AWS 推荐的相同 AMI,您可以使用以下任务:
- name: Find the most recent xenial AMI
ec2_ami_find:
aws_access_key: "{{ vault_aws_access_key }}"
aws_secret_key: "{{ vault_aws_secret_key }}"
region: "{{ config_region }}"
name: "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*"
owner: 099720109477 # canonical ownerid
virtualization_type: hvm
sort: name
sort_order: descending
sort_end: 2
register: ami_find_xenial
- name: Newest Xenial AMI
debug:
msg: "{{ ami_find_xenial.results[0].ami_id }}"
- name: AWS recommend Xenial AMI
debug:
msg: "{{ ami_find_xenial.results[1].ami_id }}"
- name: Find the most recent trusty AMI
ec2_ami_find:
aws_access_key: "{{ vault_aws_access_key }}"
aws_secret_key: "{{ vault_aws_secret_key }}"
region: "{{ config_region }}"
name: "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
owner: 099720109477 # canonical ownerid
virtualization_type: hvm
architecture: x86_64
sort: name
sort_order: descending
sort_end: 3
register: ami_find_trusty
- name: Newest Trusty AMI
debug:
msg: "{{ ami_find_trusty.results[0].ami_id }}"
- name: AWS recommend Trusty AMI
debug:
msg: "{{ ami_find_trusty.results[2].ami_id }}"
输出结果如下:
TASK [Load secrets from Vault] *****************************************************************************************************************************************************************************
ok: [localhost]
TASK [Find the most recent xenial AMI] *********************************************************************************************************************************************************************
ok: [localhost]
TASK [Newest Xenial AMI] ***********************************************************************************************************************************************************************************
ok: [localhost] => {
"changed": false,
"msg": "ami-1e01147d"
}
TASK [AWS recommended Xenial AMI] **************************************************************************************************************************************************************************
ok: [localhost] => {
"changed": false,
"msg": "ami-96666ff5"
}
TASK [Find the most recent trusty AMI] *********************************************************************************************************************************************************************
ok: [localhost]
TASK [Newest Trusty AMI] ***********************************************************************************************************************************************************************************
ok: [localhost] => {
"changed": false,
"msg": "ami-993e2bfa"
}
TASK [AWS recommended Trusty AMI] **************************************************************************************************************************************************************************
ok: [localhost] => {
"changed": false,
"msg": "ami-807876e3"
}
如果您比较剧本返回的 AMI ID,您会发现 AWS 不推荐最新的可用映像,而是推荐第二或第三最新的映像。我不知道他们在这里使用了什么标准/启发式方法。