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

Amazon Linux

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

AWS 提供了两个版本的 Amazon Linux:Amazon Linux 2 和 Amazon Linux AMI。有关更多信息 (包括 AMI 的完整列表),请参阅 Amazon Linux 2Amazon Linux AMI。有关 Amazon Linux Docker 容器映像,请参阅 Docker Hub 上的 amazonlinux

如果您要从其他 Linux 发行版迁移至 Amazon Linux,我们建议您迁移至 Amazon Linux 2。如果您目前使用的是 Amazon Linux AMI,则建议您迁移至 Amazon Linux 2。要迁移至 Amazon Linux 2,请启动实例或使用当前映像创建虚拟机。在 Amazon Linux 2 上安装您的应用程序以及应用程序所需的任何程序包。测试您的应用程序,并进行使其在 Amazon Linux 2 上运行所需的任何更改。有关在 AWS 外部运行 Amazon Linux 的更多信息,请参阅作为本地虚拟机运行 Amazon Linux 2

连接到 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="2017.12" image_arch="x86_64" image_file="amzn2-ami-hvm-2017.12.0.20180509-x86_64.xfs.gpt" image_stamp="c763-2a26" image_date="20180509235735" recipe_name="amzn2 ami" recipe_id="0b8118bb-6f98-5619-0618-9570-26ae-ad18-178b79f1"

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

[ec2-user ~]$ cat /etc/system-release Amazon Linux release 2.0 (2017.12) LTS Release Candidate

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

[ec2-user ~]$ cat /etc/os-release NAME="Amazon Linux" VERSION="2.0 (2017.12)" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2.0" PRETTY_NAME="Amazon Linux 2.0 (2017.12) LTS Release Candidate" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2.0" 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.20180508-x86_64.ext4.gpt" image_stamp="c4fa-96f6" image_date="20180508174933" recipe_name="amzn ami" recipe_id="1cb2680c-5325-ae3b-9562-95c2-ae09-5817-8b40e17d"

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

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

包含的 AWS 命令行工具

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

  • aws-amitools-ec2

  • aws-apitools-as

  • aws-apitools-cfn

  • aws-apitools-ec2

  • aws-apitools-elb

  • aws-apitools-mon

  • aws-cfn-bootstrap

  • aws-cli

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

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

重要

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

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

[ec2-user ~]$ sudo yum install package

系统配置了对 Extra Packages for Enterprise Linux (EPEL) 存储库的访问权限,但默认情况下没有启用。除了 存储库中的软件包以外,EPEL 还提供了第三方软件包。AWS 不支持第三方软件包。

如果您发现 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 的可能值如下所示:

security

应用 Amazon 标记为安全更新的重要更新。

bugfix

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

all

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

none

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

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

存储库配置

利用 Amazon Linux,AMIs 将被当作时间快照处理,因此当您运行 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

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

您可以使用 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/v2/home

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

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

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

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

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

    3. 对于 Protocol,选择 Email

    4. 对于 Endpoint,键入可用于接收通知的电子邮件地址。

    5. 选择 Create subscription

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

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

取消订阅 Amazon Linux 通知

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

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

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

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