如何使用 FakeS3 测试 Luigi?

How to test Luigi with FakeS3?

我正在尝试测试我的 Luigi pipelines inside a vagrant machine using FakeS3 to simulate my S3 endpoints. For boto 是否能够与 FakeS3 交互,必须使用 OrdinaryCallingFormat 设置连接,如:

from boto.s3.connection import S3Connection, OrdinaryCallingFormat
conn = S3Connection('XXX', 'XXX', is_secure=False, 
                    port=4567, host='localhost',
                    calling_format=OrdinaryCallingFormat())

但是当使用 Luigi 时,这个连接被隐藏在 s3 module 中。通过修改我的 luigi.cfg 并添加一个 s3 部分,我能够通过大多数选项,如

[s3]
host=127.0.0.1
port=4567
aws_access_key_id=XXX
aws_secret_access_key=XXXXXX
is_secure=0

但我不知道如何为 calling_format 传递所需的对象。

现在我卡住了,不知道如何继续。我能想到的选项:

  1. 弄清楚如何通过 luigi.cfg
  2. OrdinaryCallingFormat 传递给 S3Connection
  3. 通过在 .aws/configboto.cfg[=41= 中为我设置未知选项,找出如何强制 boto 在我的 Vagrant 机器中始终使用此调用格式]
  4. FakeS3 接受 boto 使用的默认值 calling_format 恰好是 SubdomainCallingFormat(不管它是什么意思)。

关于如何解决这个问题有什么想法吗?

您不能将它作为 S3Client 的 kwargs 传递给构造函数吗?

client = S3Client(aws_access_key, aws_secret_key,
                  {'calling_format':OrdinaryCallingFormat()})
target = S3Target('s3://somebucket/test', client=client)

我在使用boto3连接fakeS3时没有遇到任何问题。

import boto3
s3 = boto3.client(
    "s3", region_name="fakes3",
    use_ssl=False,
    aws_access_key_id="",
    aws_secret_access_key="",
    endpoint_url="http://localhost:4567"
)

不需要特殊的调用方法。

也许我错了,您确实需要 OrdinaryCallingFormat,如果我的代码不起作用,请查看 github 主题 boto3 支持: https://github.com/boto/boto3/issues/334

可以通过calling_format参数设置。以下是 fake-s3 的配置示例:

[s3]
aws_access_key_id=123
aws_secret_access_key=abc
host=fake-s3
port=4569
is_secure=0
calling_format=boto.s3.connection.OrdinaryCallingFormat