Amazon web services 无法在装载的卷aws efs上写入文件
我正在利用Apache Airflow为公司内的工作流构建一个可扩展的分布式体系结构。我正在使用ECS Fargate 由于这是一种分布式体系结构,因此需要一个非集中式文件系统,以便在所有机器上具有一致的共享视图(即,Web服务器还需要访问DAGs文件、调度程序和工作程序) 为此,我使用AWS EFS,可以成功地将文件系统装载到EC2实例中,但无法在其中写入或创建文件 这是财政司司长的政策:Amazon web services 无法在装载的卷aws efs上写入文件,amazon-web-services,permissions,amazon-ecs,mount,Amazon Web Services,Permissions,Amazon Ecs,Mount,我正在利用Apache Airflow为公司内的工作流构建一个可扩展的分布式体系结构。我正在使用ECS Fargate 由于这是一种分布式体系结构,因此需要一个非集中式文件系统,以便在所有机器上具有一致的共享视图(即,Web服务器还需要访问DAGs文件、调度程序和工作程序) 为此,我使用AWS EFS,可以成功地将文件系统装载到EC2实例中,但无法在其中写入或创建文件 这是财政司司长的政策: { "Version": "2012-10-17",
{
"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
事实上,我可以看到内容,但每次尝试写作时都被拒绝了权限
[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\u定义中有一个名为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卷。请记住指定卷
配置。这是地形图:
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"
}
}
}
希望这有帮助。如果有不明确或不清楚的地方,请告诉我。ec2用户是否可能没有写入权限。你是否尝试过以sudo的身份写作?你是否也尝试过获得阅读权限?最后,我可以通过完全删除文件系统策略并成为root
用户来创建/触摸文件。在EC2实例中。您能告诉我containerPath
是什么意思吗?我无法写入卷,我不确定该如何设置此路径。我有root\u directory=“/”
,但我想让我的应用程序(grafana)写入VolumeContainer中的几个目录路径是从EFS装入点所在容器的角度来看的路径。假设您在容器的终端中,那么“/usr/local/afflow/dags”目录实际上就是EFS的“/”目录。