amazon-web-services - 无法在已安装的卷 aws efs 上写入文件
问题描述
我正在利用 Apache Airflow 为我们公司的工作流构建一个可扩展的分布式架构。我正在使用 ECS Fargate。
由于这是一个分布式架构,因此需要一个非集中式文件系统,以便在所有机器上拥有一致的共享视图(即,网络服务器还需要访问 DAG 文件、调度程序和工作程序)。
为此,我使用 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"
}
}
}
希望这可以帮助。让我知道是否有任何模棱两可或不清楚的地方。
推荐阅读
- acumatica - 获取 Acumatica 附加的公共文件而不进行身份验证
- javascript - NodeJS“readline”模块不输出提示
- spring - Spring RestTemplate + Basic Authentication + Post with request Body: 500 Internal Server Error
- java - 在 DataFrame 中执行过滤时如何检查表达式是否有效
- google-drive-api - 将 Google 云端硬盘文件从公开更改为私有
- html - 使用动态表格宽度在滚动时修复表格标题
- javascript - 运行js后重定向
- swift - 统一的 Swift API:使用未声明的类型 T
- php - mysql 随机更新一列(快)
- python - 在 Django Channels 中重用现有的 websocket