プログラマでありたい

おっさんになっても、プログラマでありつづけたい

触って覚えるサーバレス入門!!『サーバーレス シングルページ アプリケーション』

 監訳者の@yoshidashingoさんにサーバーレス シングルページ アプリケーションを頂きました。ありがとうございます。

f:id:dkfj:20170620015140j:plain

 

本書の内容



 本書の内容としては、名前の通りサーバーレスでシングルページアプリケーションを構築する方法がテーマとなっています。ただどちらかと言うと、シングルページ アプリケーションはおまけで、サーバーレスのAPIを作ることがメインとなっています。機能説明だけでなく実際に手を動かしながら覚えていくというスタイルで、その為に200ページ弱と薄めの本となっています。サクッと読めて、それでも一通りの事はカバーしているという中々よい構成です。

Cognito,DynamoDB,Lambda+API Gateway



 サーバーレスの中心として、本書ではCognito,DynamoDB,Lambda+API Gatewayの4つを中心に扱っています。基本的な使い方からチップス的なものまで扱っています。それぞれ20〜30ページくらいで説明しているので、分量的に多くなく適量なのではないでしょうか。
 例えばDynamoDBの章では、DynamoDBの歴史から強い整合性と結果整合性、インデックスの話など基本的な機能の説明から、DynamoDBへのアクセス許可に際してのIAMのポリシーの設定など具体的なことまで記述されています。この中でConditionの項目で置換変数を使ってCognito IDを使って自分のデータのみしか参照/更新できないような制限など、一般的に頭を悩ます部分についてもサラッと答えを書いているのが好感です。

サーバーレスのセキュリティ&スケールアップ



 この本で特に良いなぁと思った所が、7章の『サーバーレスのセキュリティ』と8章の『スケールアップする』です。サーバーレスの構築事例や運用実績は、まだまだ世の中に出てきているものが少ないです。そうなると構築する際に困るのが、どのようなセキュリティ施策・運用の想定をすればよいか解らないということです。そういった意味で、独立した章としてそれぞれを扱っているのは素晴らしいです。
 セキュリティについては、サーバーレスの施策というよりAWSの基本的な設定であったりJavaScript側の施策であったりと、まだまだ書き足すところは多いかもしれません。それでも、クエリインジェクション・クロスサイトリクエストフォージェリ・DDoSと代表的な攻撃に対する対処方法が書かれています。
 スケールアップの所でフフフとなったのが、S3のアクセス集計。S3のログを元にシェル芸を駆使していました。『S3Webトラフィックを解析する』というタイトル見て、Google Analytics使えという内容かと思ったのですがAWSオンリーで行くという心意気を感じました。ちなみにこんな感じです。

$ aws --profile admin s3 sync s3:learnjs-logging.benrady.com/ logs
$ cat logs/* | cut -d ' ' -f 13 | sort | uniq -c

 どうせならawkコマンドをだして紛らわしくしたら良いのではと思いながら読んでいたのですが、後ろの方でしっかり出てきました。

$ cat logs/* | awk '{ print $3 }' | gr ':' ' ' | \
  awk '{ print $2 ":" $3}" | sort | uniq -c

 シェル芸好きとしては、満足です。ただ現実的な運用では、Google Analyticsをお勧めします。
それ以外にも、バージョニングを利用したキャッシュコントロールなどがあり一読をお勧めします。

感想



 非常に読みやすくて、サーバーレスとは何ぞやと知りたい人にはお勧めの一冊です。が、個人的には非常に悔しい一冊です。実は、この本の原書の発売が2016年6月14日です。私も『Amazon Web Services クラウドネイティブ・アプリケーション開発技法』という本を出しており、テーマも発売時期もほぼ同じでした。ただ主題をシングルページ アプリケーションではなくモバイルアプリにしました。書名もサーバーレスかクラウドネイティブか悩んだ末に、クラウドネイティブにしました。後はあれもこれもと欲張り、KinesisやMachine Learning, AWS IoT, Mobile Hubなど詰め込みすぎました。結果700ページ超の分厚さになり、知る人ぞ知るというマニア向けの本となってしまいました。この本を読んで、改めて対象を絞り込むことが大切だなぁと実感しました。良い本です。

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス

サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス


以下、目次です。

目次


本書への推薦の言葉
監訳者まえがき
はじめに
目次

1章 シンプルにはじめる
1.1 サーバーレスWebアプリケーション
1.2 ワークスペースを使う
1.3 Amazon S3にデプロイする
1.4 はじめてのデプロイ

2章 ハッシュイベントによるビューのルーティング
2.1 テストしやすいルータを設計する
2.2 ルータ関数
2.3 ルートを追加する
2.4 ビューパラメータを追加する
2.5 アプリケーションをロードする
2.6 再びデプロイする

3章 シングルページアプリケーションに必要なもの
3.1 ビューを作成する
3.2 データモデルを定義する
3.3 ユーザー入力を処理する
3.4 アプリケーションシェルを作成する
3.5 カスタムイベントを使う
3.6 再びデプロイする

4章 Amazon CognitoによるIdentity as a Service
4.1 外部のアイデンティティプロバイダに接続する
4.2 アイデンティティプールを作成する
4.3 Googleアイデンティティを取得する
4.4 AWS認証情報をリクエストする
4.5 プロファイルビューを作成する
4.6 再びデプロイする

5章 DynamoDBにデータを格納する
5.1 DynamoDBと連携する
5.2 テーブルを作成する
5.3 DynamoDBへのアクセス許可
5.4 ドキュメントを保存する
5.5 ドキュメントを取得する
5.6 データアクセスと検証
5.7 再びデプロイする

6章 Lambdaを使って(マイクロ)サービスを作る
6.1 AWS Lambdaを理解する
6.2 まずデプロイする
6.3 Lambda関数を書く
6.4 Lambda関数を呼び出す
6.5 Amazon API Gatewayを使う
6.6 再びデプロイする

7章 サーバーレスのセキュリティ
7.1 AWSアカウントをセキュアにする
7.2 クエリインジェクション攻撃
7.3 クロスサイトスクリプティング攻撃
7.4 クロスサイトリクエストフォージェリ
7.5 盗聴とトランスポート層のセキュリティ
7.6 サービス拒否(DoS)攻撃
7.7 再びデプロイする

8章 スケールアップする
8.1 Webサービスを監視する
8.2 S3Webトラフィックを解析する
8.3 成長に合わせて最適化する
8.4 クラウドのコスト
8.5 再びデプロイする(何度も、何度も)

付録A Node.jsのインストール
A.1 Node.jsランタイムをインストールする
A.2 複数のNode.jsバージョンを管理する

付録B ドメイン名を割り当てる

参考文献