[PYTHON] Implémenter un formulaire de courrier supplémentaire dans une application Web sans serveur ~ Version backend ~

Implémenter un formulaire de courrier supplémentaire dans une application Web sans serveur ~ Version backend ~

introduction

Ajoutez un formulaire de messagerie à l'application Web créée dans Création d'une application Web sans serveur à l'aide d'AWS. Il est composé de deux parties, et je pense qu'il vaut mieux regarder d'abord le front-end. Formulaire de courrier supplémentaire à l'application Web sans serveur ~ Front end ~

Back end

Étant donné que l'application Web de base utilise AppSync, AppSync est également le moyen d'appeler Lambda pour envoyer des messages depuis le front-end.

Créer une fonction Lambda

Lors de la création d'une nouvelle fonction Lambda, ajoutez «Politique de publication Amazon SNS» dans la sélection et la création des rôles d'exécution. Screenshot 2020-03-29 at 08.53.11.png

IF ajouté pour les appels Lambda à AppSync

Ajoutez un IF qui appelle Lambda à AppSync que vous utilisez déjà. L'article suivant que j'ai écrit l'autre jour sera utile à la fois. Appeler Lambda avec AppSync

Ajoutez le Lambda ci-dessus à la source de données, ajoutez un IF similaire au suivant au schéma et attachez-le au résolveur.

input ProcessSendMailInput {
	name: String!
	email: String!
	message: String!
}
type ProcessSendMailResult @aws_cognito_user_pools {
	statusCode: Int!
	body: String
}
type Mutation {
	processSendMail(input: ProcessSendMailInput!): ProcessSendMailResult
		@aws_cognito_user_pools
 :

Paramètres AWS SNS

Nous mettrons en place un SNS pour vous informer par e-mail du contenu envoyé via AppSync.

Créer un sujet

À tout le moins, il semble bon de n'entrer que le nom. Screenshot 2020-03-29 at 10.05.32.png

Créer un abonnement

Créez un abonnement pour le sujet que vous avez créé. Le protocole est «email» et le point final est «adresse email de destination». ink.png Lorsque vous créez un abonnement, un e-mail de confirmation sera envoyé à l'adresse e-mail que vous avez spécifiée pour votre point de terminaison. ink (1).png Si vous sélectionnez le lien «Confirmer l'abonnement» dans le corps de l'e-mail, l'abonnement sera vérifié et le statut passera de «En attente de confirmation» à «Confirmé».

Vous pouvez envoyer un e-mail de test à partir de "Message du problème" en haut à droite de l'écran du sujet, il est donc judicieux de le vérifier. En outre, l'ARN dans les détails de la rubrique sera utilisé plus tard dans le programme.

Implémentation de la fonction Lambda

Il s'agit d'un code Python qui vous informe via SNS du contenu envoyé via AppSync.

lambda_function.py


import boto3
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

sns = boto3.client("sns")
TOPIC_ARN = "arn:aws:sns:ap-northeast-1:888888888888:sample_sns_topic"
REQUEST_BODY_TEMPLATE = """
name : {0}
email : {1}
message : 
{2}
"""

def lambda_handler(event, context):
    try:
        logger.info(event)
        name = event["input"]["name"]
        email = event["input"]["email"]
        message = event["input"]["message"]
        
        requestBody = REQUEST_BODY_TEMPLATE.format(name, email, message)
        logger.info(requestBody)
        
        request = {
            "TopicArn": TOPIC_ARN,
            "Message": requestBody,
            "Subject": "mail from form by {0}".format(name)
        }
        response = sns.publish(**request)

        return {
            "statusCode": 200,
            "body": json.dumps("Email sent successfully.")
        }

    except Exception as e:
        logger.exception(e)
        return {
            "statusCode": 500,
            "body": json.dumps(e)
        }

Appeler AppSync depuis le frontal

Il est décrit dans Front end bias.

Épilogue

Le formulaire de courrier a été plus facile que prévu. Avec cela seul, le nombre d'étapes est d'environ 1,0H. Cependant, je pense qu'un mécanisme distinct est nécessaire pour empêcher la falsification.

Je pense utiliser le service reCAPTCHA de Google. Je l'écrirai à nouveau lorsque je le présenterai la prochaine fois.

Recommended Posts

Implémenter un formulaire de courrier supplémentaire dans une application Web sans serveur ~ Version backend ~
Ajouter dynamiquement des champs aux objets Form avec Django
Étapes pour développer une application Web en Python