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
** 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 ...
Es wurde in CloudWatch wie folgt angezeigt
Task timed out after 30.03 seconds
Ich kann nicht aus der VPC herauskommen
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.
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
"ses:SendEmail","ses:SendRawEmail"Aus allen Quellen erlaubt
AWSLambdaVPCAccessExecutionRole
VPCFullAccess
SESFullAccess
Trotzdem hat sich das Timeout nicht verbessert
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.
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
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 ...
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 ...
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.
VPC-Endpunkt für SES | Versandart | |
---|---|---|
Methode 1 | verwenden | SMTP-Schnittstelle |
Methode 2 | Nicht benutzt | NAT-Gateway+ Boto3 |
Stark um Unterstützung zu bitten