よくあるサーバーレスアーキテクチャで質問フォーム
2019/03/04
この記事はServerless2 Advent Calendar 2018に参加した記事です。
非常によくあるサーバーレスなアーキテクチャです。
例えば今あるサイトを静的化して、フォーム部分だけをサーバーレスにしたい、などのときによく使われているケースと思います。
あと、最近質問箱というサービスもありますが、個人用に自分だけの質問箱を作ってみてはいかがでしょうか。
動作イメージはこちらの私が所属する企業のブログで「コース中の質問をサーバーレスなアーキテクチャで受けて共有」という記事で書きましたので、本記事では設定などを書き残しておきたいと思います。
目次
Route 53
個人で所有しているドメインでアクセスできるようにしていますので、Route 53のAレコードのエイリアスで、CloudFrontのドメインを指定しています。
Certificate Manager
Certificate Managerでドメインの証明書を発行して、Route 53のCNAMEでドメイン認証をしています。
CloudFront
CloudFrontにはCertificate Managerで発行した証明書を設定しています。
オリジンにはS3バケットを指定して、OAIにてバケットへのCloudFrontを介さない直接のアクセスをできないようにしています。
S3
S3のバケットポリシー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXX" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::qa.trainocate/*" } ] } |
S3バケットにはHTML, CSS, JavaScriptを配置して入力フォームをCloudFront経由で配信しています。
API Gateway
[質問]ボタンが押されると質問内容がURLパラメータとしてAPI GatewayでデプロイしたAPIにPOSTされます。
API GatewayではURlパラメータをJSONに変換してLambdaにEventデータとして渡してLambdaを実行します。
最初のLambda
Lambdaはメッセージを受け取って、SNSトピックへ発行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import logging import boto3 import traceback import json logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info(event) try: sns = boto3.client('sns') qa_topic = 'Qa' snsTopicArn = [t['TopicArn'] for t in sns.list_topics()['Topics'] if t['TopicArn'].endswith(':' + qa_topic)][0] sns.publish( TopicArn=snsTopicArn, Message=json.dumps(event), Subject='question' ) except: logger.error(traceback.format_exc()) |
SNS, SQS
SNSトピックは2つのSQSキューへメッセージをファンアウトします。
Redmineにチケット登録するLambda
1つ目のSQSキューからメッセージを受信したLambdaはRedmineのAPIへ質問内容をPOSTして新しいチケットを作成し、RedmineのURLとあわせてTeamsに通知します。
Redmineへのチケット登録は「webフォームからの問い合わせをRedmineに自動登録して対応状況を管理する(API Gateway + Lambda)」をご参照ください。
Teamsへの投稿は「Microsoft TeamsのIncoming Webhooksを使ってAWS Lambda(Python)からFeedlyの記事を自動投稿する」をご参照ください。
DynamoDBにデータを入れるLambda
2つ目のSQSキューからメッセージを受信したLamndaはリクエスト内容と時間、送信元IPアドレスなどの情報とともにDynamoDBへ書きます。
ちなみにRedmineは、ALBで負荷分散しているAuto Scaling GroupのEC2とAurora Serverlessで構築しています。
Redmineの添付ファイルはEFSに格納するように、起動設定のユーザーデータでEC2からマウントしています。
この構成のRedmine関連については以下をご参照ください。
- Amazon EC2(Amazon Linux 2)にRedmine3.4をインストール
- RedmineをELB(ALB)でAutoScalingグループへ負荷分散
- EFSをEC2(Amazon Linux 2)からマウントする
- Amazon Aurora Serverlessを使い始めてみました(1日経過しての課金結果も)
- Amazon Aurora Serverless 課金確認
Redmineは使わなくとも、最後のLambdaでSlackに通知したり、メールを送信したり、でもいいと思います。
返信の機能は作ってないですが、Slackへの通知を返信したら、Twitterにタグ付きで投稿とかも簡単にできそうですね。
最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。
【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。
【PR】 「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWSアカウント ルートユーザーのMFAが使えなくなったので復旧
AWSのルートユーザーどころか、MFAが使えるログインすべてが使えなくなって焦り …
-
-
ALBのヘルスチェックでPHPとMySQL接続をチェック
当ブログで504エラーが発生して、オートスケーリングにより自動でインスタンスが置 …
-
-
S3をトリガーにしたときのLambdaのリソースベースポリシー
LambdaのトリガーでS3を設定したとき、自動的にLambdaのリソースベース …
-
-
AWS Expert Online at JAWS-UG首都圏エリアに参加して「Amazon EC2 スポットインスタンス再入門」を聞いてきた
AWS Expert Onlineという勉強会がありまして、AWS ソリューショ …
-
-
Amazon SNSサブスクリプションフィルターで優先度別のSQSキューにサブスクライブする
EC2のコンシューマーアプリケーションは優先度の高いキューのメッセージを先に処理 …
-
-
AWS Transfer Family EFS向けのSFTP対応サーバー
EFSファイルシステムは作成済です。 AWS Transfer Family S …
-
-
slackのbotに天気を教えてもらう(Python on AWS Lambda + API Gateway)
slackのbotにAPIの定番ともいえる天気情報を教えてもらいました。 環境は …
-
-
PyCharmにAWS CloudFormationプラグインをインストールして入力補完してみる
JetBrainsのPython統合開発環境(IDE)のPyCharmを1年ちょ …
-
-
AWS Systems Manager Fleet Manager Windows RDP Connectを試してみました
AWS Systems Manager Fleet Manager Window …
-
-
AWS Systems Manager AutomationでEC2の自動停止
Systems Manager Automationがない時代に、Lambdaを …