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}\nRun Code Online (Sandbox Code Playgroud)\n正如医生所说:
\n\n\nelasticfilesystem:ClientWrite ------> 为 NFS 客户端提供\n文件系统写入权限。
\n
我通过执行以下命令进行安装:
\n sudo mount -t efs -o tls,accesspoint=fsap-oooooooooooooooo fs-aaaaaaa:/ efs\nRun Code Online (Sandbox Code Playgroud)\n确实,我可以看到内容,但Permission denied每次我尝试写时都会得到。
[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\nRun Code Online (Sandbox Code Playgroud)\n任何帮助将非常感激。谢谢。
\n我已经成功实现了目标,这个答案旨在分享我的经验,以防有人遇到相同的用例。
如果您使用 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)
希望这可以帮助。如果有任何不明确或不清楚的地方,请告诉我。
| 归档时间: |
|
| 查看次数: |
7718 次 |
| 最近记录: |