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
** 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 ...
Il a été affiché sur CloudWatch comme suit
Task timed out after 30.03 seconds
Je n'arrive pas à sortir du VPC
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.
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
"ses:SendEmail","ses:SendRawEmail"Autorisé de toutes les ressources
AWSLambdaVPCAccessExecutionRole
VPCFullAccess
SESFullAccess
Le délai d'attente ne s'est toujours pas amélioré
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.
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
Ç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 ...
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 ...
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é.
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