0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サーバーレスWebアプリにメールフォームを追加実装する 〜 バックエンド編 〜

Last updated at Posted at 2020-03-29

サーバーレスWebアプリにメールフォームを追加実装する 〜 バックエンド編 〜

はじめに

AWSを活用したサーバーレスWebアプリの制作で作ったWebアプリにメールフォームを追加実装します。
2部構成にしていて、先にフロントエンド編から見ると良いと思います。
サーバーレスWebアプリにメールフォームを追加実装する 〜 フロントエンド編 〜

バックエンド

ベースとしたWebアプリはAppSyncを利用していますので、フロントエンドからメールを送るLambdaを呼び出す手段もAppSyncとします。

Lambda関数の作成

Lambda関数の新規作成時、実行ロールの選択と作成で「Amazon SNS 発行ポリシー」を加えておきます。
Screenshot 2020-03-29 at 08.53.11.png

AppSyncにLambda呼び出しのIFを追加

すでに利用しているAppSyncにLambdaを呼び出すIFを追加します。
先日書いた以下の記事がさっそく役立ちますね。
AppSyncでLambdaを呼び出す

上のLambdaをデータソースに加え、以下のようなIFをスキーマに追加し、リゾルバにアタッチします。

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
 :

AWS SNSの設定

AppSync経由で送られてきた内容をメール通知するためのSNSをセットアップしてゆきます。

トピックの作成

最低限、名前のみの入力で良さそうです。
Screenshot 2020-03-29 at 10.05.32.png

サブスクリプションの作成

作成したトピックに対して、サブスクリプションの作成を行います。
プロトコルは「Eメール」、エンドポイントは「送信先のメールアドレス」とします。
ink.png
サブスクリプションを作成すると、エンドポイントに指定したメールアドレスに確認メールが送られてきます。
ink (1).png
メール本文にある「Confirm subscription」リンクを選択すると、サブスクリプションの認証が完了してステータスが「保留中の確認」から「確認済み」になります。

トピックの画面の右上にある「メッセージの発行」から、テストメールを送れるので、確認してみると良いと思います。
あと、トピック詳細にあるARNはあとでプログラムから利用します。

Lambda関数の実装

AppSync経由で送られてきた内容をSNSで通知するPythonのコードです。

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)
        }

フロントエンドからAppSyncの呼び出し

フロントエンド偏へ記載してます。

あとがき

メールフォーム、思ってたよりも簡単でした。これだけなら工数1.0Hくらいですね。
ただ、いたずら防止のための仕掛けは別途必要だと思います。

GoogleのreCAPTCHAっていうサービスを利用してみたいなと思ってるんですよね。
今度導入してみたらまた記事にしようと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?