今月発売されたばかりの「サーバーレスアプリケーション開発ガイド」を読んだので,書評をまとめたいと思う.著者の西谷さん,献本ありがとうございます!
Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド
- 作者:西谷 圭介
- 発売日: 2018/03/16
- メディア: 単行本(ソフトカバー)
なお,サポートページからソースコードをダウンロードできる.コマンドもソースコードもそこそこ量があるため,写経せずに試したいという人はダウンロードして使うと良いかと.
概要
「サーバレスとは何か?」という解説からはじまり,実際に数種類の「サーバレスアプリケーション」を実装しながら理解を深めていく流れになっている.特に,多くの AWS サービスを組み合わせて学べる点が素晴らしく,例えば X-Ray などは,僕もまだ試したことがなかったので,今回学ぶことができた.実装する「サーバレスアプリケーション」ごとに,組み合わせる AWS サービスをザッと挙げる.こんなにある!
- Amazon CloudWatch のアラームをトリガーに自動処理をする
- Kinesis
- CloudWatch
- SNS
- Lambda
- Web サイトの状態を定期的にチェックする
- Lambda
- CloudWatch Events
- Amazon Kinesis を使って Twitter のデータを受け取る
- EC2
- Kinesis
- Lambda
- DynamoDB
- 写真投稿サイト
- API Gateway
- Lambda
- DynamoDB
- Rekognition
- S3
- Cognito
- CloudFormation
- Serverless Application Model (AWS SAM)
- デリバリプロセスの自動化
- CloudFormation
- Serverless Application Model (AWS SAM)
- CodeBuild
- CodePipeline
- トラブルシューティング
- CloudWatch
- CloudWatch Logs
- X-Ray
本書の特徴は「ほぼ全てのオペレーションを AWS CLI で行う」という点だと思う.管理コンソールのデザインが変わっても AWS CLI のオペレーションは大幅に変わらないというメリットがあるし,オペレーションを積極的に Infrastructure as Code にするという意味でも AWS CLI をベースに学べるのはメリットだと思う.ただし,管理コンソールを意識しなくなるため,ちょっとでも気を抜くと「今,何をしてるんだっけ?」と方向性を見失ってしまう場面があった.このあたりはトレードオフだし,西谷さんのブログ記事にも意図が詳細に書かれている.
Kinesis リシャーディング
まず「Amazon CloudWatch のアラームをトリガーに自動処理をする」を実際に試してみた.アーキテクチャは以下のようになっていて,Kinesis のデータストリームに閾値以上のレコードが登録された場合に,自動的にリシャーディングを行う.
Kinesis にレコードを登録するために,以下の put-records.py
を使った(データストリーム名は sample
となる).AWS CLI は量が多くなってしまうため,本書を読んでもらえればと!
import boto3 import datetime import time import uuid kinesis = boto3.client('kinesis') stream_name = 'sample' partition_key = str(uuid.uuid4()) data = datetime.datetime.utcnow().strftime('%s') for i in range(15): kinesis.put_record( StreamName=stream_name, Data=data, PartitionKey=partition_key, )
作成した Lambda 関数の構成は,以下のようになっている.
実際にリシャーディングを行った結果が以下となる.ちゃんと OpenShardCount
の値が 1 → 2
に変わっている.
# Before $ aws kinesis describe-stream-summary --stream-name sample { "StreamDescriptionSummary": { "OpenShardCount": 1, "EncryptionType": "NONE", "StreamStatus": "ACTIVE", "StreamName": "sample", "StreamARN": "arn:aws:kinesis:ap-northeast-1:111111111111:stream/sample", "EnhancedMonitoring": [ { "ShardLevelMetrics": [] } ], "StreamCreationTimestamp": 1521993626.0, "RetentionPeriodHours": 24 } } # Put $ python put-records.py # After $ aws kinesis describe-stream-summary --stream-name sample { "StreamDescriptionSummary": { "OpenShardCount": 2, "EncryptionType": "NONE", "StreamStatus": "ACTIVE", "StreamName": "sample", "StreamARN": "arn:aws:kinesis:ap-northeast-1:111111111111:stream/sample", "EnhancedMonitoring": [ { "ShardLevelMetrics": [] } ], "StreamCreationTimestamp": 1521993626.0, "RetentionPeriodHours": 24 } }
X-Ray
トラブルシューティングの事例として紹介されている X-Ray も実際に試してみた.設定は特に難しくなく,Lambda のトレースモードを有効にして,あとは X-Ray の結果を見るだけだった.X-Ray は今まで使ったことがなかったので,実際に処理内部のトレース結果が見れて良かった.
$ aws lambda update-function-configuration \ --function-name s3-get-object --tracing-config Mode=Active
まとめ
- 「サーバーレスアプリケーション開発ガイド」を読んだ
- AWS サービスを組み合わせて数種類のアプリケーションを実装できた
- Lambda だけじゃなく Kinesis / DynamoDB / AWS SAM などに興味があるなら読むべき
- 本書のメインコンテンツとも言える「写真投稿サイト」は Vue.js で実装されていてフロントエンドの勉強にもなった
- 途中まで写経してたけど,量が多くて,途中からソースコードをダウンロードして進めた
関連記事
去年に読んだ「サーバーレスシングルページアプリケーション」と似ている部分も多かった.ただし,フロントエンドは jQuery → Vue.js になっているし,組み合わせる AWS サービスも多いし,今から読むなら「サーバーレスアプリケーション開発ガイド」かなぁーと.
同じく去年に読んだ「実践 AWS Lambda」も関連書籍と言える.もし AWS CLI メインで改版されるなら,もう1度読む!