我如何知道要在 EC2 上启动哪个 Ubuntu AMI?

我如何知道要在 EC2 上启动哪个 Ubuntu AMI?

当我想在 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 的方法 [提示]。

来源1:ubuntu-smoser.blogspot.com

来源2:ubuntu.com

答案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 不推荐最新的可用映像,而是推荐第二或第三最新的映像。我不知道他们在这里使用了什么标准/启发式方法。

相关内容