无法在已安装的卷AWS EFS上写入文件

问题描述

我正在利用Apache Airflow为我们公司内的工作流构建可扩展和分布式的体系结构。我正在使用ECS Fargate。

由于这是分布式体系结构,因此需要非集中式文件系统,以便在所有计算机上具有一致的共享视图(即,Web服务器还需要访问DAG文件,调度程序和工作程序)。 / p>

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

这是fs附带的政策:

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

并且如文档所述:

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

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

 sudo mount -t efs -o tls,accesspoint=fsap-oooooooooooooooo fs-aaaaaaa:/ efs

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

[ec2-user@ip-XXXX ~]$ sudo mount -t efs -o tls,accesspoint=fsap-oooooooooooooooo fs-aaaaaaa:/ efs
[ec2-user@ip-XXXX ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  616K  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvda1      8.0G  2.7G  5.4G  33% /
tmpfs           395M     0  395M   0% /run/user/1000
tmpfs           395M     0  395M   0% /run/user/0
127.0.0.1:/     8.0E     0  8.0E   0% /home/ec2-user/efs
[ec2-user@ip-XXXX ~]$
[ec2-user@ip-XXXX ~]$ cd efs/
[ec2-user@ip-XXXX efs]$ touch a
touch: cannot touch ‘a’: Permission denied
[ec2-user@ip-XXXX efs]$
[ec2-user@ip-XXXX efs]$ sudo touch a
touch: cannot touch ‘a’: Permission denied
[ec2-user@ip-XXXX efs]$ sudo su -
Last login: Wed Aug 19 21:29:39 UTC 2020 on pts/0
[root@ip-XXXX ~]#
[root@ip-XXXX ~]# cd /home/ec2-user/efs/
[root@ip-XXXX efs]#
[root@ip-XXXX efs]# touch d
touch: cannot touch ‘d’: Permission denied

任何帮助将不胜感激。谢谢。

解决方法

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

如果使用的是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}"
      }
    ]
    ...

将挂载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"
    }
  }
}

希望这会有所帮助。让我知道是否存在歧义或不清楚的地方。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...