[PYTHON] Lambda dans VPC ne peut pas envoyer de courrier avec Boto3 même si vous utilisez le point de terminaison VPC pour SES

en premier

Cet article décrit les détails de la vérification du titre.

C'était l'occasion d'écrire, mais récemment, je joue avec VPC pour la première fois depuis longtemps. Je n'avais aucun souvenir du bon déroulement de la configuration à l'aide de VPC, et j'étais en fait accro au marais.

J'ai résumé les points, alors j'espère que cela aidera quelqu'un.

Si vous ne voulez connaître que la conclusion, veuillez passer à la fin

Contexte de la vérification

** Envoyer un e-mail depuis Lambda dans VPC ** Je voulais juste faire ça

L'architecture est la suivante RDS → Lambda (dans VPC) → SES → Utilisateur

C'est une architecture que vous ne voyez pas souvent Depuis la sortie de RDS Proxy, la combinaison de Lambda et RDS a été utilisée plus souvent. DynamoDB seul a quelques soucis, donc je pense que cette architecture augmentera à l'avenir.

Lors de sa mise en œuvre, j'étudiais comment sortir du VPC Puis, en mai 2020, VPC endpoint for SES Est sorti

J'ai essayé cela pour ne pas terminer l'implémentation facilement et cela a expiré dans Lambda C'est le début d'une longue vérification ...

Contenu de la vérification

Il a été affiché sur CloudWatch comme suit

Task timed out after 30.03 seconds

Je n'arrive pas à sortir du VPC

1. Doute des paramètres SES

Tout d'abord, il est confirmé par l'envoi d'un test si la vérification SES est effectuée correctement. J'étais dans un environnement sandbox, donc j'ai pensé que cela pourrait avoir un impact

Vous pouvez facilement envoyer un test depuis la console Cliquez ici pour la procédure

L'e-mail a été envoyé de l'expéditeur à la destination comme prévu

Nous avons confirmé que la transmission peut être effectuée correctement à partir de la console SES, cherchez donc une autre cause.

2. Autour de l'autorité

Je pensais que c'était un problème de configuration de rôle ou de groupe de sécurité, alors j'ai d'abord configuré Gabagaba Vérifiez si vous pouvez sortir du VPC pour le moment

  1. Autoriser toutes les communications entrantes et sortantes pour les groupes de sécurité
  2. Ajoutez la stratégie suivante au rôle
"ses:SendEmail","ses:SendRawEmail"Autorisé de toutes les ressources
AWSLambdaVPCAccessExecutionRole
VPCFullAccess
SESFullAccess

Le délai d'attente ne s'est toujours pas amélioré

3. Problème de logique

Ensuite, nous avons revu la logique à envoyer à SES. J'utilisais Boto3 avec python3.8 La source est basée sur ici

Afin d'isoler s'il y a un problème avec la logique ou un problème avec le paramètre, j'ai d'abord créé Lambda en dehors du VPC et l'ai envoyé avec le même code source.

Ensuite, j'ai pu envoyer un e-mail depuis Lambda en dehors du VPC Une vérification précédente a montré que la source est correcte et qu'il s'agit probablement d'un problème lié au VPC.

4. Spécifiez le point de terminaison?

Lors de l'utilisation de SQS à partir de Lambda dans VPC, il est nécessaire de spécifier le point de terminaison Il n'y avait pas de description dans la procédure, mais je soupçonnais que SES aurait également besoin de spécifier le point final de la même manière.

Dans boto3, vous pouvez spécifier le point de terminaison avec un argument lors de la création d'un client Officiel

J'ai essayé d'ajouter l'URL du point de terminaison du VPC

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

Lorsque j'ai essayé d'envoyer ici, l'erreur suivante s'est produite

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

Semble invalide en tant que point de terminaison

5. Lambda (à l'intérieur du VPC) → Lambda (à l'extérieur du VPC) → SES

Ça se rapproche de la merde Je pensais que les points de terminaison VPC pour SES ne pouvaient pas être utilisés, j'ai donc décidé d'adopter une approche différente.

[Lambda prend désormais en charge Private Link] en octobre 2020 (https://aws.amazon.com/jp/about-aws/whats-new/2020/10/aws-lambda-now-supports-aws-privatelink/) était en train de faire

Quand j'ai essayé cela, j'ai pu envoyer un email sans aucun problème Mais pas malin ...

6. Interface SMTP ...?

Les étrangers peuvent faire Envoyer un e-mail à l'aide de l'interface SMTP Amazon SES Yo! J'ai trouvé qu'il me disait

Vous aurez besoin de votre nom d'utilisateur et de votre mot de passe pour chaque région.

Hmm subtile ... Je veux l'envoyer avec boto3 ...

7. Contacter l'assistance

J'ai décidé que je ne pouvais rien faire avec mes propres connaissances, alors j'ai fait une enquête. Ci-dessous un extrait de la réponse

Les points de terminaison VPC sont pris en charge par la méthode "1. Utiliser l'interface SMTP SES". D'autre part, la méthode d'utilisation de la méthode send_email de Boto3 que le client tente d'implémenter est "2. Utiliser l'API SES (AWSCLI, AWS SDK)", qui ne prend pas en charge les points de terminaison VPC. Dans le cas de «2. Utiliser l'API SES (AWS CLI, AWS SDK)», veuillez utiliser l'un des éléments suivants. -Démarrer Lambda en dehors du VPC -Démarrez Lambda dans VPC et déployez la passerelle NAT pour que Lambda puisse se connecter à Internet.

sérieusement!!! Je n'ai dit "Boto3" nulle part !!! J'ai ressenti cela, mais je suis heureux d'avoir pu le résoudre en toute sécurité. Merci au soutien

Après cela, j'ai essayé la méthode avec NAT Gateway et j'ai confirmé que le courrier était arrivé.

Conclusion

combinaison

Point de terminaison VPC pour SES Méthode d'envoi
Méthode 1 utilisation Interface SMTP
Méthode 2 Non utilisé Passerelle NAT+ Boto3

Fort de demander de l'aide

Recommended Posts

Lambda dans VPC ne peut pas envoyer de courrier avec Boto3 même si vous utilisez le point de terminaison VPC pour SES
Impossible de manipuler l'iframe dans la page avec Selenium
Je ne peux pas transformer un projet utilisant PyWebView en un exe avec PyInstaller
J'obtiens un attribut impossible à définir lors de l'utilisation de @property en python
[boto3] Envoyer un e-mail à l'aide de SES
Envoyez automatiquement des e-mails avec Amazon SES
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
J'ai essayé d'envoyer un e-mail de fin d'inscription depuis Gmail avec django.
J'ai été en vain parce que je n'ai pas pu obtenir de commande parent avec pybitflyer
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
Conseils pour utiliser Elastic Search de manière efficace
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Enregistrer des vues YouTube sur une feuille de calcul à l'aide de Lambda
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
Un véritable moyen pour les personnes utilisant python 3.8.0-2 à partir de Windows de travailler avec des caractères multi-octets
Je veux configurer un serveur fictif pour python-flask en quelques secondes en utilisant swagger-codegen.