よくあるサーバーレスアーキテクチャで質問フォーム
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にタグ付きで投稿とかも簡単にできそうですね。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
AWS Code Commitをプライベートリポジトリとして使う
GitHubでもいいんですが、アクセスキーとかパスワードとかコンフィグ系で書いて …
-
Amazon FSx for Lustreのユーザーガイド入門演習
ファイルシステムの作成 FSx for Lustreを選択しました。 容量やスル …
-
AWS Storage Gatewayボリュームゲートウェイを作成してWindowsから使用
ボリュームゲートウェイの作成 Storage Gateway作成メニューからボリ …
-
Amazon Glacierのプロビジョニングされた迅速取り出し容量をなぜか購入しました
過去1年ぐらいのAWSコストをCost Explorerで見てまして、10/10 …
-
DynamoDB IAMポリシーで特定属性だけを許可する
検証記録です。 対象テーブル 書籍のサンプルで作ったこちらです。 所属バンドの楽 …
-
AWS Organizationsからメンバーアカウントを直接「閉じる」ことができるようになりました
これまでは、メンバーアカウントはOrganizations組織から「除外」して独 …
-
ALBにWAFを関連付けて特定のヘッダー以外はブロックする
おかげさまで、ブログのアクセスも増えてきて、t3.nano EC2インスタンス単 …
-
ユーザーガイドの方法でGithubからCodeCommitへリポジトリを移行する
GitリポジトリをAWS CodeCommitに移行するを参照しました。 環境 …
-
テキストをAmazon PollyでMP3に変換してS3に格納(AWS Lambda Python)
Google Calendar Twilio ReminderのテキストをAma …
-
EC2 Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(手順整理版)
ブログサイト(WordPress)をレンタルWebサーバーからAWSに移設する事 …