办理腾讯云 COS 客户端报 Request has expired 的问题

打印 上一主题 下一主题

主题 1857|帖子 1857|积分 5571

配景

我有一段 python 代码,是用于与腾讯云对象存储服务 COS 举行交互,从而实现对象搜索、对象下载等功能。
本地调试没问题后,想利用 docker 实现容器化部署,却报错了,提示 “AccessDenied” 以及 “Request has expired"。明明各种配置参数都一样,为什么换个地方就运行不了了呢。
结论

这里先给出根本原因和办理方案:


  • 根本原因容器的体系时间与真及时间不同等(一样寻常是远远落后于真及时间),导致 COS 客户端在发起哀求的时间,签名过期,哀求失败。
  • 办理方案:共有 3 类方案:

    • 容器利用宿主机的本地时间设置:将宿主机的 /etc/localtime 文件挂载到容器的相同路径下,并以只读模式 (ro) 举行挂载即可。但我的环境比力特殊——利用的是 podman 而非 docker,容器内的时间实际上是与虚拟机同步的,修改虚拟机的时间设置比力麻烦,折腾了一小时没乐成,终极放弃这种方案。
    • 容器利用 NTP(网络时间协议)客户端与 NTP 服务器同步时间:在容器内安装和配置 NTP 客户端,然后利用 NTP 服务器同步时间。但需要装一堆东西,很麻烦,我的容器是 alpine 体系(一个面向安全的轻型 Linux 发行版),很多包都需要重新安装,折腾了一小时没乐成,终极放弃这种方案。
    • 传递 cos 签名超时参数:相比于前面两者比力治本的方法,这种方式有颔首痛医头的感觉,而且是绕过了问题。因为如果你用 time.time 或其他方法读取时间,读到的还是错误的时间。但无所谓了,能办理问题就行,详见下文。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表