サーバーレスアーキテクチャってなんだっけ

#読者の対象イメージ
・さくらVPSを契約してLAMP環境とかを作ってCMSとか作れる感じの人
・AWS EC2の無料枠で簡単なHPを公開しているよ
・スマホアプリから呼ぶAPIプログラムなら作ったことあるよ！
・上記のことは全然わからないけど、なんとなく今から始めるなら最新の技術で安いWebアプリ開発がしたい人

#サーバレスアーキテクチャってなに？
・**サーバ**が**レス**な、**アーキテクチャ**。
・~~「サーバーのないインフラ」~~
・サーバーの管理、運用が必要のない仕組み

## サーバーが必要ないってどういうこと？
・クラウドプラットフォームが、必要なときだけサーバーインスタンスを貸してくれるイメージ
（1日に１００アクセスしか無いのに、サーバーとか固定IPを持っておくのって無駄が多くない？ってこと）

　1. HTMLファイルとかの静的ファイルはS3とかのクラウドストレージに配置しましょう。
　2. 独自ドメインやキャッシュはCloudFrontみたいなキャッシュサービスを通じてやりましょう
　3. メールフォームとか動的なページはAPI化して

##なんでそんなことするの？
###サーバーのセットアップ面倒くさいな
・Linuxって色んなOSあるんでしょ。何選べばいいの。ぼくずっとCentOSとかだったけど、え、アマゾンはAmazon Linux???
・EC2インスタンスを借りたらまず、gitとapacheとphpとmysqlをインストール。でもphp5.6使いたいからその前にnpmリポジトリを更新して・・・あれ？
・あれ、apacheのSSLの設定ってしたっけ・・・
・いつのまにかサーバー再起動してるじゃん。しかもmysql自動起動になってなかった・・・orz
###攻撃怖いじゃん
・インターネットにHPやサービスを公開すると、色んなイタズラを受ける
・1秒に100回SSHに接続してきたり・・・
・メールフォームにJavaScript埋め込まれてサーバーの中のファイルを見られたり・・・
・大量にWordpressにCLIログインしようとしてきてDBがサチったり・・・
###そんな常にサーバーインスタンス必要ないんだけど・・・
・1日に100アクセスのサービスとか、別に普通にあるし
・開発のために別のインスタンス作ったけど、無料枠じゃないから月2000円とられちゃったり
###大量のアクセスに備えたいよね
・サーバー代ケチったら、せっかくTwitterでバズってサービスが大盛り上がりになると思った時にサーバーが落ちちゃうとか、悲しい
###ロードバランサ組んだりするほど大掛かりなことする技術力ないです
・確かにロードバランサを組んで大量のサーバーに負荷分散すればいい
・しかも負荷に応じて自動的にサーバーの数を上限できるように設定しておけば安心！
・でも、インフラ専門の技術者じゃない人いるでしょ。サーバーの運用のことばっかしてられないよ
・正直、勉強することが多くて無理・・・。

## そんな、インフラ専門のエンジニアではない人でも簡単に運用したい！
・herokuみたいに、インフラのことを気にしないでビジネスロジックだけ書いてアプリリリースしたいよねって需要に最適！

## どうすれば使えるの？
・Microsoft Azure Functionsとか、Google Cloud Functionsとかある。
・ぼくが使っているのはAmazon AWSを使った構成。

# メリット、デメリットまとめ
## メリット
・サーバーの運用が不要（用意やOS・ソフトのインストール、デプロイなどがいらない）
・料金がたいてい安くなる（AWSは大体が従量課金、EC2を24時間365日起動しておくより基本安くなるはず）
・セキュリティに疎くてもある程度安全（攻撃対象となるサーバーが「無いに等しい状態」なので、安心）
・可用性高い（可用性って、ぼくも最近はじめて聞いた言葉だけど。要は落ちないってことかな。あと大量のアクセスも安心！）

# デメリット
・サーバーで常時プログラムが動いている前提のシステムは構築しづらい（ネットゲームのサーバーとか向かない）
・新しいんで仕様がどんどん変わる可能性もある
・Lambdaで使える言語が限られている。（Java, NodejS, Python。やろうと思えばBashからPHP使えるけど）
・良くも悪くもサーバーがない。例えば、IPが固定されないので、IP WhiteListを設定するなら、別途VPCつかったりNATゲートウェイ使ったりする必要がある（チャレンジして挫折したので今月もう一度試してみる）
・サーバーがないってことは、あれ、ログファイルとかってどうなるの。（CloudWatchに一時的に保存される。あとは自分でなんとかする必要あり）

# サーバーレスアーキテクチャの例
・前提として、LAMP環境でメールフォーム付きのホームページを持っていたとします。
・これをどうやってサーバーレスアーキテクチャに載せ替えたらいいでしょうか。

## LAMPとの対応例
| やること | LAMP環境 | AWS サーバレスアーキテクチャ |
|:-:|:-:|:-:|
| 静的ファイルの公開(html, css, jsファイル, img） | Apache | S3 |
| 静的ファイルのキャッシュ |   | CloudFront |
| 独自ドメインの使用 | Apache VirtualHostなど | CloudFront |
| メールフォーム送信php | phpスクリプト | API GatewayでAPI化してAWS Lambdaを起動 |
| 問い合わせ内容をDBに保存 | MySQL（PostgreSQL、MongoDBなど） | AWS DynamoDB |

## 静的ファイルはAWS S3でホスティング
・DropBoxやGoogleDriveほど使い勝手がいいわけではありませんが、そのどちらもで最近できなくなった静的ファイルのホスティングがAWS S3サービスでできます。
・フォルダごとアップロードして、共有権限を全員閲覧にすれば、Amazonのドメインで公開が可能！

## 静的ファイルの独自ドメインでのアクセス、キャッシュはCloudFront
・実はまだ使ったことがないんですが・・・・
・理論上は、CloudFrontで独自ドメインとS3のファイルを紐付けられるそうです
・しかもキャッシュも設定できるらしい！（まだイマイチ嬉しいポイントが分かってないですが）

## メールフォームなど、プログラムが必要な部分はLambda。
・サーバーレスアーキテクチャのキモ。詳しくは後日説明。
・ここでは、phpみたいなGETやPOSTリクエストに対して起動するプログラムファイル専用のS3みたいなものと考えてOK。
・その他にも、cronの代わり（毎日朝6時に実行する）とか、DynamoDBのデータが変更されたら（MongoDBのフックみたいな）タイミングでプログラムを実行することが可能です。
・Lambdaは直接は起動できないので、API GatewayでURLに対するGETやPOSTに紐付ける必要がある。

## データベースはDynamoDB
・DynamoDBはNoSQL。
・使ったこと無いけどイメージ的にはMySQLよりMongoDBの方が近いみたい？
・凄いざっくりいうと、凄い大きなHash。データベースからキーでデータを取り出す。
・一回の読み込みのサイズが1MBに制限されていたり（それ以降はページングが必要）、ちょっと面倒。
・各言語に用意されたAWS SDKってライブラリを使ってアクセスしてね！
・ちなみに基本ハッシュなので、問い合わせ情報の蓄積にはあまり向いていない・・・。

# まとめ・サーバーレスアーキテクチャってなに？
今までの流れ（Webサーバーとか）
「サーバーはオフィスにおいてあります」
「サーバーはサーバールームに移動しました」
「サーバーは専用のデータセンターに移動しました」
「サーバーは専門業者のデータセンターのものを借りることにしました」（さくらマネージドサーバー的な）（ここまでが物理サーバー時代）
「サーバーは専門業者のデータセンターのものを別の人とシェアして使うこといしました」（さくらマネージドサーバー的な）
「サーバーは何処かにあるサーバーの一部分を仮想的に1台のサーバーとして借りることにしました」（Amazon EC2、さくらのVPS）
「サーバーは色んな所にあるサーバーをその時必要そうな台数分用意しておいて負荷分散しながら使うことにしました」（ロードバランサー使うよ）

「サーバー？ないよ？頼んだことは皆Amazonが持ってるどっかのサーバーが代わりにやっておいてくれるから（適当）」（サーバレスアーキテクチャ）

って感じです。

# 明日以降
仕事の合間で、サーバレスアーキテクチャの使い方とか、詳しい仕様とか、できることとかを書いていこうと思います。