kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Lambda / Kinesis / DynamoDB / X-Ray などを組み合わせた実装を学べる「サーバーレスアプリケーション開発ガイド」を読んだ

今月発売されたばかりの「サーバーレスアプリケーション開発ガイド」を読んだので,書評をまとめたいと思う.著者の西谷さん,献本ありがとうございます!

Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド

Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド

なお,サポートページからソースコードをダウンロードできる.コマンドもソースコードもそこそこ量があるため,写経せずに試したいという人はダウンロードして使うと良いかと.

book.mynavi.jp

概要

「サーバレスとは何か?」という解説からはじまり,実際に数種類の「サーバレスアプリケーション」を実装しながら理解を深めていく流れになっている.特に,多くの 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 をベースに学べるのはメリットだと思う.ただし,管理コンソールを意識しなくなるため,ちょっとでも気を抜くと「今,何をしてるんだっけ?」と方向性を見失ってしまう場面があった.このあたりはトレードオフだし,西谷さんのブログ記事にも意図が詳細に書かれている.

keisuke69.hatenablog.jp

Kinesis リシャーディング

まず「Amazon CloudWatch のアラームをトリガーに自動処理をする」を実際に試してみた.アーキテクチャは以下のようになっていて,Kinesis のデータストリームに閾値以上のレコードが登録された場合に,自動的にリシャーディングを行う.

f:id:kakku22:20180326204618p:plain

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 関数の構成は,以下のようになっている.

f:id:kakku22:20180326204947p:plain

実際にリシャーディングを行った結果が以下となる.ちゃんと 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

f:id:kakku22:20180326205003p:plain

まとめ

  • 「サーバーレスアプリケーション開発ガイド」を読んだ
  • AWS サービスを組み合わせて数種類のアプリケーションを実装できた
  • Lambda だけじゃなく Kinesis / DynamoDB / AWS SAM などに興味があるなら読むべき
  • 本書のメインコンテンツとも言える「写真投稿サイト」は Vue.js で実装されていてフロントエンドの勉強にもなった
    • 途中まで写経してたけど,量が多くて,途中からソースコードをダウンロードして進めた

関連記事

去年に読んだ「サーバーレスシングルページアプリケーション」と似ている部分も多かった.ただし,フロントエンドは jQuery → Vue.js になっているし,組み合わせる AWS サービスも多いし,今から読むなら「サーバーレスアプリケーション開発ガイド」かなぁーと.

kakakakakku.hatenablog.com

同じく去年に読んだ「実践 AWS Lambda」も関連書籍と言える.もし AWS CLI メインで改版されるなら,もう1度読む!

kakakakakku.hatenablog.com