错误信息
[software.amazon.awssdk.services.s3.model.S3Exception: (Service: S3, Status Code: 403, Request ID: 180E9BC04F11312E, Extended Request ID: 81aefed089495c5faf6270c59bea93c9783926f74ef647fe6b17908f0976b557)]
分析过程
4XX一般是客户端错误。403表示禁止访问,是服务器明确告知客户端没有权限访问资源,因此解决问题通常需要从客户端或服务器的配置和权限设置入手。
1、首先确认凭证AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY没有问题;
官网文档 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/Welcome.html
2、确认脚本参数存储桶没有问题;
3、查找资料,aws官方有文档列出403问题的排查步骤和可能原因(如果您遇到拒绝访问问题,请检查账户级别和存储桶级别的设置。此外,请检查您用于授予访问权限的访问管理功能,来确保策略、设置或配置正确无误)链接见附录
错误响应:Error responses - Amazon Simple Storage Service
4、找aws协助,服务端开启请求监控日志记录(为了获取错误更详细的信息,缩小排查范围),确定了403的详细原因是RequestTimeTooSkewed (请求时间和服务器时间之间的差异太大)
解决办法
同步服务端与客户端的时间
如果没有公网 NTP 服务器,你可以将一台机器的时间同步到另一台机器,这通常称为 局域网内的时间同步。在没有公网访问的情况下,可以使用以下方法实现局域网内两台机器之间的时间同步。
使用 NTP 进行时间同步(局域网内部 NTP 服务器)
你可以将一台机器作为 NTP 服务器,并让另一台机器与之同步时间。这个方法适用于两台机器都在同一个局域网内的情况。
步骤 1: 配置 NTP 服务器
假设你选择一台机器作为 NTP 服务器,并让其同步其他机器的时间。以下是如何配置一个 NTP 服务器的步骤。
-
安装 NTP 服务
在你选择的 NTP 服务器(假设是
ServerA
)上,安装ntp
服务。-
在 Ubuntu/Debian 系统上:
sudo apt update sudo apt install ntp
-
在 CentOS/RHEL 系统上:
sudo yum install ntp sudo systemctl start ntpd sudo systemctl enable ntpd
-
-
配置 NTP 服务器
修改
ntp.conf
配置文件,允许其他机器通过网络同步时间。-
编辑
/etc/ntp.conf
文件:sudo nano /etc/ntp.conf
-
在文件中找到
restrict
配置项,允许其他机器访问这个 NTP 服务器。比如:restrict 127.0.0.1 restrict ::1 restrict <server-ip>
你可以用局域网内其他机器的 IP 地址来替换
<server-ip>
,允许这些机器访问 NTP 服务器。 -
如果没有公网,可以将 NTP 服务器设置为使用本地时钟(作为 “孤立模式” 时间源):
server 127.127.1.0 fudge 127.127.1.0 stratum 10
这样,即使没有上级时间源,服务器也会使用本地系统时间为客户端提供服务。
-
-
启动 NTP 服务
启动并使 NTP 服务在
ServerA
上启动:sudo systemctl restart ntp sudo systemctl enable ntp
步骤 2: 配置客户端同步时间
-
安装 NTP 客户端
在需要同步时间的机器(假设是
ServerB
)上安装ntp
服务。-
在 Ubuntu/Debian 系统上:
sudo apt update sudo apt install ntpdate
-
在 CentOS/RHEL 系统上:
sudo yum install ntpdate
-
-
同步时间
使用
ntpdate
命令将ServerB
的时间同步到ServerA
:sudo ntpdate <ServerA-IP>
例如,如果
ServerA
的 IP 地址是192.168.1.100
,则执行:sudo ntpdate 192.168.1.100
-
自动同步(可选)
如果你希望
ServerB
定期自动与ServerA
同步时间,可以配置一个定时任务。-
使用
cron
配置定期任务:sudo crontab -e
-
添加以下内容,表示每天同步一次时间:
0 0 * * * /usr/sbin/ntpdate <ServerA-IP>
这将确保
ServerB
每天同步一次时间。 -
通过这种方法,你可以保证在没有公网 NTP 服务器的情况下,局域网内的两台机器保持一致的时间,从而避免由于时间不同步导致的认证错误。
minio服务器日期
客户端
可以看到客户端慢十多分钟
使用ntpdate servcer_ip
从ntpd服务器同步日期
同步了之后使用date
查看客户端日期
其他说明
有效的时间戳对于经身份验证的请求是必须的 (使用 HTTP Date 标头或 x-amz-date 替代项)。此外,经身份验证的请求随附的客户端时间戳必须处于收到请求时的 Amazon S3 系统时间的 15 分钟之内。否则,请求将失败并出现 RequestTimeTooSkewed 错误代码。施加这些限制的目的是为了防止对方重新使用已拦截的请求。要更好地防范窃听,请对经身份验证的请求使用 HTTPS 传输。
2、GMT(格林尼治标准时间)、UTC(世界协调时)和CST(中国标准时间)是三种不同的时间标准。
-
GMT(格林尼治标准时间):GMT是基于英国伦敦郊区的皇家格林尼治天文台的标准时间。它曾是世界时间的标准,但现在已被UTC取代。GMT是根据地球的自转来定义的,但由于地球自转的不规则性,GMT已经不再作为标准时间使用。
-
UTC(世界协调时):UTC是目前主要的世界时间标准,它以原子时秒长为基础,尽量接近于GMT。UTC比GMT更精确,且在计算机系统中广泛使用。
-
CST(中国标准时间):CST是中国的官方时间,属于东八区,比UTC早8小时。需要注意的是,CST这个缩写也可以代表美国和澳大利亚的中部标准时间以及古巴的标准时间,但在大多数情况下,指的是中国标准时间。
-
这些时间标准之间的差异主要是由于地球的自转速度不均匀以及国际间为了方便协调和交流而设定的标准。例如,中国位于东八区,当GMT是上午11点时,中国北京时间是晚上7点。
-
CentOS Linux能执行成功的原因是,该系统上date显示的是CST类型的时间,脚本date -u能够获取到UTC时间。设备嵌入式Linux系统date显示的是UTC类型时间,但设置的又是UTC+8的值,脚本date -u实际获取到的就是UTC+8的值,所以出现RequestTimeTooSkewed错误。
设置date类型为CST的方法是通过设置TZ环境变量来告诉date命令使用CST时区:export TZ=“Asia/Shanghai”。
3、上传文件到aws s3存储桶,是否会根据region参数cn-northwest-1处理时间:
Error responses - Amazon Simple Storage Service
Amazon S3 错误响应的账单计费 - Amazon Simple Storage Service
排查 Amazon S3 中的拒绝访问(403 禁止)错误 - Amazon Simple Storage Service
使用 AWS CloudTrail 记录 Amazon S3 API 调用 - Amazon Simple Storage Service
启用 Amazon S3 服务器访问日志记录 - Amazon Simple Storage Service
Amazon S3 服务器访问日志格式 - Amazon Simple Storage Service
使用 REST API 对请求进行身份验证 - Amazon Simple Storage Service