如何通过 DuckDB 访问模拟的 s3 存储桶

How to access mocked s3 bucket via DuckDB

提问人:anonymus1205 提问时间:11/12/2023 更新时间:11/12/2023 访问量:51

问:

我有一个使用 AWS S3 的无服务器 python 代码,即 DuckDB API。

代码工作正常,重点是此代码的单元测试。

我正在使用 unittest 和 moto python 框架来测试此代码。

问题是将 duckdb 连接配置为指向模拟的 s3 存储桶。

这是 duckdb 配置的代码片段:

            self.db_conn.execute(query=f"SET s3_region='{os.environ['AWS_REGION']}';")
            self.db_conn.execute(query=f"SET s3_access_key_id='{self.tenant_ctx_aws_credentials['Credentials']['AccessKeyId']}';")
            self.db_conn.execute(query=f"SET s3_secret_access_key='{self.tenant_ctx_aws_credentials['Credentials']['SecretAccessKey']}';")
            self.db_conn.execute(query=f"SET s3_session_token='{self.tenant_ctx_aws_credentials['Credentials']['SessionToken']}';")
            self.db_conn.execute(query=f"SET memory_limit='{self.memory_limit}';")

这是来自lambda函数的单元测试文件,该函数使用moto来模拟AWS服务:

@mock_s3
@mock_glue
@mock_ssm
@mock_sts
@mock_iam
@mock.patch.dict(os.environ)
class TestLambdaFunction(unittest.TestCase):

    maxDiff = None

    def setUp(self):
        try:
            # S3 setup:
            self.s3_client = boto3.client('s3', region_name=self.aws_region)
            self.s3_resource = boto3.resource('s3', region_name=self.aws_region)
            self.s3_bucket = self.s3_resource.create_bucket(Bucket=self.dp_s3_bucket_name, CreateBucketConfiguration={
                'LocationConstraint': self.aws_region})

所以我正在尝试这个模拟的 s3 存储桶将由 duckdb 访问。

当我运行此测试时,我收到以下错误:

IO Error: HTTP GET error on 'https://{test_bucket_name}.s3.amazonaws.com/{s3_path}/test_file.parquet' (HTTP 400)

我试图使用boto3客户端endpoint_url参数,但没有帮助。

此外,据我所知,当 moto 运行时,它运行在 localhost:5000 上,所以我也尝试将 duckdb 配置指向这个 doamin:port,但它也对我不起作用。

python amazon-web-services 单元测试 amazon-s3 duckdb

评论

0赞 anonymus1205 11/12/2023
我还尝试像这样启动 moto 服务器: self.server = ThreadedMotoServer() ---> 在 0.0.0.0 端口 5000 self.server.start() 上启动 moto 服务器 错误是: IO 错误:HTTP HEAD 连接到“https://{test_bucket_name}.0.0.0.0:5000/{s3_path}/test_file.parquet”(HTTP 400)
0赞 Mause 11/12/2023
您是否尝试过在 duckdb 中设置s3_endpoint设置?
0赞 anonymus1205 11/19/2023
是的,我试过了。你有没有一个具体的例子,用 duckdb 的s3_endpoint与 moto 通信?

答: 暂无答案