API Gateway + Lambda + SES で安価な問い合わせフォームを構築しよう(前編)

## あなたのWebサイト、本当にレンタルサーバーが必要ですか？

突然ですが、現在ご自分の(または所属する組織の)HPをレンタルサーバーにホスティングしている方はどれくらいいるのでしょう？
ブログ等を頻繁に更新するためWordpresssをはじめとするCMSを導入しているサイトは、PHPやMySQL等のDBを動作させるためにレンタルサーバーを選択しているケースが多いかと思います。
ですが、小～中規模のコーポレートサイトは自社商品の紹介、会社概要やアクセス情報などを最初に作成したままで、webサイトの更新は行わず最新情報はSNSで提供するようにしている形を取っているところも多くなってきたと思います。
この場合、あまり**更新の無いwebサイトは本来静的なHTMLでも充分**にその役目を果たすのですが、問い合わせフォームを設置するためだけにPHPでサイトを構築している！というところも多いのではないでしょうか。
一度、自分が運営されているWebサイトを**「本当にCMSが必要だろうか？」「PHPじゃなきゃダメなんだろうか？」**と見直してみてはどうでしょう？

PHPやDBが動作するレンタルサーバーを使おうとすると大体安くても300円～500円/月は掛かります。
コーポレートサイトは一度作成したら、(倒産しない限り) ほぼ無くなることはありませんので、この維持費はずっと払い続けることになります。

価格参考：
[さくらのレンタルサーバ](https://www.sakura.ne.jp/)
[LOLIPOP!レンタルサーバー](https://lolipop.jp/pricing/)


## AWSでもっと安くホスティングしよう

全てのWebサイトに適用出来るわけではないですが、AWSを活用してホスティング費用を抑えることが出来ます。
それは静的なHTML(HTML、CSS、JavaScriptのみの構成)にして [Amazon S3]( https://aws.amazon.com/jp/s3/ ) にホスティングすることです。
Amazon S3は、DropboxやGDriveに代表されるような所謂ストレージサービスですが、**静的なHTMLのホスティングが可能**になっています。

Amazon S3の料金は[コチラ]( https://aws.amazon.com/jp/s3/pricing/ ) に記載されていますが、普段AWSに触れていない方にはわかりにくい料金形態ですので
例として

- 画像を含めたWebサイト全体のファイルサイズが3MB
- ページ内の画像やCSSファイル、JSファイルのリンクが20ヶ所 (1回のViewで20回のGETリクエストが発生)
- 月間5,000View

上記のようなサイトをホスティングした場合の料金を、東京リージョンの価格で試算してみましょう。

まずはストレージ料金は、50TBまでは0.025USD/GBとなっていますので
**＄0.025 ｘ 3MB(0.003GB) = ＄0.000075/月**
ほとんどタダのようなものですね。

次にリクエスト料金は、リクエスト1,000 件あたり0.00037USDですので
**＄0.00037 x 5,000View x 20回のGETリクエスト / 1,000件 = ＄0.037/月**

最後はデータ転送料ですが、最初の1GBは無料で、それ以降は9.999TB/月までは0.14USD/GBと
なっていますので
**＄0.14 x ((3MB x 5,000View - 1024MB) /1024) GB = 約＄1.91/月**
となり、合計は**＄1.94775/月**になります。

2018/02/16時点の為替レートで**$1=106.5円で換算すると、約207円/月でホスティング**出来てしまいます。
これが月間PVが10万、100万を超えるような人気サイトなら別ですが、前提としている小～中規模のコーポレートサイトであれば、よほど画像が盛りだくさんでない限り、300円/月を超えることは無いのではないかと思います。
(※ 上記試算結果は、2018/02月時点での料金に基づいています)

しかも、Amazon S3は**99.999999999% の耐久性を保証**していますので、「サイトが落ちた！」という事態をほぼ考えなくても良いうえに、AWSのフルマネージドサービスですのでメンテナンスフリーな環境でホスティング出来るのです。エンジニアの方ならご理解頂けると思いますが、カーネルのアップデート作業やPHPのバージョンアップ等の煩わしい作業から解放されるのです。

ですが、上記でも述べているとおりS3でホスティング出来るのは静的HTMLのみですので、**問い合わせフォームが必要なサイトはS3だけでは実現出来ません。**
そこで（やっと本題ですが）S3と同じくAWSのフルマネージドサービスであるAPI Gateway、 Lambda、SESを活用して、安価な問い合わせフォームを構築しようと思います。


## サーバーレス問い合わせフォームの構成

「問い合わせフォームを構築」と記述しましたが、正確には**API Gateway、Lambda、SESを組み合わせてメールを送信するAPIを作成し、S3にホスティングしたJavaScriptから呼び出す**という形になります。

簡単な図で示すと下図のような流れになります。

![form.png](https://qiita-image-store.s3.amazonaws.com/0/171672/66c35c35-52a2-7cd9-0c8a-c01384f9cb9a.png)

ここに紹介しているAWSのサービスは、S3と同様に全てAWSのフルマネージドサービスですので、サーバー管理の諸々の作業が必要ありません。メンテナンスフリー万歳です。

次に料金に関して試算してみましょう。
今回の前提は月間5,000Viewのサイトですから、10回に1人が問い合わせをすると仮定して月間500件の問い合わせで試算してみます。

**・[API Gateway]( https://aws.amazon.com/jp/api-gateway/pricing/)**
100 万回の API 呼び出しにつき 4.25 USDですので
**＄4.25 / 1,000,000回 x 500回 = ＄0.002125/月**
この他にAPI Gatewayのレスポンスデータ送出にも転送料が掛かるのですが、今回はメール送信のOK/NGだけ返却すれば良いので、試算からは省きたいと思います。

また、この試算は前述のS3の試算と同様に2018/02月時点の東京リージョンの価格で行っていますが、特に東京リージョンにこだわらない方は、バージニアやオレゴン、アジアでしたらソウルやシドニーのリージョンを選択すると、100万回のAPI呼び出しにつき3.5USDとややお得です。
(どうせSESは東京リージョンにありませんしね・・・)

**・[Lambda]( https://aws.amazon.com/jp/lambda/pricing/)**
Lambdaは、**1,000,000 件/月の無料リクエストおよび 400,000 GB-秒のコンピューティング時間が無料利用枠**となっていますので、今回の試算では料金は発生しません。太っ腹です。

**・[Amazon SES]( https://aws.amazon.com/jp/ses/pricing/)**
送信1,000 通あたり 0.10 USDとなっています。今回は単一の送信先に月間500通の送信ですので
**＄0.10 / 1,000通 x 500通 = ＄0.05/月**
となります。

合計で**＄0.052125/月**で、$1=106.5円で換算すると**約5.5円/月が問い合わせフォームの費用**になります。破格ですね。
AWSの活用で、かなり安く運用出来そうだ、ということが分かって頂けたでしょうか？
ちなみにAWSの料金は全て従量課金制で基本料金というものがありませんので、もっと月間PVの少ない個人サイトのようなものであれば、100円/月も掛からないんじゃないかと思います。

それでは実際の構築手順を[後編](https://qiita.com/north-code/items/042aa8c7650eb42db3b7)で紹介します。