跳至内容

如何将 Amazon EFS 文件系统挂载到 Amazon ECS 容器上或 Fargate 上运行的任务中?

3 分钟阅读
0

我想在 Amazon Elastic Container Service(Amazon ECS)容器或任务上挂载 Amazon Elastic File System(Amazon EFS)文件系统。Amazon ECS 容器或任务正在 AWS Fargate 上运行。

解决方法

要在 Fargate 任务或容器上挂载 Amazon EFS 文件系统,必须先创建任务定义。然后,将该任务定义提供给 AWS 区域内所有可用区的任务中的容器。最后,Fargate 任务使用 Amazon EFS 自动将文件系统挂载到在任务定义中指定的任务。

**重要事项:**以下解决方法适用于 Fargate 版本 1.4.0 及更高版本。这些版本具有可在 Amazon ECS 的任务和容器级别定义的永久存储。Fargate 版本 1.3.0 或更早版本不支持将永久存储用于 Amazon EFS。

先决条件

必须具备以下条件:

创建和配置 Amazon EFS 文件系统

  1. 创建 Amazon EFS 文件系统,然后记下 EFS ID 和安全组 ID。
    **注意:**Amazon EFS 文件系统、Amazon ECS 集群和 Fargate 任务必须全部位于同一 VPC 中。
  2. 编辑 EFS 文件系统的安全组规则以允许入站连接。您必须允许通过端口 2049(网络文件系统,简称 NFS)从与 Fargate 任务或服务关联的安全组进行连接。
  3. 更新 Amazon ECS 服务的安全组,以允许通过端口 2049 对 Amazon EFS 文件系统的安全组进行出站连接。

创建任务定义

  1. 打开 Amazon ECS 经典控制台。
  2. 在导航窗格中,选择 Task Definitions(任务定义),然后选择 Create new Task Definition(创建新的任务定义)。
  3. 在 Select launch type compatibility(选择启动类型兼容性)部分中,选择 FARGATE,然后选择 Next Step(下一步)。
  4. 在 Configure task and container definitions(配置任务和容器定义)部分中,对于 Task Definition Name(任务定义名称),输入任务定义的名称。
  5. 在 Volumes(卷)部分中,选择 Add volume(添加卷)。
  6. 对于 Name(名称),输入卷的名称。
  7. 对于 Volume type(卷类型),输入 EFS。
  8. 对于 File system ID(文件系统 ID),输入 Amazon EFS 文件系统的 ID。
    **注意:**您可以为 Root directory(根目录)、Encryption in transit(传输中加密)和 EFS AWS Identity and Access Management (IAM) authorization(EFS AWS Identity and Access Management (IAM) 授权)指定自定义选项。或者,您可以接受默认选项,其中“/”为根目录。
  9. 选择 Add(添加)。
  10. 在 Containers Definition(容器定义)部分中,选择 Add container(添加容器)。
  11. 在 STORAGE AND LOGGING(存储和日志)部分的 Mount points(挂载点)子部分中,选择在步骤 5 中为 Source volume(源卷)创建的卷。
  12. 对于 Container path(容器路径),选择容器路径。
  13. (可选)在环境部分中,为入口点输入相应的入口点。
  14. 对于命令,输入 [df ,-h] 命令以显示已挂载的文件系统。
    **注意:**可以使用入口点和命令来测试 Amazon EFS 文件系统是否已成功挂载。默认情况下,容器在 df -h 命令成功运行后退出。步骤 16 中的 JSON 任务定义示例使用无限的 while 循环来保持任务运行。
  15. 选择 Add(添加)。
  16. 在任务定义向导中为其余字段输入信息,然后选择创建。

在以下示例中,JSON 任务定义使用无限循环来让任务一直运行。任务定义创建了一个名为 efs-test 的数据卷。nginx 容器将主机数据卷挂载到 Any_Container_Path 路径上。

{
  "family": "sample-fargate-test",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::1234567890:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "fargate-app",
      "image": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "entryPoint": [
        "sh",
        "-c"
      ],
      "command": [
        "df -h && while true; do echo \"RUNNING\"; done"
      ],
      "mountPoints": [
        {
          "sourceVolume": "efs-test",
          "containerPath": "Any_Container_Path"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "AWS_LOG_GROUP_PATH",
          "awslogs-region": "AWS_REGION",
          "awslogs-stream-prefix": "AWS_STREAM_PREFIX"
        }
      }
    }
  ],
  "volumes": [
    {
      "name": "efs-test",
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-123xx4x5"
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512"
}

**注意:**使用自定义配置的值替换 fileSystemId、logConfiguration、containerPath 和其他占位符值。此外,请确认任务定义具有执行角色 Amazon 资源名称 (ARN) 以支持 awslogs 日志驱动程序。
要将多个 EFS 挂载到不同的目标 (containerPath),可以在任务定义中定义多个 mountPoints 和 volumes。

运行 Fargate 任务并检查任务日志

  1. 使用您之前创建的任务定义运行 Fargate 任务。
    **重要事项:**您必须使用 Fargate 平台版本 1.4.0 来运行任务。
  2. 要验证 Amazon EFS 文件系统是否已成功挂载到 Fargate 容器上,请检查任务日志。
    df-h 的输出类似于以下内容:
    2020-10-27 15:15:35Filesystem 1K-blocks Used Available Use% Mounted on
    
    2020-10-27 15:15:35
    overlay 30832548 9859324 19383976 34% /
    
    2020-10-27 15:15:35
    tmpfs 65536 0 65536 0% /dev
    
    2020-10-27 15:15:35
    shm 2018788 0 2018788 0% /dev/shm
    
    2020-10-27 15:15:35
    tmpfs 2018788 0 2018788 0% /sys/fs/cgroup
    
    2020-10-27 15:15:35
    fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ 9007199254739968 0 9007199254739968 0% /Any_Container_Path
    
    2020-10-27 15:15:35
    /dev/xvdcz 30832548 9859324 19383976 34% /etc/hosts
    
    2020-10-27 15:15:35
    tmpfs 2018788 0 2018788 0% /proc/acpi
    
    2020-10-27 15:15:35
    tmpfs 2018788 0 2018788 0% /sys/firmware
    
    2020-10-27 15:15:35
    tmpfs 2018788 0 2018788 0% /proc/scsi
    
    RUNNING

相关信息

Amazon EFS 卷的安全和访问控制

在 Amazon ECS 任务定义中指定 Amazon EFS 文件系统

使用控制台为 Amazon ECS 配置 Amazon EFS 文件系统