如何在代理后启用IMDS v2的AWS EC2实例上用s3fs挂载S3存储桶
问题根因
你遇到的417报错确实是s3fs请求IMDSv2地址时走了代理导致的,核心原因有两个:
- 执行s3fs时使用了
sudo命令,默认sudo会重置用户环境变量,你当前会话配置的NO_PROXY变量不会传递到sudo的执行上下文,导致s3fs读取不到例外配置 - s3fs默认优先读取自身挂载参数里的代理配置,没有配置的情况下才会读取系统环境变量,v1.90版本对小写的
http_proxy/no_proxy和大写的HTTP_PROXY/NO_PROXY的兼容也存在差异
解决方案
方案1:显式传递环境变量执行挂载命令
执行挂载时直接把代理相关变量传递到sudo执行环境,命令如下:
sudo HTTP_PROXY=$HTTP_PROXY NO_PROXY=$NO_PROXY s3fs SOME_BUCKET ./mnt-s3/ -o iam_role=SOME_ROLE,url=https://s3.eu-central-1.amazonaws.com,endpoint=eu-central-1,allow_other,uid=1000,gid=1000,mp_umask=007,use_cache=/tmp/s3foldercache,dbglevel=debug -f
如果要长期生效,可以修改/etc/sudoers文件,添加配置保留这两个环境变量:
Defaults env_keep += "HTTP_PROXY NO_PROXY"
方案2:直接在s3fs挂载参数中配置no_proxy(更稳定,推荐)
直接在s3fs的-o参数中添加no_proxy配置项,完全不依赖系统环境变量,避免大小写兼容和sudo变量传递问题,修改后的挂载命令如下:
sudo s3fs SOME_BUCKET ./mnt-s3/ -o iam_role=SOME_ROLE,url=https://s3.eu-central-1.amazonaws.com,endpoint=eu-central-1,allow_other,uid=1000,gid=1000,mp_umask=007,use_cache=/tmp/s3foldercache,dbglevel=debug,no_proxy=169.254.169.254,*.eu-central-1.amazonaws.com -f
如果需要配置代理地址,也可以同时添加proxy=<代理主机>:<代理端口>参数到-o列表中。
如果你是配置/etc/fstab开机自动挂载,直接把no_proxy参数写到fstab条目的options字段中即可。
验证
执行修改后的挂载命令,如果没有报错退出,可以新开启一个终端进入挂载目录,执行读写操作验证功能正常即可。
内容的提问来源于stack exchange,提问作者dovregubben
相关产品推荐
相关产品推荐

