Dou*_*ney 3 django amazon-web-services
目前,我已经为我的交易电子邮件提供商(邮戳)尝试了普通的 Django SMTP 和一些不同的基于 api 的 Django 库。
当我运行我的开发服务器时,一切正常。通过 Postmark API 发送电子邮件没有问题。
当我使用 Zappa 部署到 AWS 时,访问我的网站并执行一项应该发送电子邮件的任务(例如重置用户密码),页面会不断加载,直到显示Endpoint request timed out。
我尝试将我的 AWS Lambda 函数的超时设置为更长的持续时间,以防 Django 决定抛出错误。
这是抛出的错误。请记住,此错误仅发生在生产中。我创建了一个自定义管理命令来检索此错误。
HTTPSConnectionPool(host='api.postmarkapp.com', port=443): Max retries exceeded with url: /email/batch (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f6cfbd5dd30>: Failed to establish a new connection: [Errno 110] Connection timed out',)): ConnectionError
Traceback (most recent call last):
File "/var/task/handler.py", line 509, in lambda_handler
return LambdaHandler.lambda_handler(event, context)
File "/var/task/handler.py", line 240, in lambda_handler
return handler.handler(event, context)
File "/var/task/handler.py", line 376, in handler
management.call_command(*event['manage'].split(' '))
File "/var/task/django/core/management/__init__.py", line 131, in call_command
return command.execute(*args, **defaults)
File "/var/task/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/var/task/users/management/commands/sendemail.py", line 13, in handle
fail_silently=False,
File "/var/task/django/core/mail/__init__.py", line 62, in send_mail
return mail.send()
File "/var/task/django/core/mail/message.py", line 348, in send
return self.get_connection(fail_silently).send_messages([self])
File "/var/task/postmarker/django/backend.py", line 66, in send_messages
responses = self.client.emails.send_batch(*prepared_messages, TrackOpens=self.get_option('TRACK_OPENS'))
File "/var/task/postmarker/models/emails.py", line 332, in send_batch
return self.EmailBatch(*emails).send(**extra)
File "/var/task/postmarker/models/emails.py", line 247, in send
responses = [self._manager._send_batch(*batch) for batch in chunks(emails, self.MAX_SIZE)]
File "/var/task/postmarker/models/emails.py", line 247, in <listcomp>
responses = [self._manager._send_batch(*batch) for batch in chunks(emails, self.MAX_SIZE)]
File "/var/task/postmarker/models/emails.py", line 276, in _send_batch
return self.call('POST', '/email/batch', data=emails)
File "/var/task/postmarker/models/base.py", line 72, in call
return self.client.call(*args, **kwargs)
File "/var/task/postmarker/core.py", line 106, in call
**kwargs
File "/var/task/postmarker/core.py", line 129, in _call
method, url, json=data, params=kwargs, headers=default_headers, timeout=self.timeout
File "/var/task/requests/sessions.py", line 508, in request
resp = self.send(prep, **send_kwargs)
File "/var/task/requests/sessions.py", line 618, in send
r = adapter.send(request, **kwargs)
File "/var/task/requests/adapters.py", line 508, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.postmarkapp.com', port=443): Max retries exceeded with url: /email/batch (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f6cfbd5dd30>: Failed to establish a new connection: [Errno 110] Connection timed out',))
Run Code Online (Sandbox Code Playgroud)
我已允许所有传入和传出流量进入我的 AWS 安全组以尝试解决此问题。还是无济于事。
任何帮助将不胜感激,不胜感激。干杯。
解释很简单:在 VPC 中运行的 Lambda 实例无法访问互联网:
当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数需要访问 VPC 资源和公共 Internet,则 VPC 需要在 VPC 内部有一个网络地址转换 (NAT) 实例。
解决方案也很简单,如果很烦人:在 VPC 中运行NAT 实例或NAT 网关。(另一种解决方案是将您的 Lambda 移出 VPC,但这是一个更大的变化。)
我正在 Lambda 中运行 Django/Zappa,并使用 NAT 实例连接到 Amazon Simple Email Service,并且运行良好。
| 归档时间: |
|
| 查看次数: |
1065 次 |
| 最近记录: |