教程:将 Amazon EFS 文件系统与 Amazon ECS 配合使用 - Amazon Elastic Container Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:将 Amazon EFS 文件系统与 Amazon ECS 配合使用

Amazon Elastic File System (Amazon EFS) 提供简单的可扩展文件存储以供您的 Amazon ECS 任务使用。使用 Amazon EFS 时,存储容量是弹性的,可在您添加和删除文件时自动增加和缩减。您的应用程序可在需要时获得所需存储。

您可以将 Amazon EFS 文件系统与 Amazon ECS 配合使用来跨 Amazon ECS 任务队列访问文件系统数据。这样,无论您的任务登录的是基础设施实例还是容器实例,都可以访问相同的持久性存储。当您在 Amazon ECS 任务定义中引用 Amazon EFS 文件系统和容器挂载点时,Amazon ECS 负责在容器中挂载文件系统。下面几节可帮助您了解如何将 Amazon EFS 与 Amazon ECS 配合使用。

同时使用 EC2 和 Fargate 启动类型的任务支持此功能,但本教程将使用的 Amazon ECS 任务将使用 EC2 启动类型。本教程还会采取分步介绍的形式,不过,如果您已经在您的帐户中创建了这些资源中的一部分,您也许可以跳过一些步骤。

注意

Amazon EFS 可能并未在所有区域提供。有关哪些区域支持 Amazon EFS 的更多信息,请参阅 AWS General Reference 中的 Amazon Elastic File System 终端节点和配额

步骤 1:创建 Amazon ECS 集群

请按照以下步骤创建 Amazon ECS 集群。当您使用 AWS 管理控制台 创建非空集群时,Amazon ECS 会创建一个 AWS CloudFormation 堆栈以及 Auto Scaling 资源。

创建 Amazon ECS 集群

  1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 在屏幕顶部的导航栏中,选择 美国西部(俄勒冈) 区域。

  3. 在导航窗格中,选择 Clusters

  4. Clusters 页面上,选择 Create Cluster

  5. 对于 Select cluster compatibility (选择集群兼容性),选择 EC2 Linux + Networking (EC2 Linux + 联网),然后选择 Next Step (下一步)

  6. 对于 Cluster name (集群名称),输入 EFS-tutorial 作为集群名称。

  7. 对于 Provisioning model (预置模型),选择 On-Demand Instance (按需实例)

  8. 对于 EC2 instance type (EC2 实例类型),选择 t2.micro

  9. 对于 Number of instances (实例数) 中,输入 1

  10. 对于 EC2 AMI ID,选择 Amazon Linux 2 Amazon ECS 优化的 AMI。

  11. 对于 EBS storage (GiB) (EBS 存储 (GiB)),保留默认设置。

  12. 对于 Key pair (密钥对),选择要用于容器实例进行 SSH 访问的 Amazon EC2 密钥对。这是必需操作,因为您稍后将连接到该实例。

  13. Networking 部分中,配置要启动容器实例的 VPC。默认情况下,集群创建向导会创建一个新的 VPC (具有位于不同可用区中的两个子网) 和一个安全组 (在端口 80 上对 Internet 开放)。这是一个适用于 HTTP 访问的基本设置。不过,您可以通过执行以下步骤来修改这些设置。

    重要

    记录您用于集群的 VPC 和安全组 ID,因为您需要在同一 VPC 中创建 Amazon EFS 文件系统。

    1. 对于 VPC,创建一个新 VPC 或选择现有 VPC。

    2. (可选)如果您选择创建新 VPC,请为 CIDR Block (CIDR 块) 选择 VPC 的 CIDR 块。有关更多信息,请参阅 Amazon VPC 用户指南 中的您的 VPC 和子网

    3. 对于 Subnets (子网),选择要用于 VPC 的子网。如果您选择创建新 VPC,则可保留默认设置,也可修改这些设置以满足您的需求。如果选择使用现有 VPC,则在该 VPC 中选择一个或多个要用于集群的子网。

    4. 对于 Security group,选择要附加到集群中的容器实例的安全组。如果您选择创建新的安全组,可指定一个 CIDR 块以允许来自它的入站流量。默认端口 0.0.0.0/0 向 Internet 开放。您也可以选择要在容器实例上开放的一个端口或一系列连续端口。要实现更复杂的安全组规则,您可以选择已创建的现有安全组。

      注意

      您还可以选择在创建集群后创建新的安全组并修改规则。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的适用于 Linux 实例的 Amazon EC2 安全组

    5. Container instance IAM role (容器实例 IAM 角色) 部分中,选择要用于容器实例的 IAM 角色。如果您的账户具有在首次运行向导中为您创建的 ecsInstanceRole,则默认情况下会将其选定。如果您的账户中没有此角色,则可选择创建此角色,也可以选择另一个用于您的容器实例的 IAM 角色。

      重要

      您使用的 IAM 角色必须附加 AmazonEC2ContainerServiceforEC2Role 托管策略,否则您将在集群创建期间收到错误。如果未使用适当的 IAM 权限启动容器实例,则 Amazon ECS 代理不会连接到集群。有关更多信息,请参阅Amazon ECS 容器实例 IAM 角色

    6. 对于 CloudWatch Container Insights,取消选择 Enable Container Insights (启用 Container Insights),因为本教程不需要此功能。

    7. 选择创建

步骤 2:为 Amazon EFS 文件系统创建安全组

在此步骤中,需要为 Amazon EFS 文件系统创建一个安全组,以允许您的容器实例进行入站访问。此安全组将包含一个入站规则,该规则引用您在上一步中为集群创建或引用的安全组。

为 Amazon EFS 文件系统创建安全组

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在左侧导航窗格中,选择 Security Groups (安全组),然后选择 Create Security Group (创建安全组)

  3. Security group name 中,为安全组输入唯一的名称。例如:EFS-access-for-sg-dc025fa2

  4. Description 中,为安全组输入说明。

  5. 对于 VPC,选择之前为集群确定的 VPC。

  6. 对于 Inbound rules (入站规则),选择 Add rule (添加规则)

  7. 对于 Type (类型),选择 NFS

  8. 对于 Source (源),选择 Custom (自定义),然后输入之前为集群确定的安全组 ID。

  9. 选择创建安全组

步骤 3:创建 Amazon EFS 文件系统

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

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

  1. 通过 https://console.amazonaws.cn/efs/ 打开 Amazon Elastic File System 控制台。

  2. 选择 Create file system

  3. Configure network access (配置网络访问) 页面上,选择托管容器实例的 VPC。默认情况下,指定 VPC 中的每个子网都会收到使用该 VPC 默认安全组的挂载目标。

    重要

    您的 Amazon EFS 文件系统、Amazon ECS 集群、容器实例和任务必须位于同一 VPC 中。

  4. Create mount targets (创建挂载目标) 下,对于 Security groups (安全组),添加您在步骤 2 中创建的安全组。选择 Next Step (下一步)

  5. Configure file system settings (配置文件系统设置) 页面上,配置可选设置,然后选择 Next Step (下一步) 继续。

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

    2. (可选)启用生命周期管理可节省不经常访问的存储的成本。有关更多信息,请参阅 Amazon Elastic File System 用户指南 中的 EFS 生命周期管理

    3. 为文件系统选择吞吐量模式。Bursting (突增) 模式是默认值,建议大多数文件系统使用它。

    4. 为文件系统选择性能模式。General Purpose (通用) 模式是默认值,建议大多数文件系统使用它。

    5. (可选)启用加密。选中该复选框可对 Amazon EFS 文件系统启用静态加密。

  6. Configure client access (配置客户端访问) 页面上,选择 Next Step (下一步)

  7. 查看文件系统选项,然后选择 Create File System (创建文件系统) 完成此过程。

  8. 在文件系统详细信息屏幕中,记录 File system ID (文件系统 ID)。在下一步中,您将在 Amazon ECS 任务定义中引用此值。

步骤 4:向 Amazon EFS 文件系统添加内容

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

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

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 选择 Launch Instance

  3. Choose an Amazon Machine Image (选择 Amazon 系统映像) 页面上,选择最新的 Amazon Linux 2 AMI (HVM) AMI。

  4. Choose an Instance Type 页面上,保留默认的实例类型 t2.micro,然后选择 Next: Configure Instance Details

  5. Configure Instance Details (配置实例详细信息) 页面中,执行以下操作:

    1. 对于 Network (网络),选择您为 Amazon EFS 文件系统和 Amazon ECS 集群指定的 VPC。

    2. 对于 Auto-assign Public IP (自动分配公有 IP),选择 Enable (启用)。否则,您的实例将不会得到公有 IP 地址或公有 DNS 名称。

    3. 对于 File systems (文件系统),选择 Amazon EFS 文件系统。您可以选择更改挂载位置或保留默认值。

    4. Advanced Details (高级详细信息) 下,确保通过 Amazon EFS 文件系统挂载步骤自动填充用户数据脚本。

  6. 选择 Next: Add Storage (下一步: 添加存储)Next: Add Tags (下一步: 添加标签)Next: Configure Security Group (下一步: 配置安全组),进入实例向导的步骤 5。

  7. Configure Security Group (配置安全组) 页面上,选择 Select an existing security group (选择现有安全组),选择您在步骤 1 中创建的安全组,然后选择 Review and Launch (查看并启动)

  8. Review Instance Launch 页面上,选择 Launch

  9. Select an existing key pair or create a new key pair (选择现有密钥对或创建新密钥对) 对话框中,选择 Choose an existing key pair (选择现有密钥对),然后选择您的密钥对。选择确认复选框,然后选择 Launch Instances

  10. Launch Status (启动状态) 页面上,选择 View Instances (查看实例) 以查看实例的状态。最初,其状态是 pending。在状态变为 running 后,您的实例即准备就绪,可以使用。

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

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

  1. SSH 到您创建的 Amazon EC2 实例。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的连接到您的 Linux 实例

  2. 从每个实例的终端窗口,运行 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
  3. 导航到挂载 Amazon EFS 文件系统的目录。在上述示例中,即为 /mnt/efs/fs1

  4. 使用以下内容创建名为 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:创建任务定义

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

创建新的任务定义

  1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 在导航窗格中,依次选择 Task Definitions (任务定义)Create new Task Definition (创建新任务定义)

  3. Select compatibilities (选择兼容性) 页面上,依次选择 EC2Next step (下一步)

  4. 选择 Configure via JSON (通过 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": "nginx" } ], "volumes": [ { "name": "efs-html", "efsVolumeConfiguration": { "fileSystemId": "fs-1324abcd", "transitEncryption": "ENABLED" } } ], "family": "efs-tutorial" }
  5. 依次选择 Save (保存)Create (创建)

步骤 6:运行任务并查看结果

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

运行任务并查看结果

  1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 选择您之前在步骤 1 中创建的集群。

  3. 依次选择 Tasks (任务)Run new task (运行新任务)

  4. 对于 Task Definition (任务定义),选择您之前创建的 nginx-efs 任务定义,然后选择 Run Task (运行任务)。有关运行任务工作流程中其他选项的更多信息,请参阅 正在运行的任务

  5. Tasks 选项卡下,选择刚刚运行的任务。

  6. 展开页面底部的容器名称,然后选择与容器关联的 IP 地址。浏览器应会打开一个新标签,并显示以下消息:

    注意

    如果没有看到该消息,请确保容器实例的安全组允许端口 80 上的入站网络流量。