Amazon Linux - Amazon Elastic Compute Cloud
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Linux

Amazon Linux 由 Amazon Web Services (AWS) 提供。它旨在为 Amazon EC2 上运行的应用程序提供稳定、安全和高性能的执行环境。此外,它还包括让您能够与 AWS 轻松集成的程序包,包括启动配置工具和许多常见的 AWS 库及工具。AWS 为运行 Amazon Linux 的所有实例提供持续的安全性和维护更新。许多在 CentOS (及类似发行版) 上开发的应用程序在 Amazon Linux 上运行。

Amazon Linux 可用性

AWS 提供 Amazon Linux 2 和 Amazon Linux AMI。如果您要从其他 Linux 发行版迁移至 Amazon Linux,我们建议您迁移至 Amazon Linux 2。

Amazon Linux AMI 2018.03 的最后一个版本将于 2020 年 12 月 31 日终止标准支持。有关更多信息,请参阅以下博客文章: Amazon Linux AMI 寿命终止。如果您目前使用的是 Amazon Linux AMI,则建议您迁移至 Amazon Linux 2。要迁移至 Amazon Linux 2,请启动实例或使用当前 Amazon Linux 2 映像创建虚拟机。安装您的应用程序以及所有必需的软件包。测试您的应用程序,并进行使其在 Amazon Linux 2 上运行所需的任何更改。

有关更多信息,请参阅 Amazon Linux 2Amazon Linux AMI。有关 Amazon Linux Docker 容器映像,请参阅 Docker Hub 上的 amazonlinux

连接到 Amazon Linux 实例

默认情况下,Amazon Linux 不支持远程根 SSH。此外,密码验证已禁用,以防止强力 (brute-force) 密码攻击。要在 Amazon Linux 实例上启用 SSH 登录,您必须在实例启动时为其提供密钥对。您还必须设置用于启动实例的安全组以允许 SSH 访问。默认情况下,唯一可以使用 SSH 进行远程登录的账户是 ec2-user;此账户还拥有 sudo 特权。如果您启用远程根登录,请注意,其安全性低于依靠密钥对和辅助用户。

识别 Amazon Linux 映像

每个映像都包含用于识别它的唯一的 /etc/image-id 文件。此文件包含有关映像的以下信息:

  • image_nameimage_versionimage_arch — 来自 Amazon 用于构建映像的构建配方的值。

  • image_stamp — 映像创建期间随机生成的一个唯一的十六进制值。

  • image_date — 映像创建的 UTC 时间,采用 YYYYMMDDhhmmss 格式

  • recipe_namerecipe_id — Amazon 用于构建映像的构建配方的名称和 ID。

Amazon Linux 包含 /etc/system-release 文件,用于指定当前已安装的版本。此文件使用 yum 进行更新,是 system-release RPM 的一部分。

Amazon Linux 还包含遵循 CPE 规范的 /etc/system-release 的机器可读版本;请参阅 /etc/system-release-cpe

Amazon Linux 2

以下是当前 Amazon Linux 2 版本的 /etc/image-id 示例:

[ec2-user ~]$ cat /etc/image-id image_name="amzn2-ami-hvm" image_version="2" image_arch="x86_64" image_file="amzn2-ami-hvm-2.0.20180810-x86_64.xfs.gpt" image_stamp="8008-2abd" image_date="20180811020321" recipe_name="amzn2 ami" recipe_id="c652686a-2415-9819-65fb-4dee-9792-289d-1e2846bd"

以下是当前 Amazon Linux 2 版本的 /etc/system-release 示例:

[ec2-user ~]$ cat /etc/system-release Amazon Linux 2

以下是 Amazon Linux 2 的 /etc/os-release 示例:

[ec2-user ~]$ cat /etc/os-release NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/"

Amazon Linux AMI

以下是当前 Amazon Linux AMI 版本的 /etc/image-id 示例:

[ec2-user ~]$ cat /etc/image-id image_name="amzn-ami-hvm" image_version="2018.03" image_arch="x86_64" image_file="amzn-ami-hvm-2018.03.0.20180811-x86_64.ext4.gpt" image_stamp="cc81-f2f3" image_date="20180811012746" recipe_name="amzn ami" recipe_id="5b283820-dc60-a7ea-d436-39fa-439f-02ea-5c802dbd"

以下是当前 Amazon Linux AMI 版本的 /etc/system-release 示例:

[ec2-user ~]$ cat /etc/system-release Amazon Linux AMI release 2018.03

AWS 命令行工具

以下 AWS 集成命令行工具及使用方法包含在 Amazon Linux AMI 中或 Amazon Linux 2 的默认存储库中。有关 Amazon Linux AMI 中的程序包的完整列表,请参阅 Amazon Linux AMI 2017.09 程序包

  • aws-amitools-ec2

  • aws-apitools-as

  • aws-apitools-cfn

  • aws-apitools-elb

  • aws-apitools-mon

  • aws-cfn-bootstrap

  • aws-cli

Amazon Linux 2 和最低版本的 Amazon Linux(amzn-ami-minimal-*amzn2-ami-minimal-*)并不总是包含所有这些程序包;但您可以使用以下命令来从默认存储库中安装它们:

[ec2-user ~]$ sudo yum install -y package_name

对于使用 IAM 角色启动的实例,提供了一个简单脚本,用于在安装凭证文件后准备 AWS_CREDENTIAL_FILEJAVA_HOMEAWS_PATHPATH 和产品特定的环境变量,以简化这些工具的配置。

此外,为了支持您安装多个版本的 API 和 AMI 工具,我们还在 /opt/aws 中提供了指向所需工具版本的符号链接,如下所述:

/opt/aws/bin

指向每个已安装工具目录中的 /bin 目录的符号链接。

/opt/aws/{apitools|amitools}

产品安装在形式为 name--version 的目录中,符号链接 name 附加到最近安装的版本。

/opt/aws/{apitools|amitools}/name/environment.sh

/etc/profile.d/aws-apitools-common.sh 用于设置产品特定的环境变量,如 EC2_HOME

程序包存储库

Amazon Linux 2 和 Amazon Linux AMI 旨在与每个 Amazon EC2 AWS 区域中托管的在线程序包存储库结合使用。这些存储库为 Amazon Linux 2 和 Amazon Linux AMI 中的程序包提供持续更新,还可访问数百个常见的开源服务器应用程序。这些存储库在所有区域中提供,可使用 yum 更新工具进行访问。通过在每个区域托管存储库,我们可以快速部署更新,不会产生任何数据传输费。

Amazon Linux 2 和 Amazon Linux AMI 会定期进行更新,增强安全性及功能。如果您不需要保留实例的数据或自定义项,则只需使用当前 AMI 启动新实例。如果您需要保留实例的数据或自定义项,则可以通过 Amazon Linux 程序包存储库维护这些实例。这些存储库包含所有更新后的程序包。您可以选择将这些更新应用到正在运行的实例中。即使新版本发布后,旧版的 AMI 和更新程序包仍继续可用。

重要

您的实例必须具有 Internet 访问权限才能访问该存储库。

要安装程序包,请使用以下命令:

[ec2-user ~]$ sudo yum install package

对于 Amazon Linux AMI,系统配置了对 Extra Packages for Enterprise Linux (EPEL) 存储库的访问权限,但默认情况下未启用。Amazon Linux 2 未配置为使用 EPEL 存储库。除了 存储库中的软件包以外,EPEL 还提供了第三方软件包。AWS 不支持第三方软件包。您可以使用以下命令来启用 EPEL 存储库:

  • 对于 Amazon Linux 2:

    [ec2-user ~]$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • 对于 Amazon Linux AMI:

    [ec2-user ~]$ sudo yum-config-manager --enable epel

如果您发现 Amazon Linux 不包含您需要的应用程序,您只需直接在 Amazon Linux 实例上安装该应用程序即可。Amazon Linux 使用 RPM 和 yum 来管理程序包,而这可能是安装新应用程序的最简单的方式。您始终应该首先查看我们的中央 Amazon Linux 存储库,确定其中是否有您需要应用程序,因为许多应用程序在那里都可以找到。您可以轻松地将这些应用程序添加到 Amazon Linux 实例。

要将应用程序上传到正在运行的 Amazon Linux 实例,请使用 scpsftp,然后通过登录实例来配置应用程序。您还可以使用内置 cloud-init 程序包中的 PACKAGE_SETUP 操作,在实例启动时,上传应用程序。有关更多信息,请参阅cloud-init

安全更新

安全更新通过程序包存储库提供,而更新后的 AMI 安全警报在 Amazon Linux 安全中心中发布。有关 AWS 安全策略的更多信息,或要报告安全问题,请访问 AWS 安全中心

Amazon Linux 配置为在启动时下载和安装关键或重要安全更新。我们建议您在启动后针对您的用例进行必要的更新。例如,您可能希望在启动时应用所有更新(而不仅仅是安全更新),或者评估各个更新并仅应用适用于您系统的更新。这是使用以下 cloud-init 设置进行控制的:repo_upgrade。下方 cloud-init 配置片段显示了如何修改传递到实例初始化用户数据文本中的设置:

#cloud-config repo_upgrade: security

repo_upgrade 的可能值如下所示:

critical

应用未完成的关键安全更新。

important

应用未完成的关键和重要安全更新。

medium

应用未完成的关键、重要和中等安全更新。

low

应用所有未完成的安全更新,包括具有低严重性的安全更新。

security

应用 Amazon 标记为安全更新的明显关键或重要更新。

bugfix

应用 Amazon 标记为缺陷修正的更新。缺陷修正是一组较大的更新,其中包括安全更新和针对各种其他小漏洞的修正更新。

all

应用全部适用更新 (不论类别)。

none

实例启动时不应用任何更新。

repo_upgrade 的默认设置是安全的。也就是说,如果您不在用户数据中指定其他值,在默认情况下,Amazon Linux 会在启动时执行适用于所有已安装程序包的安全升级。在您使用 /etc/motd 文件登录时,Amazon Linux 还会通过列出可用更新的数量,通知您已安装程序包的所有更新。要安装这些更新,您需要在实例上运行 sudo yum upgrade

存储库配置

利用 Amazon Linux,AMI 将被视为实时快照,因此当您运行 yum update -y 时,存储库和更新结构可始终为您提供最新的程序包。

存储库结构进行了配置以提供不间断的更新流,可让您从一个版本的 Amazon Linux 滚动到下一版本。举例来说,如果从较旧版本的 Amazon Linux AMI(如 2017.09 或更低版本)启动实例并运行 yum update -y,则会得到最新程序包。

您可通过启用 lock-on-launch 功能禁用滚动更新。lock-on-launch 功能会锁定您的实例,使其仅接收来自指定版本的 AMI 的更新。举例来说,您可以启动 2017.09 AMI,使其仅接收早于 2018.03 AMI 发布的更新,直至您准备好迁移到 2018.03 AMI 为止。

重要

如果锁定到并非最新的存储库版本,则您不会收到后续更新。要接收连续更新流,您必须使用最新的 AMI,或持续更新您的 AMI,使存储库指向最新版本。

要在新实例中启用 lock-on-launch 功能,请使用已传递到 cloud-init 的以下用户数据启动它:

#cloud-config repo_releasever: 2017.09

将现有实例锁定到当前 AMI 版本

  1. 编辑 /etc/yum.conf.

  2. 注释 releasever=latest

  3. 要清除缓存,请运行 yum clean all

Extras 库 (Amazon Linux 2)

利用 Amazon Linux 2,您可以使用 Extras 库来在您的实例上安装应用程序和软件更新。这些软件更新称为主题。您可以安装主题的某特定版本或忽略要使用最新版本的版本信息。

要列出可用的主题,请使用以下命令:

[ec2-user ~]$ amazon-linux-extras list

要启用主题并安装其程序包的最新版本以确保最新,请使用以下命令:

[ec2-user ~]$ sudo amazon-linux-extras install topic

要启用主题并安装其程序包的特定版本以确保稳定性,请使用以下命令:

[ec2-user ~]$ sudo amazon-linux-extras install topic=version topic=version

要删除从主题中安装的程序包,请使用以下命令:

[ec2-user ~]$ sudo yum remove $(yum list installed | grep amzn2extra-topic | awk '{ print $1 }')
注意

该命令不会删除作为 Extra 依赖项安装的程序包。

要禁用主题并使 yum 程序包管理器无法访问程序包,请使用以下命令:

[ec2-user ~]$ sudo amazon-linux-extras disable topic
重要

该命令适用于高级用户。如果未正确使用该命令,可能会导致程序包兼容性冲突。

访问源软件包以获取参考信息

您可以使用 Amazon Linux 中提供的工具,查看您已在实例上安装的软件包的源,获取参考信息。您可以查看 Amazon Linux 和在线软件包存储库中包含的全部软件包的源软件包。只需确定您要安装的源软件包的名称,并使用 yumdownloader --source 命令在您正在运行的实例中查看源。例如:

[ec2-user ~]$ yumdownloader --source bash

您可以对源 RPM 进行解压缩,并可以使用标准 RPM 工具查看源树进行参考。完成调试之后,该软件包可供使用。

cloud-init

cloud-init 程序包是由 Canonical 构建的开源应用程序,用于在云计算环境(例如 Amazon EC2)中引导 Linux 映像。Amazon Linux 包含自定义版 cloud-init。它使您能够指定实例启动时应执行的操作。启动实例时,您可以通过用户数据字段将需要的操作传递到 cloud-init。这意味着,您可以将通用 AMI 用于许多使用案例,并在启动时进行动态配置。Amazon Linux 还使用 cloud-init 执行 ec2-user 账户的初始配置。

有关更多信息,请参阅 cloud-init 文档

Amazon Linux 使用在 /etc/cloud/cloud.cfg.d/etc/cloud/cloud.cfg 中发现的 cloud-init 操作。您可以在 /etc/cloud/cloud.cfg.d 中创建自己的 cloud-init 操作文件。此目录中的所有文件均由 cloud-init 读取。它们是按词典顺序进行读取的,并且文件随后将覆盖之前文件中的值。

cloud-init 程序包将在启动时对实例执行这些 (以及其他) 常见配置任务:

  • 设置默认区域设置.

  • 设置主机名.

  • 解析并处理用户数据.

  • 生成主机私有 SSH 密钥.

  • 将用户的公有 SSH 密钥添加到 .ssh/authorized_keys,以便于登录和管理.

  • 准备存储库以进行程序包管理.

  • 处理用户数据中定义的软件包操作.

  • 执行在用户数据中找到的用户脚本.

  • 装载实例存储卷 (如果适用)。

    • 默认情况下,ephemeral0 实例存储卷装载在 /media/ephemeral0 (如果它存在且包含有效的文件系统;否则将不会安装)。

    • 默认情况下,将装载与实例关联的所有交换卷 (仅适用于 m1.smallc1.medium 实例类型)。

    • 您可以使用以下 cloud-init 指令覆盖默认实例存储卷安装:

      #cloud-config mounts: - [ ephemeral0 ]

      有关对安装的更多控制,请参阅 cloud-init 文档中的安装

    • 在实例启动时,不会格式化支持 TRIM 的实例存储卷,因此,您必须先对这些卷进行分区和格式化,然后才能装载它们。有关更多信息,请参阅 实例存储卷 TRIM 支持。您可以在启动时使用 disk_setup 模块对您的实例存储卷进行分区和格式化。有关更多信息,请参阅 cloud-init 文档中的磁盘设置

支持的用户数据格式

cloud-init 软件包可处理多种格式的用户数据:

  • Gzip

    • 如果用户数据是经过 gzip 压缩过的,cloud-init 可解压缩数据,并进行适当处理。

  • MIME 多部分内容型

    • 使用 MIME 多部分内容型文件,您可以指定多种数据类型。例如,您可以指定用户数据脚本和云配置类型。如果多部分内容型文件的格式是受支持的格式,则 cloud-init 可以处理它的各部分内容。

  • Base64 解码

    • 如果用户数据是使用 base64 编码的,cloud-init 将决定它能否将解码后的数据当作其中一种受支持的数据类型进行理解。如果它能理解解码后的数据,则会解码数据,并进行适当处理。如果不能,它将完整地返回 base64 数据。

  • 用户数据脚本

    • 开头为 #!Content-Type: text/x-shellscript

    • 该脚本由 /etc/init.d/cloud-init-user-scripts 在首轮启动过程中执行。此操作会在启动过程的后期发生 (即执行初始配置操作后)。

  • 包含文件

    • 开头为 #includeContent-Type: text/x-include-url

    • 此内容是一个包含文件。该文件包含一个 URL 列表,每行一个 URL。系统会读取每个 URL,其内容会通过此相同规则集验证。从 URL 读取的内容可使用 gzipp 进行压缩、采用 MIME 分段处理或存储为纯文本。

  • 云配置数据

    • 开头为 #cloud-configContent-Type: text/cloud-config

    • 此内容是云配置数据。要了解支持的配置格式的带注释示例,请查看示例。

  • Upstart 作业

    • 开头为 #upstart-jobContent-Type: text/upstart-job

    • 此内容存储在 /etc/init 中的一个文件里,upstart 使用内容的方式与其他 upstart 作业相同。

  • Cloud Boothook

    • 开头为 #cloud-boothookContent-Type: text/cloud-boothook

    • 此内容为 boothook 数据。它存储在 /var/lib/cloud 下的一个文件中并会立即执行。

    • 这是最早可用的 "hook"。尚无仅供运行一次的机制。boothook 必须自行解决此问题。它的环境变量 INSTANCE_ID 中包含实例 ID。可使用此变量来提供一组一个实例可用一次的 boothook 数据。

订阅 Amazon Linux 通知

要收到新 AMI 发布通知,可使用 Amazon SNS 订阅。

订阅 Amazon Linux 通知

  1. 通过以下网址打开 Amazon SNS 控制台:https://console.amazonaws.cn/sns/v3/home

  2. 在导航栏中,将区域更改为 美国东部(弗吉尼亚北部)(如果需要)。必须选择所订阅的 SNS 通知在创建时所在的区域。

  3. 在导航窗格中,依次选择 SubscriptionsCreate subscription

  4. 对于 Create subscription 对话框,执行以下操作:

    1. [Amazon Linux 2] 对于主题 ARN,复制并粘贴以下 Amazon 资源名称 (ARN):arn:aws:sns:us-east-1:137112412989:amazon-linux-2-ami-updates

    2. [Amazon Linux] 对于主题 ARN,复制并粘贴以下 Amazon 资源名称 (ARN):arn:aws:sns:us-east-1:137112412989:amazon-linux-ami-updates

    3. 对于协议,选择电子邮件

    4. 对于终端节点,输入可以用于接收通知的电子邮件地址。

    5. 选择 Create subscription

  5. 您将收到一封主题行为“AWS Notification - Subscription Confirmation”(AWS 通知 - 订阅确认) 的确认电子邮件。打开电子邮件,然后选择 Confirm subscription 以完成订阅。

每当发布新的 AMI 时,我们都会向相应主题的订阅者发送通知。若不想再接收这些通知,请使用以下过程取消订阅。

取消订阅 Amazon Linux 通知

  1. 通过以下网址打开 Amazon SNS 控制台:https://console.amazonaws.cn/sns/v3/home

  2. 在导航栏中,将区域更改为 美国东部(弗吉尼亚北部)(如果需要)。必须使用创建 SNS 通知的区域。

  3. 在导航窗格中,选择订阅,选择订阅,然后选择操作删除订阅

  4. 当系统提示进行确认时,选择 Delete

Amazon Linux AMI SNS 消息格式

SNS 消息的架构如下所示。

{ "description": "Validates output from AMI Release SNS message", "type": "object", "properties": { "v1": { "type": "object", "properties": { "ReleaseVersion": { "description": "Major release (ex. 2018.03)", "type": "string" }, "ImageVersion": { "description": "Full release (ex. 2018.03.0.20180412)", "type": "string" }, "ReleaseNotes": { "description": "Human-readable string with extra information", "type": "string" }, "Regions": { "type": "object", "description": "Each key will be a region name (ex. us-east-1)", "additionalProperties": { "type": "array", "items": { "type": "object", "properties": { "Name": { "description": "AMI Name (ex. amzn-ami-hvm-2018.03.0.20180412-x86_64-gp2)", "type": "string" }, "ImageId": { "description": "AMI Name (ex.ami-467ca739)", "type": "string" } }, "required": [ "Name", "ImageId" ] } } } }, "required": [ "ReleaseVersion", "ImageVersion", "ReleaseNotes", "Regions" ] } }, "required": [ "v1" ] }