【发布时间】:2022-06-15 23:29:35
【问题描述】:
我正在使用 LocalStack 模拟 AWS SES 进行测试。我正在通过它的 docker 映像使用 LocalStack。我在创建 AWS SES 客户端期间通过覆盖它的端点来模拟 AWS:
AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard()
.withEndpointConfiguration(new EndpointConfiguration(awsEndpoint, region))
.withCredentials(awsCredentials)
.build();
在创建身份、列出和发送电子邮件时,AWS CLI(至少对于 SES)与 LocalStack(通过通过 --endpoint-url 参数为其提供 LocalStack 的端点)正常工作。但是,当通过基于 Java 的 AWS SES 开发工具包以编程方式命中时,基于发送电子邮件的开发工具包调用会失败。每当进行此类调用时,LocalStack 都会抛出以下错误:
2022-04-26T11:30:17.625:WARNING:localstack.utils.server.http2_server: Error in proxy handler for request POST http://localhost:4566/: object of type 'NoneType' has no len() Traceback (most recent call last):
File "/opt/code/localstack/localstack/utils/server/http2_server.py", line 185, in index
result = await run_sync(handler, request, data)
File "/opt/code/localstack/localstack/utils/asyncio.py", line 85, in run_sync
return await loop.run_in_executor(thread_pool, copy_context().run, func_wrapped)
File "/opt/code/localstack/localstack/utils/threads.py", line 38, in run
result = self.func(self.params, **kwargs)
File "/opt/code/localstack/localstack/utils/asyncio.py", line 30, in _run
return fn(*args, **kwargs)
File "/opt/code/localstack/localstack/services/generic_proxy.py", line 972, in handler
return modify_and_forward(
File "/opt/code/localstack/localstack/services/generic_proxy.py", line 516, in wrapper
value = func(*args, **kwargs)
File "/opt/code/localstack/localstack/services/generic_proxy.py", line 596, in modify_and_forward
listener_result = listener.forward_request(
File "/opt/code/localstack/localstack/services/edge.py", line 178, in forward_request
result = do_forward_request(api, method, path, data, headers, port=port)
File "/opt/code/localstack/localstack/services/edge.py", line 233, in do_forward_request
result = do_forward_request_inmem(api, method, path, data, headers, port=port)
File "/opt/code/localstack/localstack/services/edge.py", line 257, in do_forward_request_inmem
response = modify_and_forward(
File "/opt/code/localstack/localstack/services/generic_proxy.py", line 516, in wrapper
value = func(*args, **kwargs)
File "/opt/code/localstack/localstack/services/generic_proxy.py", line 596, in modify_and_forward
listener_result = listener.forward_request(
File "/opt/code/localstack/localstack/http/adapters.py", line 38, in forward_request
response = self.request(request)
File "/opt/code/localstack/localstack/aws/proxy.py", line 42, in request
response = self.skeleton.invoke(context)
File "/opt/code/localstack/localstack/aws/skeleton.py", line 153, in invoke
return self.dispatch_request(context, instance)
File "/opt/code/localstack/localstack/aws/skeleton.py", line 165, in dispatch_request
result = handler(context, instance) or {}
File "/opt/code/localstack/localstack/aws/forwarder.py", line 57, in _call
return handler(context, req)
File "/opt/code/localstack/localstack/aws/skeleton.py", line 117, in __call__
return self.fn(*args, **kwargs)
File "/opt/code/localstack/localstack/aws/api/core.py", line 95, in operation_marker
return fn(*args, **kwargs)
File "/opt/code/localstack/localstack/services/ses/provider.py", line 258, in send_raw_email
message = ses_backend.send_raw_email(source, destinations, raw_data, context.region)
File "/opt/code/localstack/.venv/lib/python3.8/site-packages/moto/ses/models.py", line 258, in send_raw_email
recipient_count = len(destinations)
TypeError: object of type 'NoneType' has no len()
我不确定究竟是什么导致了错误。请注意,相同的基于发送电子邮件的 SDK 调用与真正的 AWS 完美配合。这是我困惑和怀疑的根源:为什么 LocalStack 会以这种方式表现?它完美地模拟了通过 AWS CLI 发出的发送电子邮件调用,但使用基于 AWS SES 开发工具包的调用却无法做到这一点。我正在使用 AWS 的 SES 版本 1 开发工具包。希望大家能帮我解答一下我的这个疑惑。
【问题讨论】:
标签: java amazon-web-services localstack