

# 使用控制台为 Amazon ECS 配置 Amazon EFS 文件系统
<a name="tutorial-efs-volumes"></a>

了解如何将 Amazon Elastic File System（Amazon EFS）文件系统与 Amazon ECS 结合使用。

## 步骤 1：创建 Amazon ECS 集群
<a name="efs-create-cluster"></a>

请按照以下步骤创建 Amazon ECS 集群。

**要创建新集群（Amazon ECS 控制台）**

在开始之前，分配相应的 IAM 权限。有关更多信息，请参阅 [Amazon ECS 集群示例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 从导航栏中，选择要使用的区域。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择 **Create cluster**（创建集群）。

1. 在**集群配置**下方的**集群名称**中，输入 `EFS-tutorial` 作为集群名称。

1. （可选）要更改任务和服务启动所在的 VPC 和子网，在 **Networking**（联网）下，执行以下任一操作：
   + 要删除子网，请在 **Subnets**（子网）下，为您要删除的每个子网选择 **X**。
   + 要更改为**默认** VPC 以外的 VPC，请在 **VPC** 下选择现有 **VPC**，然后在**子网**下选择每个子网。

1.  要向集群添加 Amazon EC2 实例，请展开**基础设施**，然后选择 **Amazon EC2 实例**。接下来，配置充当容量提供程序的 自动扩缩组：

   1. 要创建 自动扩缩组，请从 **自动扩缩组（ASG）**（自动扩缩组（ASG））中，选择 **Create new group**（创建新组），然后提供有关组的以下详细信息：
     + 对于**操作系统/架构**，选择 Amazon Linux 2。
     + 对于 **EC2 实例类型**，选择 `t2.micro`。

        对于 **SSH key pair**（SSH 密钥对），连接到实例时，选择可证明您身份的密钥对。
     + 对于**容量**，输入 `1`。

1. 选择**创建**。

## 步骤 2：为 Amazon EC2 实例和 Amazon EFS 文件系统创建安全组
<a name="efs-security-group"></a>

在此步骤中，您需要为 Amazon EC2 实例创建一个安全组，以允许端口 80 上的入站网络流量，并为 Amazon EFS 文件系统创建一个安全组，以允许您的容器实例进行入站访问。

使用以下选项为您的 Amazon EC2 实例创建安全组：
+ **安全组名称**：安全组的唯一名称。
+ **VPC**：您之前为集群确定的 VPC。
+ **入站规则**
  + **类型**：**HTTP**
  + **来源**：**0.0.0.0/0**。

使用以下选项为您的 Amazon EFS 文件系统创建安全组：
+ **安全组名称**：安全组的唯一名称。例如 `EFS-access-for-sg-dc025fa2`。
+ **VPC**：您之前为集群确定的 VPC。
+ **入站规则**
  + **类型**：**NFS**
  + **来源**：使用您为实例创建的安全组的 ID **自定义**。

有关如何创建安全组的信息，请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》**中的[为 Amazon EC2 实例创建安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-security-group.html)。

## 步骤 3：创建 Amazon EFS 文件系统
<a name="efs-create-filesystem"></a>

在该步骤中，您将创建一个 Amazon EFS 文件系统。

**为 Amazon ECS 任务创建 Amazon EFS 文件系统。**

1. 访问 [https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)，打开 Amazon Elastic File System 控制台。

1. 选择 **Create file system**。

1. 输入文件系统的名称，然后选择托管容器实例的 VPC。默认情况下，指定 VPC 中的每个子网都会收到使用该 VPC 默认安全组的挂载目标。然后，选择**自定义**。
**注意**  
此教程假设您的 Amazon EFS 文件系统、Amazon ECS 集群、容器实例和任务位于同一 VPC 中。有关从其他 VPC 挂载文件系统的更多信息，请参阅《Amazon EFS 用户指南》**中的[演练：从其他 VPC 挂载文件系统](https://docs.aws.amazon.com/efs/latest/ug/efs-different-vpc.html)。

1. 在**文件系统设置**页面上，配置可选设置，然后在**性能设置**下，为您的文件系统选择**突增**吞吐量模式。配置完设置后，选择**下一步**。

   1. （可选）为文件系统添加标签。例如，通过在 **Name** 键旁边的 **Value** 列中输入名称可以为文件系统指定唯一的名称。

   1. （可选）启用生命周期管理可节省不经常访问的存储的成本。有关更多信息，请参阅 *Amazon Elastic File System 用户指南*中的 [EFS 生命周期管理](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html)。

   1. （可选）启用加密。选中该复选框可对 Amazon EFS 文件系统启用静态加密。

1. 在**网络访问**页面的**挂载目标**下，将每个可用区的现有安全组配置替换为您在 [步骤 2：为 Amazon EC2 实例和 Amazon EFS 文件系统创建安全组](#efs-security-group) 中为文件系统创建的安全组，然后选择**下一步**。

1.  您无需为本教程配置**文件系统策略**，因此您可以通过选择**下一步**来跳过本部分。

1. 查看文件系统选项，然后选择**创建**以完成此过程。

1. 从**文件系统**屏幕中，记录**文件系统 ID**。在下一步中，您将在 Amazon ECS 任务定义中引用此值。

## 步骤 4：向 Amazon EFS 文件系统添加内容
<a name="efs-add-content"></a>

在此步骤中，您将 Amazon EFS 文件系统挂载到 Amazon EC2 实例并向其添加内容。这在本教程中用于测试，目的是说明数据的持久性质。使用此功能时，您通常会使用您的应用程序或其他方法将数据写入 Amazon EFS 文件系统。

**创建 Amazon EC2 实例并挂载 Amazon EFS 文件系统**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择 **Launch Instance（启动实例）**。

1. 在**应用程序和操作系统映像（亚马逊机器映像）**下，选择 **Amazon Linux 2 AMI（HVM）**。

1. 在**实例类型**下，保留默认实例类型 `t2.micro`。

1.  在**密钥对（登录）**下，选择用于 SSH 访问实例的密钥对。

1. 在**网络设置**下，选择您为 Amazon EFS 文件系统和 Amazon ECS 集群指定的 VPC。选择子网和在 [步骤 2：为 Amazon EC2 实例和 Amazon EFS 文件系统创建安全组](#efs-security-group) 中创建的实例安全组。配置实例的安全组。确保已启用**自动分配公有 IP**。

1. 在**配置存储**下，选择文件系统的**编辑**按钮，然后选择 **EFS**。选择您在 [步骤 3：创建 Amazon EFS 文件系统](#efs-create-filesystem) 中创建的文件系统。您可以选择更改挂载点或保留默认值。
**重要**  
您必须先选择子网，然后才能将文件系统添加到实例中。

1. 清除**自动创建和附加安全组**。将另一个复选框保持选中状态。请选择 **Add shared file system**（添加共享文件系统）。

1. 在**高级详细信息**下，确保通过 Amazon EFS 文件系统挂载步骤自动填充用户数据脚本。

1.  在**摘要**下，确保**实例数**为 **1**。选择**启动实例**。

1. 在**启动状态**页面上，选择**查看所有实例**以查看实例的状态。最初，**实例状态**为 `PENDING`。在状态变为 `RUNNING` 且实例通过所有状态检查后，实例就可以使用了。

现在，您可以连接到 Amazon EC2 实例并向 Amazon EFS 文件系统添加内容。

**连接到 Amazon EC2 实例并向 Amazon EFS 文件系统添加内容**

1. SSH 到您创建的 Amazon EC2 实例。有关更多信息，请参阅《Amazon EC2 用户指南》中的[使用 SSH 连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)**。

1. 从终端窗口，运行 **df -T** 命令以验证 Amazon EFS 文件系统是否已挂载。在下面的输出中，我们突出了 Amazon EFS 文件系统挂载。

   ```
   $ df -T
   Filesystem     Type            1K-blocks    Used        Available Use% Mounted on
   devtmpfs       devtmpfs           485468       0           485468   0% /dev
   tmpfs          tmpfs              503480       0           503480   0% /dev/shm
   tmpfs          tmpfs              503480     424           503056   1% /run
   tmpfs          tmpfs              503480       0           503480   0% /sys/fs/cgroup
   /dev/xvda1     xfs               8376300 1310952          7065348  16% /
   127.0.0.1:/    nfs4     9007199254739968       0 9007199254739968   0% /mnt/efs/fs1
   tmpfs          tmpfs              100700       0           100700   0% /run/user/1000
   ```

1. 导航到挂载 Amazon EFS 文件系统的目录。在上述示例中，即为 `/mnt/efs/fs1`。

1. 使用以下内容创建名为 `index.html` 的文件：

   ```
   <html>
       <body>
           <h1>It Works!</h1>
           <p>You are using an Amazon EFS file system for persistent container storage.</p>
       </body>
   </html>
   ```

## 步骤 5：创建任务定义
<a name="efs-task-def"></a>

以下任务定义创建名为 `efs-html` 的数据卷。`nginx` 容器将该主机数据卷挂载在 NGINX 根目录（`/usr/share/nginx/html`）下。

**要使用 Amazon ECS 控制台创建新的任务定义**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择 **Task definitions**（任务定义）。

1. 选择 **Create new task definition**（创建新的任务定义）、**Create new task definition with JSON**（使用 JSON 创建新的任务定义）。

1. 在 JSON 编辑器框中，复制并粘贴以下 JSON 文本，将 `fileSystemId` 替换为 Amazon EFS 文件系统的 ID。

   ```
   {
       "containerDefinitions": [
           {
               "memory": 128,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "containerPort": 80,
                       "protocol": "tcp"
                   }
               ],
               "essential": true,
               "mountPoints": [
                   {
                       "containerPath": "/usr/share/nginx/html",
                       "sourceVolume": "efs-html"
                   }
               ],
               "name": "nginx",
               "image": "public.ecr.aws/docker/library/nginx:latest"
           }
       ],
       "volumes": [
           {
               "name": "efs-html",
               "efsVolumeConfiguration": {
                   "fileSystemId": "fs-1324abcd",
                   "transitEncryption": "ENABLED"
               }
           }
       ],
       "family": "efs-tutorial",
       "executionRoleArn":"arn:aws:iam::111122223333:role/ecsTaskExecutionRole"
   }
   ```
**注意**  
Amazon ECS 任务执行 IAM 角色不需要任何特定的 Amazon EFS 相关权限，即可挂载 Amazon EFS 文件系统。如果不存在基于 Amazon EFS 资源的策略，则默认情况下，在创建文件系统时，会向所有主体（\$1）授予访问权限。  
只有在 Amazon ECS 任务定义中启用了“EFS IAM 授权”时，才需要使用 Amazon ECS 任务角色。启用后，必须允许任务角色身份访问基于 Amazon EFS 资源的策略中的 Amazon EFS 文件系统，并且应禁用匿名访问权限。

1. 选择**创建**。

## 步骤 6：运行任务并查看结果
<a name="efs-run-task"></a>

现在，您的 Amazon EFS 文件系统已经创建，并且已经有 NGINX 容器要提供的 Web 内容，您可以使用您创建的任务定义运行任务了。NGINX Web 服务器提供简单的 HTML 页面。如果更新 Amazon EFS 文件系统中的内容，更改会传播到挂载了该文件系统的所有容器。

该任务在您为集群定义的子网中运行。

**使用控制台运行任务并查看结果**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在 **Clusters**（集群）页面上，选择包含要运行独立任务的集群。

   确定要从其中启动服务的资源。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. （可选）选择计划任务在集群基础设施中的分发方式。展开 **Compute configuration**（计算配置），然后执行以下操作：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. 对于**应用程序类型**，选择**任务**。

1. 对于**任务定义**，选择您之前创建的 `efs-tutorial` 任务定义。

1. 对于**所需任务**，输入 `1`。

1. 选择**创建**。

1. 在**集群**页面上，选择**基础设施**。

1. 在**容器实例**下，选择要连接的容器实例。

1. 在**容器实例**页面的**联网**下，记录您的实例的**公有 IP**。

1. 打开浏览器并输入公有 IP 地址。您将看到以下消息：

   ```
   It works!
   You are using an Amazon EFS file system for persistent container storage.
   ```
**注意**  
如果没有看到该消息，请确保容器实例的安全组允许端口 80 上的入站网络流量，且文件系统的安全组允许从容器实例进行入站访问。