如何在AWS EC2实例用s3fs挂载S3桶时使其使用IMDS v2
问题原因及解决方案
1. 初始401未授权报错原因
s3fs-fuse v1.90的正式发布版本并未完整实现IMDSv2兼容,其标注的IMDSv2支持仅在后续的开发分支提交中才上线,因此纯v1.90正式版在仅启用IMDSv2的实例上调用元数据接口会直接返回401未授权,仅IMDSv1环境可正常运行。
2. 拉取修复提交后出现417错误的解决方法
你遇到的417 Expectation Failed报错是该早期IMDSv2修复提交的已知问题,原因是curl请求IMDSv2令牌接口时默认携带了Expect: 100-continue请求头,而AWS IMDSv2接口不支持该请求头,直接返回417错误。
你可以按以下步骤修复:
- 拉取s3fs-fuse主分支2021年9月10日及之后的提交版本,官方已针对该417问题提交了专门修复,在IMDSv2请求逻辑中强制禁用了Expect请求头
- 如果你暂时无法更新版本,也可以在挂载命令中添加额外curl参数,手动禁用Expect头,修改后的挂载命令如下:
sudo s3fs <bucket> <mount-point> -o iam_role=auto,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,curldbg="-H 'Expect:'" -f
- 另外请确认你的EC2实例的IMDSv2配置中的跳数限制设置≥2,s3fs运行时调用元数据接口的跳数如果超过限制也会导致请求失败,你可以在AWS控制台EC2实例详情的"实例元数据选项"中修改该参数,或者通过AWS CLI执行以下命令修改:
aws ec2 modify-instance-metadata-options --instance-id <你的实例ID> --http-put-response-hop-limit 2 --http-endpoint enabled
验证方法
配置完成后重新执行挂载命令,可在debug日志中看到IMDSv2令牌获取成功的相关日志输出,无401/417报错即为配置成功,后续即可正常访问挂载的S3桶内容。
内容的提问来源于stack exchange,提问作者dovregubben
相关产品推荐
相关产品推荐

