簡體   English   中英

使用 Boto3 S3 資源時 S3 Ninja 端點拋出無法連接錯誤

[英]S3 Ninja endpoint throws could not connect error when using Boto3 S3 resource

我正在嘗試在 Python 中將S3 Ninjaboto3一起使用,但盡管 docker 容器正在運行,但我無法將 S3 客戶端配置為使用 S3 Ninja。

嘗試使用boto3.session.Session().client().get_object()獲取對象時,我的嘗試導致以下錯誤。

s3 = S3()
content = s3.get('mybucket', 'myobject')

botocore.exceptions.EndpointConnectionError:無法連接到端點 URL:“http://localhost:9444/mybucket/myobject.json”

使用curl http://localhost:9444/mybucket/myfile.json按預期返回文件,因此 S3 Ninja 似乎正在工作。 但是,S3 客戶端由於某種原因找不到它。

我已經為端點 URL 嘗試了以下兩個值。

  • http://localhost:9444
  • http://localhost:9444/s3
class S3:

    client: boto3.client

    def __init__(self) -> None:
        local = os.environ.get('LOCAL')
        if local == 'true':
            self.client = boto3.session.Session().client(
                service_name='s3',
                aws_access_key_id='my_access_key',
                aws_secret_access_key='my_secret_key',
                endpoint_url='http://localhost:9444',
                config=botocore.client.Config(
                    s3={
                        'addressing_style': 'path'
                    }
                )
            )
        else:
            self.client = boto3.client('s3')

    def get(self, bucket_name: str, key: str) -> str:
        response = self.client.get_object(
            Bucket=bucket_name,
            Key=key)
        return response['Body'].read().decode('utf-8')

有什么問題?

這是一個令人沮喪的問題,一段時間后我發現這是由於我使用了 Lambda 函數造成的。

我的問題中的代碼是 Lambda 函數的一部分。 函數和 API 使用sam local start-api在本地運行,任何調用實際上都在 docker 容器中運行。 所以這個問題是 Lambda 容器無法與本地主機上的 S3 Ninja 對話,因為它沒有在本地主機上運行。

這里的簡單修復是針對默認 docker 網絡(網橋)的 IP, 172.17.0.1 ,而不是 localhost。

class S3:

    client: boto3.client

    def __init__(self) -> None:

        local = Environment.local == 'true'

        if local:
            logger.info('Using S3 Ninja to emulate the S3 API.')
            self.client = boto3.client(
                service_name='s3',
                aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
                aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
                endpoint_url='http://172.17.0.1:9444/s3/'
            )
        else:
            self.client = boto3.client('s3')

也可以在單獨的 docker 網絡上運行 S3 Ninja,然后在同一網絡上啟動本地 API。 我不確定為什么需要這樣做,但認為值得一提。

docker network create lambda-local
docker network inspect lambda-local # Record the gateway IP address.
docker run --name s3ninja --network lambda-local -d -p 9444:9000 scireum/s3-ninja:latest
sam local start-api --docker-network lambda-local
# Make sure to use the gateway IP address discovered using 'docker network inspect'.
endpoint_url='http://172.20.0.1:9444/s3/'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM