解决 minio上传文件Service: S3, Status Code: 403

错误信息

[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 服务器的步骤。

  1. 安装 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
      
  2. 配置 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
      

      这样,即使没有上级时间源,服务器也会使用本地系统时间为客户端提供服务。

  3. 启动 NTP 服务

    启动并使 NTP 服务在 ServerA 上启动:

    sudo systemctl restart ntp
    sudo systemctl enable ntp
    
步骤 2: 配置客户端同步时间
  1. 安装 NTP 客户端

    在需要同步时间的机器(假设是 ServerB)上安装 ntp 服务。

    • Ubuntu/Debian 系统上:

      sudo apt update
      sudo apt install ntpdate
      
    • CentOS/RHEL 系统上:

      sudo yum install ntpdate
      
  2. 同步时间

    使用 ntpdate 命令将 ServerB 的时间同步到 ServerA

    sudo ntpdate <ServerA-IP>
    

    例如,如果 ServerA 的 IP 地址是 192.168.1.100,则执行:

    sudo ntpdate 192.168.1.100
    
  3. 自动同步(可选)

    如果你希望 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

签署和对 REST 请求进行身份验证 - Amazon Simple Storage Service

什么是 Amazon S3? - Amazon Simple Storage Service

### 使用Python通过POST上传文件MinIO 为了实现向MinIO服务器发送文件,可以利用`requests`库来构建并执行HTTP POST求。下面展示了一个具体的例子,在这个实例中,假设已经配置好了MinIO服务,并知晓访问所需的URL、密钥等必要参数。 首先安装必要的依赖项: ```bash pip install requests ``` 接着按照如下方式编写代码片段用于上传操作[^1]: ```python import os import requests from requests.auth import HTTPBasicAuth def upload_file_to_minio(file_path, bucket_name, object_name=None): """ Uploads a file to the specified MinIO server. :param file_path: Path of local file. :param bucket_name: Name of destination bucket on MinIO. :param object_name: (Optional) Object name within MinIO. If not provided, filename will be used as object name. """ minio_url = "http://your-minio-server-url" access_key = &#39;YOUR-ACCESS-KEY&#39; secret_key = &#39;YOUR-SECRET-KEY&#39; if object_name is None: object_name = os.path.basename(file_path) url = f"{minio_url}/{bucket_name}/{object_name}" with open(file_path, &#39;rb&#39;) as data: response = requests.put( url=url, auth=HTTPBasicAuth(access_key, secret_key), data=data ) if response.status_code == 200 or response.status_code == 204: print(f&#39;Successfully uploaded {file_path} to {url}&#39;) else: raise Exception(&#39;Failed to upload&#39;, response.text) if __name__ == &#39;__main__&#39;: test_file = &#39;/path/to/your/file.txt&#39; # Replace with your actual file path target_bucket = &#39;my-bucket-name&#39; # Your desired bucket name here try: upload_file_to_minio(test_file, target_bucket) except Exception as e: print(e) ``` 需要注意的是上述代码中的`put()`方法被用来替代传统的`post()`方法来进行对象存储API调用;这是因为S3兼容的对象存储系统(如MinIO),通常遵循RESTful API设计模式,其中PUT动词更适合表示资源创建或更新动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值