Answers:
Ubuntu作为平台的成功以及Ubuntu对刷新AMI的承诺意味着,在Amazon EC2上确实有成千上万个带有“ ubuntu”名称的图像。加上“快速入门”菜单上缺少Ubuntu,这使得选择正确的AMI变得不容易。
一些一般的Ubuntu信息
您可能已经知道这些项目,但是我想为刚开始使用Ubuntu或EC2的用户指出这些项目。
最简单:从Web浏览器中查找AMI
您可以选择用于选择图像的界面。转到任一:
在此页面的底部,您可以选择区域,版本,拱形或根存储。您仅在此处显示最新版本。做出选择后,您可以复制并粘贴AMI编号,或直接单击它以转到该AMI的EC2控制台启动页面。
要么
通过Amazon EC2控制台搜索
EC2控制台是通过图形方式对AMI进行排序并选择要启动的AMI。要在此处启动官方Ubuntu映像,请按照以下步骤操作。
通过输入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 ”。
笔记
HTTPS访问:在以上选项中,目前https://cloud-images.ubuntu.com/server/releases/是唯一通过https提供数据的选项。如果您在查找AMI ID时担心潜在的“中间人”攻击,这对您可能很重要。我已请求Ahmed [irc中的kim0]支持对https://cloud.ubuntu.com/ami的 https访问。
Web控制台“启动实例”对话框:在“启动实例”对话框中看不到所有者ID。因为如果这样,我建议不要使用该对话框来查找“社区AMI”。根本无法从控制台中可靠地知道映像的所有者是谁。对于高级用户,我将在不久的将来写博客,以编程方式找到AMI [提示]。
hvm-instance
和之间的区别是否正确hvm-ssd
?恐怕“实例”的意思是“准虚拟”,但不确定,也找不到有关它的信息。此外,它可以是有用的注意,https://cloud-images.ubuntu.com/locator/
优惠过滤器......在页面的底部
新的和改进的版本。
# 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。它拉出名称并按其排序。名称经过格式化,以便按日期对它们进行排序,因此最后一个将是最新的。然后将此名称分配给“名称”变量。
第二部分使用该名称为具有该名称的AMI请求AMI ID。它仅解析id并将其分配给'ami_id'。
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*' --query 'sort_by(Images, &Name)[-1].ImageId'
使用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/来提供基于版本,发布日期等的全面比较。
搜索版本,所需区域,并根据发布日期进行排序,以获取最新版本。
在Ubuntu Cloud Portal上有可用的正式AMI 的完整列表。您可以在Ubuntu帮助中找到有关Canonical的官方EC2 AMI版本的其他资源:《 EC2入门指南》以及Canonical在Ubuntu EC2 Images中发布的所有AMI的原始目录。
我认为通过使用ec2_ami_find模块来演示如何与Ansible一起使用来进行此操作将很有用。
在撰写本文时(2017-06-07),在ap-southeast-2区域中,如果您从控制台手动启动EC2实例,则AWS将建议这些Ubuntu LTS映像:
这与他们有关使用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不推荐最新的可用映像,而是推荐第二或第三最新的映像。我不知道他们在这里使用什么标准/启发式方法。