ヤマムギ

growing hard days.

*

ベタなサーバーレスアーキテクチャで質問フォーム

      2018/12/08


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

@yamamanx

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

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

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

 - AWS , , , , , ,

ad

ad

  関連記事

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

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

Amazon Rekognitionでイベント参加者の顔写真を解析して似ている人ランキングをその場で作る

2017/9/21に開催されたAWS Cloud Roadshow 2017 大 …

AWS Step Functions まずはパラレルでLambdaを並列実行してみました

複数のlambdaの実行制御をLambdaでやってましたが、その部分をStep …

Amazon LinuxにRedmine をインストールする(手順整理版)

Amazon LinuxにRedmineをインストールしました手順を記載します。 …

Amazon Pollyを使って覚えたい資料を耳から身体に染み込ませる

Amazon Pollyを使うとソースコードを一切かかなくても、テキストを音声に …

AtomエディタでEC2のファイルを直接編集する

Webページを編集していてEC2のファイルをvimエディタでさわったりしています …

AWSのAmazon LinuxにGitマスターサーバをインストールしてRedmineリポジトリブラウザで見る

Amazon LinuxにGitをインストールする Gitをインストールして自動 …

LINE BOT AWARDS 2017に応募しました

LINEの友達追加QRです。 動作のご確認にどうぞ LINE BOT AWARD …

RedmineをELB(ALB)でAutoScalingグループへ負荷分散

高可用なRedmineを作るためのELBの設定です。 高可用なRedmine R …

AWS Summit 2017 Tokyo Day2 開場~基調講演

昨年に引き続き今年もAWS Summit Tokyoへ行ってきました。 朝一の新 …