如何在 ECS 任务中将 Amazon EFS 挂载为数据卷?

sit*_*ith 5 amazon-web-services docker amazon-ecs amazon-efs

启动配置上的用户数据:

#!/bin/bash
echo ECS_CLUSTER=prodcluster >> /etc/ecs/ecs.config

sudo yum install -y nfs-utils 
sudo mkdir /home/ec2-user/web_file_uploads 
sudo chmod 777 /home/ec2-user/web_file_uploads 

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-abcdef.efs.ap-southeast-2.amazonaws.com:/ /home/ec2-user/web_file_uploads 
Run Code Online (Sandbox Code Playgroud)

任务定义:

{
  "networkMode": "bridge",
  "containerDefinitions": [
    {
      "portMappings": [
        ...
      ],
      "essential": true,
      "mountPoints": [
        {
          "containerPath": "/src/temp_uploads/",
          "sourceVolume": "web_file_uploads",
          "readOnly": null
        }
      ],
      "name": "webapp",
      "readonlyRootFilesystem": null,
      "image": "911911911.dkr.ecr.ap-southeast-2.amazonaws.com/webapp:release6",
      "memoryReservation": 150
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/home/ec2-user/web_file_uploads"
      },
      "name": "web_file_uploads"
    }
  ],
  "family": "webapp-task"
}
Run Code Online (Sandbox Code Playgroud)

注意:我已将所需的端口添加到安全组。src/temp_uploads 文件夹必须包含在使用此任务定义启动的所有其他容器实例中。

问题:如果我使用 手动挂载它sudo mount ... folder1,将一些文件放在那里并将其挂载到sudo mount ... folder2文件夹 2 中,其中包含显示它正确挂载的更改。

问题是通过任务定义映射的卷没有 map efs。相反,它实际上在里面放置/使用内容/home/ec2-user/web_file_uploads。如何使这个卷实际映射到efs

sit*_*ith 2

修改午餐配置以在挂载 EFS 后立即重新启动 docker 服务。那么只有 ECS 才会使用挂载的 EFS 作为卷。否则它将使用原始目录(挂载将被忽略)。

#!/bin/bash
echo ECS_CLUSTER=prodcluster >> /etc/ecs/ecs.config
sudo yum install -y nfs-utils

sudo stop ecs
sudo mkdir /home/ec2-user/web_file_uploads
sudo chmod 777 /home/ec2-user/web_file_uploads
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-abcdef.efs.ap-southeast-2.amazonaws.com:/ /home/ec2-user/web_file_uploads
sudo service docker restart
sudo start ecs
Run Code Online (Sandbox Code Playgroud)

注意:由于 ECS Agent 在 docker 内部运行,因此重启 docker 服务后,ECS 服务将停止。之后您需要启动ECS服务。