Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

您可以将 Amazon EFS 文件系统与 Amazon ECS 配合使用,以便导出您的各个容器实例队列上的文件系统数据。这样,无论您的任务登录的是哪个实例,都可以访问相同的持久性存储。但是,您必须将容器实例 AMI 配置为在 Docker 守护程序启动前挂载 Amazon EFS 文件系统。此外,您的任务定义还必须引用容器实例上的卷挂载才能使用该文件系统。下面几个部分可帮助您了解如何将 Amazon EFS 与 Amazon ECS 配合使用。

步骤 1:收集群集信息

在创建所有必需的资源,以便将 Amazon EFS 与 Amazon ECS 群集配合使用前,您需要先收集一些有关群集的基本信息,例如,托管该环境的 VPC、该环境使用的安全组等。

收集群集的 VPC 和安全组 ID

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

  2. 从您的群集中选择一个容器实例,然后查看该实例详细信息的 Description 选项卡。 如果您的群集是在首次运行 Amazon ECS 时或使用群集创建向导创建的,则群集名称应该是 EC2 实例名称的一部分。例如,名为 default 的群集的 EC2 实例名称可能是:ECS Instance - EC2ContainerService-default

  3. 记下您的容器实例VPC ID 值。稍后,您需要在该 VPC 中创建安全组和 Amazon EFS 文件系统。

  4. 打开安全组,查看其详细信息。

  5. 记下 Group ID。稍后,需要允许从该安全组到您的 Amazon EFS 文件系统的入站流量。

步骤 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. 依次选择 InboundAdd rule

  7. 对于 Type,选择 All traffic

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

  9. 选择 Create

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

必须先创建 Amazon EFS 文件系统,然后才能将 Amazon EFS 与容器实例配合使用。

Amazon ECS 容器实例创建 Amazon EFS 文件系统

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

  2. 选择 Create file system

  3. Configure file system access 页面上,选择托管容器实例的 VPC,然后选择 Next Step。默认情况下,指定 VPC 中的每个子网都会收到使用该 VPC 默认安全组的挂载目标。

    注意

    您的 Amazon EFS 文件系统与您的容器实例必须位于同一个 VPC 中。

  4. 对于 Security groups,添加您在上一部分中创建的安全组。选择下一步

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

  6. 为文件系统选择性能模式,然后选择 Next Step

    注意

    默认值是 General Purpose (推荐大多数文件系统使用)。

  7. 查看文件系统选项,然后选择 Create File System

步骤 4:配置容器实例

容器实例所在的 VPC 中创建 Amazon EFS 文件系统后,必须对容器实例进行配置,以访问和使用该文件系统。容器实例必须在 Docker 守护程序启动前挂载 Amazon EFS 文件系统;或者,您也可以在挂载文件系统后重新启动 Docker 守护程序。

将正在运行的容器实例配置为使用 Amazon EFS 文件系统

  1. 通过 SSH 登录到容器实例有关更多信息,请参阅连接到您的容器实例

  2. 为 Amazon EFS 文件系统创建挂载点。例如:/efs

    Copy
    sudo mkdir /efs
  3. 容器实例上安装 NFS 客户端软件。

    • 对于 Amazon Linux、CentOS 和 Red Hat Enterprise Linux:

      Copy
      sudo yum install -y nfs-utils
    • 对于 Ubuntu 和 Debian:

      Copy
      sudo apt-get install -y nfs-common
  4. 使用下面的命令挂载您的文件系统。请务必将文件系统 ID 和区域替换成您自己的内容。

    Copy
    sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-613c8628.efs.us-east-1.amazonaws.com:/ /efs
  5. 使用下面的命令验证文件系统是否正确挂载。您应会看到与您的 Amazon EFS 文件系统匹配的文件系统条目。如果未看到匹配条目,请参阅 Amazon Elastic File System 用户指南 中的 Amazon EFS 问题排查

    Copy
    mount | grep efs
  6. 备份 /etc/fstab 文件。

    Copy
    sudo cp /etc/fstab /etc/fstab.bak
  7. 更新 /etc/fstab 文件,以便在启动时自动挂载该文件系统。

    Copy
    echo 'fs-613c8628.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' | sudo tee -a /etc/fstab
  8. 重新加载文件系统表,以验证您的挂载是否正常工作。

    Copy
    sudo mount -a

    注意

    如果在运行上述命令时出现错误,请检查 /etc/fstab 文件是否有问题。如有必要,请使用之前创建的备份还原它。

  9. 重新启动 Docker,以便它发现新的文件系统。以下命令适用于经 Amazon ECS 优化的 AMI。如果您使用的是其他操作系统,请相应地调整命令。

    注意

    这些命令会停止正在容器实例上运行的所有容器。

    1. 停止 Amazon ECS 容器代理。

      Copy
      sudo stop ecs
    2. 重新启动 Docker 守护程序。

      Copy
      sudo service docker restart
    3. 启动 Amazon ECS 容器代理。

      Copy
      sudo start ecs

使用用户数据引导实例使用 Amazon EFS

您可以使用 Amazon EC2 用户数据脚本在启动时引导经 Amazon ECS 优化的 AMI。有关更多信息,请参阅 使用 Amazon EC2 用户数据引导启动容器实例

  1. 按照启动 Amazon ECS 容器实例中的容器实例启动说明操作。

  2. 步骤 7上,传递以下用户数据来配置实例。如果使用的不是 default 群集,请务必替换配置文件中的 ECS_CLUSTER=default 行,以指定您自己的群集名称。

    Copy
    Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" # Install nfs-utils cloud-init-per once yum_update yum update -y cloud-init-per once install_nfs_utils yum install -y nfs-utils # Create /efs folder cloud-init-per once mkdir_efs mkdir /efs # Mount /efs cloud-init-per once mount_efs echo -e 'fs-abcd1234.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' >> /etc/fstab mount -a --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set any ECS agent configuration options echo "ECS_CLUSTER=default" >> /etc/ecs/ecs.config --==BOUNDARY==--

步骤 5:创建任务定义以使用 Amazon EFS 文件系统

该文件系统挂载在主机容器实例上,因此,您必须在 Amazon ECS 任务定义AWS Batch 作业定义中创建一个卷挂载,以便您的容器能够访问该文件系统。

下面的任务定义作业定义在主机容器实例的 Amazon EFS 文件系统上的 /efs/html 处创建了一个名为 efs-html 的数据卷。nginx 容器将该主机数据卷挂载在 NGINX 根目录 (/usr/share/nginx/html) 下。

Copy
{ "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": [ { "host": { "sourcePath": "/efs/html" }, "name": "efs-html" } ], "family": "nginx-efs" }

您可以将该任务定义作业定义保存到一个名为 nginx-efs.json 的文件,并使用下面的 AWS CLI 命令将其注册为在您自己的群集中使用。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的安装 AWS 命令行界面

Copy
aws ecs register-task-definition --cli-input-json file://nginx-efs.json

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

在该 NGINX 示例任务中,您需要在容器实例上的 /efs/html 中创建一个目录来托管 Web 内容。您必须先向该文件系统添加一些内容,然后该 NGINX 容器才能提供 Web 内容。在此部分,您需要登录到容器实例并添加一个 index.html 文件。

向文件系统添加内容

  1. 使用 SSH 连接到您的某个使用 Amazon EFS 文件系统的容器实例有关更多信息,请参阅连接到您的容器实例

  2. 通过将以下文本块复制并粘贴到终端,编写一个简单的 HTML 文件。

    Copy
    sudo bash -c "cat >/efs/html/index.html" <<'EOF' <html> <body> <h1>It Works!</h1> <p>You are using an Amazon EFS file system for persistent container storage.</p> </body> </html> EOF

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

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

运行任务并查看结果

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

  2. 选择您配置为使用 Amazon EFS 的群集。

  3. 依次选择 TasksRun new task

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

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

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

    注意

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