【问题标题】:Boto3 - how to connect to S3 via proxy?Boto3 - 如何通过代理连接到 S3?
【发布时间】:2018-01-11 14:42:25
【问题描述】:

我正在使用一个容器来模拟在 http://127.0.0.1:4569 上运行的 S3 服务器(无需授权或凭据)

我正在尝试使用 python 和 boto3 简单地连接并打印所有存储桶名称的列表

这是我的 docker-compose:

s3:
image: andrewgaul/s3proxy
environment:
  S3PROXY_AUTHORIZATION: none
hostname: s3
ports:
  - 4569:80
volumes:
  - ./data/s3:/data

这是我的代码:

s3 = boto3.resource('s3', endpoint_url='http://127.0.0.1:4569')

for bucket in s3.buckets.all():
    print(bucket.name)enter code here

这是我收到的错误消息:

botocore.exceptions.NoCredentialsError: Unable to locate credentials

我试过这个解决方案 => How do you use an HTTP/HTTPS proxy with boto3?

但还是不行,我不明白我做错了什么

【问题讨论】:

标签: python amazon-s3 docker-compose boto3 s3proxy


【解决方案1】:

首先,boto3 总是尝试使用 AWS API 密钥与 S3 服务器握手。即使您的模拟服务器不需要密码,您仍然需要在 .aws/credentials 或程序中指定它们。例如

[default] 
aws_access_key_id = x
aws_secret_access_key = x

硬编码的虚拟访问密钥示例

import boto3
session = boto3.session(
  aws_access_key_id = 'x', 
  aws_secret_access_key = 'x')

s3 = session.resource('s3', endpoint_url='http://127.0.0.1:4569')

第二,不知道你的“s3模拟容器”实现了多可靠,实现了什么样的协议。为了让生活更轻松,我总是建议任何想要模拟 S3 负载测试或其他任何东西的人使用fake-s3

【讨论】:

  • 谢谢 :) 我试过了 => session = boto3.session.Session(aws_access_key_id = ' ', aws_secret_access_key = ' ') => s3 = session.resource('s3', endpoint_url=' 127.0.0.1:4569') => print(s3.get_available_subresources()) 它工作得很好我得到了我想要的(所有可用子资源的数组)但是当我尝试使用其中一个时上传文件的子资源 => s3.Object(BUCKET_NAME, FILE_NAME).put(Body=open(FILE_NAME, 'rb')) 我收到此错误消息 => ('Connection aborted.', ConnectionRefusedError(111, 'Connection denied '))
  • @LouisW 请作为一个新问题,并记得提及您的“本地化 S3 实例”
  • 这可能取决于 boto 的版本,但对我来说,以下代码返回错误,使用 session = boto3.Session(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2023-03-16
  • 1970-01-01
  • 2023-03-16
  • 2015-07-10
  • 2014-07-17
  • 1970-01-01
相关资源
最近更新 更多