在 Localstack 中部署时,boto3 出现“无法连接到端点 URL”错误

Bal*_*ran 12 boto3 aws-lambda localstack

我正在使用 Localstack 来测试我在本地的更改。我的 lambda 函数应该执行 putObject 并在 s3 存储桶中创建对象。直接在 AWS 环境中进行测试时,该功能运行良好。但在 Localstack 中,它不起作用。我收到以下错误。

\n\n
\n

无法连接到端点 URL:\n " http://localhost:4572/doyouknowme/pokemon.jpeg "\n \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0raise EndpointConnectionError(endpoint_url=request.url ,错误=e)ponset_exceptionlhost:4572/doyouknowme/pokemon.jpeg"

\n
\n\n

AWS 凭证:

\n\n
[default]\naws_access_key_id = AKI****************\naws_secret_access_key = gL************************\nregion = us-east-1\n
Run Code Online (Sandbox Code Playgroud)\n\n

Lambda函数代码:

\n\n
import json\nimport urllib.parse\nimport boto3\nimport base64\n\nprint(\'Loading function\')\n# session = boto3.Session(profile_name=\'personal\')\n# s3 = session.client(\'s3\', endpoint_url=\'http://localhost:4574\')\n\ns3 = boto3.client(\'s3\', endpoint_url=\'http://localhost:4572\', region_name=\'us-east-1\')\n\n\ndef lambda_handler(event, context):\n    # raise Exception(\'Something went wrong\')\n    print("Received event: " + json.dumps(event, indent=2))\n\n\n    try:\n        image_data = base64.b64decode(event[\'image_data\'])\n        response = s3.put_object(\n            Body=image_data,\n            Bucket=\'doyouknowme\',\n            Key=\'pokemon.jpeg\',\n            ContentType=\'image/jpeg\'\n        )\n\n        print(response)\n        return response\n\n    except Exception as e:\n        print(e)\n        # print(\n        #     \'Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as \'\n        #     \'this function.\'.format(\n        #         key, bucket))\n        raise e\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不确定为什么 s3 密钥被附加到 lambda 访问的端点 URL 上。\n感谢您帮助解决此问题。

\n

Jor*_*ote 32

对于遇到此问题的任何人:当boto3另一个 Docker 尝试localstack使用http://localhost:4566.

http://host.docker.internal:4566我通过将其放入endpoint-urlboto3 会话客户端中解决了我的问题。

或者,如果您使用 docker-compose,请将两个 docker 容器放在同一网络上,通过调用 boto3 的容器名称作为端点来进行调用。(IE http://boto3-container:4566

希望这对某人有帮助!

  • 它确实帮助了某人!我花了几个小时试图解决这个问题,直到我到达这里。我总是使用 `http://%s:4566" % os.environ["LOCALSTACK_HOSTNAME"]` 和 `http://localhost:4566` 并且它不只是工作。无法将其与此处的命令列表:https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html (2认同)