Zappa/AWS - 电子邮件不会发送,只是超时

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 安全组以尝试解决此问题。还是无济于事。

任何帮助将不胜感激,不胜感激。干杯。

Kev*_*nry 5

解释很简单:在 VPC 中运行的 Lambda 实例无法访问互联网

当您将 VPC 配置添加到 Lambda 函数时,它只能访问该 VPC 中的资源。如果 Lambda 函数需要访问 VPC 资源和公共 Internet,则 VPC 需要在 VPC 内部有一个网络地址转换 (NAT) 实例。

解决方案也很简单,如果很烦人:在 VPC 中运行NAT 实例NAT 网关。(另一种解决方案是将您的 Lambda 移出 VPC,但这是一个更大的变化。)

我正在 Lambda 中运行 Django/Zappa,并使用 NAT 实例连接到 Amazon Simple Email Service,并且运行良好。