[PYTHON] Lambda in VPC kann keine E-Mails mit Boto3 senden, selbst wenn der VPC-Endpunkt für SES verwendet wird

zunaechst

Dieser Artikel beschreibt die Details der Überprüfung des Titels.

Es war eine Gelegenheit zu schreiben, aber vor kurzem habe ich zum ersten Mal seit einiger Zeit wieder mit VPC gespielt. Ich hatte keine Erinnerungen daran, wie die Konfiguration mit VPC reibungslos verlief, und ich war tatsächlich süchtig nach dem Sumpf.

Ich habe die Punkte zusammengefasst und hoffe, dass es jemandem hilft.

Wenn Sie nur die Schlussfolgerung wissen möchten, fahren Sie bitte mit dem Ende fort

Hintergrund der Überprüfung

** Senden Sie eine E-Mail von Lambda in VPC ** Ich wollte das nur machen

Die Architektur ist wie folgt RDS → Lambda (in VPC) → SES → Benutzer

Es ist eine Architektur, die man nicht oft sieht Seit der Veröffentlichung von RDS Proxy wurde die Kombination von Lambda und RDS häufiger verwendet. DynamoDB allein hat einige Probleme, daher denke ich, dass diese Architektur in Zukunft zunehmen wird.

Bei der Implementierung habe ich untersucht, wie ich aus der VPC herauskomme Dann, im Mai 2020, VPC-Endpunkt für SES Wurde veröffentlicht

Ich habe versucht, die Implementierung nicht einfach abzuschließen, und in Lambda ist eine Zeitüberschreitung aufgetreten Dies ist der Beginn einer langen Überprüfung ...

Überprüfungsinhalt

Es wurde in CloudWatch wie folgt angezeigt

Task timed out after 30.03 seconds

Ich kann nicht aus der VPC herauskommen

1. Zweifel an den SES-Einstellungen

Zunächst wird durch Senden eines Tests bestätigt, ob die SES-Überprüfung korrekt durchgeführt wurde. Ich befand mich in einer Sandbox-Umgebung und dachte, dies könnte Auswirkungen haben

Sie können ganz einfach einen Test von der Konsole aus senden Klicken Sie hier für die Prozedur

Die E-Mail wurde wie erwartet vom Absender an das Ziel gesendet

Wir haben bestätigt, dass die Übertragung über die SES-Konsole korrekt ausgeführt werden kann. Suchen Sie daher nach einer anderen Ursache.

2. Um Autorität

Ich dachte, dass es sich um ein Problem bei der Einstellung von Rollen oder Sicherheitsgruppen handelt, also habe ich zuerst Gabagaba eingerichtet Überprüfen Sie, ob Sie die VPC vorerst verlassen können

  1. Lassen Sie die gesamte eingehende und ausgehende Kommunikation für Sicherheitsgruppen zu
  2. Fügen Sie der Rolle die folgende Richtlinie hinzu
"ses:SendEmail","ses:SendRawEmail"Aus allen Quellen erlaubt
AWSLambdaVPCAccessExecutionRole
VPCFullAccess
SESFullAccess

Trotzdem hat sich das Timeout nicht verbessert

3. Logikproblem

Als nächstes überprüften wir die Logik zum Senden an SES. Ich habe Boto3 mit Python3.8 verwendet Die Quelle basiert auf hier

Um herauszufinden, ob es ein Problem mit der Logik oder ein Problem mit der Einstellung gibt, habe ich zuerst Lambda außerhalb der VPC erstellt und es mit demselben Quellcode gesendet.

Dann konnte ich eine E-Mail von Lambda außerhalb der VPC senden Frühere Überprüfungen haben gezeigt, dass die Quelle in Ordnung ist und wahrscheinlich ein VPC-Problem darstellt.

4. Geben Sie den Endpunkt an?

Bei Verwendung von SQS von Lambda in VPC muss der Endpunkt angegeben werden Das Verfahren enthielt keine Beschreibung, aber ich vermutete, dass SES auf die gleiche Weise auch den Endpunkt angeben müsste.

In boto3 können Sie den Endpunkt beim Erstellen eines Clients mit einem Argument angeben Offiziell

Ich habe versucht, die URL des VPC-Endpunkts hinzuzufügen

import boto3
ses_client = boto3.client('ses', region_name='ap-northeast-1', endpoint_url='com.amazonaws.region.email-smtp')

Als ich versuchte, hier zu senden, trat der folgende Fehler auf

[ERROR] ValueError: Invalid endpoint: com.amazonaws.ap-northeast-1.email-smtp

Scheint als Endpunkt ungültig

5. Lambda (innerhalb der VPC) → Lambda (außerhalb der VPC) → SES

Es kommt der Scheiße näher Ich dachte, dass VPC-Endpunkte für SES nicht verwendet werden könnten, und entschied mich daher für einen anderen Ansatz.

[Lambda unterstützt Private Link] im Oktober 2020 (https://aws.amazon.com/jp/about-aws/whats-new/2020/10/aws-lambda-now-supports-aws-privatelink/) Hat gemacht

Als ich dies versuchte, konnte ich problemlos eine E-Mail senden Aber nicht schlau ...

6. SMTP-Schnittstelle ...?

Ausländer können E-Mail über Amazon SES SMTP-Schnittstelle senden Yo! Ich stellte fest, dass er es mir erzählte

Sie benötigen Ihren Benutzernamen und Ihr Passwort für jede Region.

Hmm subtil ... Ich möchte es mit boto3 senden ...

7. Wenden Sie sich an den Support

Ich entschied, dass ich mit meinem eigenen Wissen nichts anfangen konnte, also machte ich eine Anfrage. Unten finden Sie einen Auszug der Antwort

VPC-Endpunkte werden von der Methode "1. SES SMTP-Schnittstelle verwenden" unterstützt. Auf der anderen Seite lautet die Methode zur Verwendung der send_email-Methode von Boto3, die der Kunde zu implementieren versucht, "2. Verwenden Sie die SES-API (AWSCLI, AWS SDK)", die keine VPC-Endpunkte unterstützt. Im Fall von "2. Verwenden Sie die SES-API (AWS CLI, AWS SDK)" verwenden Sie bitte eine der folgenden Möglichkeiten. -Starten Sie Lambda außerhalb der VPC -Starten Sie Lambda in VPC und stellen Sie NAT Gateway bereit, damit Lambda eine Verbindung zum Internet herstellen kann.

Ernsthaft!!! Ich habe nirgendwo "Boto3" gesagt !!! Ich habe das gespürt, aber ich bin froh, dass ich es sicher lösen konnte. Danke an die Unterstützung

Danach habe ich die Methode mit NAT Gateway ausprobiert und bestätigt, dass die Mail angekommen ist.

Fazit

Kombination

VPC-Endpunkt für SES Versandart
Methode 1 verwenden SMTP-Schnittstelle
Methode 2 Nicht benutzt NAT-Gateway+ Boto3

Stark um Unterstützung zu bitten

Recommended Posts

Lambda in VPC kann keine E-Mails mit Boto3 senden, selbst wenn der VPC-Endpunkt für SES verwendet wird
Iframe in Seite mit Selenium kann nicht bearbeitet werden
Ich kann ein Projekt mit PyWebView mit PyInstaller nicht in eine Exe verwandeln
Bei Verwendung von @property in Python wird ein Attribut nicht festgelegt
[boto3] Senden Sie eine E-Mail mit SES
Senden Sie E-Mails automatisch mit Amazon SES
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
Ich habe versucht, mit django eine E-Mail zum Abschluss der Registrierung von Google Mail zu senden.
Ich war vergebens, weil ich mit pybitflyer keine Bestellung für Eltern erhalten konnte
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden
Tipps für eine gute Verwendung von Elastic Search
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Zeichnen Sie YouTube-Aufrufe mit Lambda in einer Tabelle auf
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Eine echte Möglichkeit für Benutzer von Python 3.8.0-2 aus Windows, mit Multi-Byte-Zeichen zu arbeiten
Ich möchte mit swagger-codegen in Sekundenschnelle einen Mock-Server für Python-Flask einrichten.