ヤマムギ

growing hard days.

*

よくあるサーバーレスアーキテクチャで質問フォーム

      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のバケットポリシー

S3バケットにはHTML, CSS, JavaScriptを配置して入力フォームをCloudFront経由で配信しています。

API Gateway

[質問]ボタンが押されると質問内容がURLパラメータとしてAPI GatewayでデプロイしたAPIにPOSTされます。

API GatewayではURlパラメータをJSONに変換してLambdaにEventデータとして渡してLambdaを実行します。

最初のLambda

Lambdaはメッセージを受け取って、SNSトピックへ発行します。

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関連については以下をご参照ください。

Redmineは使わなくとも、最後のLambdaでSlackに通知したり、メールを送信したり、でもいいと思います。
返信の機能は作ってないですが、Slackへの通知を返信したら、Twitterにタグ付きで投稿とかも簡単にできそうですね。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS , , , , , ,

  関連記事

EC2のAMIとRDSのスナップショットを他のAWSアカウントに共有してブログサイトをAWSアカウント間で引っ越す

当ブログで使用しているEC2とRDSを環境の整理のため、他のAWSアカウントへ引 …

Transit GatewayポリシーテーブルでCloud WANのコアネットワークに接続しました

「ポリシーテーブルってなんですか?」のご質問をいただいたので設定してみました。 …

AWS Network Firewallの入門

公式のGetting started with AWS Network Fire …

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト – プロフェッショナル」を執筆しました

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテク …

CloudFrontからのバーチャルホストなサイトのテストってどうしてます?

このブログの構成です。 AWSで構築しています。 4つのサイトを1つのEC2で配 …

AWS認定試験の自宅受験で壁のポスターを注意されちゃいました

AWS認定オンライン受験をしてみましたに書きましたとおり、自宅受験デビューしまし …

EC2 Instance Connect エンドポイントの作成

このブログのSystems Managerは機能としてセッションマネージャーしか …

Route53でドメインを新規取得してDNSレコードを設定する

Elastic IPをAWSで発行しているのですから、DNSの設定も同じようにマ …

AWS Organizationsで新規メンバー登録したアカウントを組織から離して解約

2021年現在ではこの方法しかないと認識していますので書き残します。 そのうち新 …

EC2インスタンスが到達不能になって復旧してMackerelで監視し始めた

きっとばりばり使っておられる方ならよくある事なんだろうけど、はじめて体験したので …