无法在已安装的卷 aws efs 上写入文件

Tom*_*hez 6 permissions mount amazon-web-services amazon-ecs

我正在利用 Apache Airflow 为公司内部的工作流程构建可扩展的分布式架构。我正在使用 ECS Fargate。

\n

由于这是一个分布式架构,因此需要一个非集中式文件系统,以便在所有机器上拥有一致的共享视图(即,网络服务器还需要访问 DAG 文件、调度程序和工作人员)。

\n

为此,我使用 AWS EFS,我可以成功地将文件系统挂载到 EC2 实例中,但无法在其中写入或创建文件。

\n

这是附加到 fs 的策略:

\n
{\n    "Version": "2012-10-17",\n    "Id": "ExamplePolicy01",\n    "Statement": [\n        {\n            "Sid": "ExampleSatement01",\n            "Effect": "Allow",\n            "Principal": {\n                "AWS": "*"\n            },\n            "Action": [\n                "elasticfilesystem:ClientMount",\n                "elasticfilesystem:ClientWrite"\n            ],\n            "Resource": "arn:aws:elasticfilesystem:eu-west-1:XXXXXXXXXX:file-system/fs-aaaaaaa"\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

正如医生所说:

\n
\n

elasticfilesystem:ClientWrite ------> 为 NFS 客户端提供\n文件系统写入权限。

\n
\n

我通过执行以下命令进行安装:

\n
 sudo mount -t efs -o tls,accesspoint=fsap-oooooooooooooooo fs-aaaaaaa:/ efs\n
Run Code Online (Sandbox Code Playgroud)\n

确实,我可以看到内容,但Permission denied每次我尝试写时都会得到。

\n
[ec2-user@ip-XXXX ~]$ sudo mount -t efs -o tls,accesspoint=fsap-oooooooooooooooo fs-aaaaaaa:/ efs\n[ec2-user@ip-XXXX ~]$ df -h\nFilesystem      Size  Used Avail Use% Mounted on\ndevtmpfs        2.0G     0  2.0G   0% /dev\ntmpfs           2.0G     0  2.0G   0% /dev/shm\ntmpfs           2.0G  616K  2.0G   1% /run\ntmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup\n/dev/xvda1      8.0G  2.7G  5.4G  33% /\ntmpfs           395M     0  395M   0% /run/user/1000\ntmpfs           395M     0  395M   0% /run/user/0\n127.0.0.1:/     8.0E     0  8.0E   0% /home/ec2-user/efs\n[ec2-user@ip-XXXX ~]$\n[ec2-user@ip-XXXX ~]$ cd efs/\n[ec2-user@ip-XXXX efs]$ touch a\ntouch: cannot touch \xe2\x80\x98a\xe2\x80\x99: Permission denied\n[ec2-user@ip-XXXX efs]$\n[ec2-user@ip-XXXX efs]$ sudo touch a\ntouch: cannot touch \xe2\x80\x98a\xe2\x80\x99: Permission denied\n[ec2-user@ip-XXXX efs]$ sudo su -\nLast login: Wed Aug 19 21:29:39 UTC 2020 on pts/0\n[root@ip-XXXX ~]#\n[root@ip-XXXX ~]# cd /home/ec2-user/efs/\n[root@ip-XXXX efs]#\n[root@ip-XXXX efs]# touch d\ntouch: cannot touch \xe2\x80\x98d\xe2\x80\x99: Permission denied\n
Run Code Online (Sandbox Code Playgroud)\n

任何帮助将非常感激。谢谢。

\n

Tom*_*hez 5

我已经成功实现了目标,这个答案旨在分享我的经验,以防有人遇到相同的用例。

如果您使用 ECS Fargate,则可以选择在平台 1.4.0 的版本中挂载卷。因此,其中container_definitions有一个名为mountPoints

    ...
    "entryPoint": [],
    "command": [],
    "portMappings": [
      {
        "hostPort": ${host_port},
        "protocol": "tcp",
        "containerPort": ${container_port}
      }
    ],
    "mountPoints": [
      {
        "sourceVolume": "dags",
        "containerPath": "/usr/local/airflow/dags",
        "readOnly": false
      }
    ],
    "cpu": ${cpu},
    "environment": [
      {
        "name": "POSTGRES_HOST",
        "value": "${postgres_host}"
      },
      {
        "name": "AIRFLOW_COMPONENT",
        "value": "webserver"
      },
      {
        "name": "REDIS_HOST",
        "value": "${redis_host}"
      }
    ]
    ...
Run Code Online (Sandbox Code Playgroud)

这将挂载 EFS 卷。请记住指定volume配置。这是地形:

resource "aws_ecs_task_definition" "task_definition_airflow_webserver" {
  family                    = "airflow-webserver"
  requires_compatibilities  = ["FARGATE"]
  network_mode              = "awsvpc"
  execution_role_arn        = "${aws_iam_role.ecs_service_role_airflow_webserver.arn}"
  container_definitions     = "${data.template_file.airflow_webserver.rendered}"
  cpu                       = 1024
  memory                    = 2048

  volume {
    name = "dags"

    efs_volume_configuration {
      file_system_id          = "${aws_efs_file_system.airflow_dags_efs.id}"
      root_directory          = "/"
      transit_encryption      = "ENABLED"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。如果有任何不明确或不清楚的地方,请告诉我。