ヤマムギ

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にタグ付きで投稿とかも簡単にできそうですね。


最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

@yamamanx

開発ベンダー5年、ユーザ企業システム部門通算9年、ITトレーナー2年目のSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。

このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。

また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。

 - AWS , , , , , ,

ad

ad

  関連記事

AWS EC2 でインスタンスにIPアドレスを紐付ける

AWS EC2で作ったサーバは何もしなければ起動するたびにIPアドレスが変わって …

AWS EC2 Amazon Linuxにmauticをインストールする(Sendgrid, Nginx, MySQL on RDS)

mauticをAmazon LinuxとNginx,MySQL on RDSにイ …

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

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

AlexaにAWSの最新Feedを読み上げてもらう(Lambda Python)

年末にAmazon Echo Dotを購入しましたので、練習がてらAlexaスキ …

ACM(AWS Certificate Manager)の承認メールを受け取るためにAmazon SESを設定する

何のためでもいいのですが、ドメインは持っているけど、そのドメイン宛にメールを送ら …

AWS 認定クラウドプラクティショナーのサンプル問題

AWS認定クラウドプラクティショナのサンプル問題2018年9月25日現在で、英語 …

WordPressのwp-login.php , xmlrpc.phpへのアクセスをAWS WAFで接続元IPアドレスを制限する

AWS CloudWatch LogsエージェントでAmazon EC2上のNg …

AWS LambdaのSQSへの自前ポーリングをやめてSQSイベントソーストリガーに変更した

以前は、LambdaがSQSからメッセージを受信するには、キューをポーリングして …

AWS Lambdaで「Process exited before completing request」

AWS lambdaで「Process exited before comple …

AWS EC2でAMI(Amazon Machine Image)を作成しておく

前回まででひとまずRedmineを構築するところまで出来たので、念のためスナップ …