ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

4/18(火)、AWS Black Belt Online Seminar サーバレスによるアーキテクチャパターンのご紹介 受講レポート

はじめに

 Amazonが配信している「AWS Black Belt Online Seminar サーバレスによるアーキテクチャパターンのご紹介」を受講しました。以下受講メモ。


メモ

サーバレスによるアーキテクチャパターン

  • AWS Lambdaを中心に
  • ベストプラクティス的なもの
What is Serverless?
  • おさらい程度
  • ユーザーが管理しなければいけないサーバがなくなる
  • AWSのサーバレスの場合
    • シンプルで使いやすい
    • プロビジョニングをしない(できない)
    • 処理実行分に対して課金が発生、アイドルタイムに支払いが発生しない
    • スケーリングは使用率に合わせて自動で行われる
    • 高可用性・組込済み(既にプラットフォーム側で行われている)
    • You don't do that, we do that.
AWSのComputeサービス
スケールの単位 抽象化
EC2 インスタンス ハードウェア
ECS アプリケーション OS
Lambda ファンクション ランタイム
サーバレスなアプリケーションモデル
    1. イベントソース(発生源)における状態変化
    2. ファンクション呼出
    • Java
    • C#
    • Node
    • Python
    • カスタムライブラリも利用可能
    1. サービス呼出
    • DynamoDB
  • -
イベントソース
  • いっぱい
    • S3
    • DynnamoDB
    • Kiness
  • どんどん増え続けている
AWSのサーバレスファリング
  • Lambda≠サーバレス
  • Lambdaが中心になるのはたしか
アーキテクチャパターン
ベストプラクティス
  • The Twelve-Factor App
    • モダンなWebアプリ開発のための方法論
    • 元はHerokuエンジニアが公開
      • コードベース
        • バージョン管理された1つのコードベースと複数のデプロイ
      • 依存関係
        • 明示的に宣言して分離する
        • 暗黙的に依存しない
      • 設定
      • バックエンドサービス
        • アプリケーションがネットワーク越しで利用するようなサービスは全て外部サービスとして扱う
      • ビルド・リリース・ラン
        • 3つのステージを厳密に分離する
      • プロセス
        • ステートレスなプロセスとして実行
      • ポートバインディング
        • アプリ自体がリクエストを待ち受けた方がよい
      • 並行性
      • 廃棄容易性
        • 高速な起動と簡単な廃棄
      • 開発/本番一致
        • 各環境をできるだけ一致させた状態を保つ
      • ログ
        • ログ管理をアプリ自身で行わない
      • 管理プロセス
        • 管理タスクを1回限りの実行プロセスとする
その他の(Lambda特有の)ベストプラクティス
  • メモリ設定
    • メモリを増やすとCPUも倍になる
    • Lambdaはメモリ使用量と処理時間で課金、メモリを増やすとパフォーマンスも向上する
    • 段階的に試して最適化を目指すのが吉
  • VPCは必須ではない
    • 必要でない限り使用しない
    • 使うのはVPC内のリソースにどうしてもアクセスする必要がある時だけ
    • パフォーマンス劣化の原因になる
    • VPC内のリソースとの通信が必要な時は非同期にする
  • Design for failure
    • リトライ
    • Dead Letter Queueの活用(非同期の場合)
  • 冪等性はコードで確保する必要あり
    • Lambdaで保証しているのは最低1回実行すること
    • 場合によっては2回以上実行していることも
  • コールドスタート
    • 安定的なトラフィックが発生している場合、コールドスタートの発生頻度は低い
    • コールドスタートは発生するものと思った方がよい
      • 遅延が一切許容できないのであれば使用しない方がよい
  • ローカル実行について
    • Lambdaで使われているAMIは公開されている
    • ファンクションんと言ってもただのプログラム
    • Contextとイベントを再現する必要がある
      • 単なるJSONオブジェクト
コールドスタートを速くする
  • Lambdaファンっくしょんに対してPingする
    • 定期的にアクセスしてコンテナ破棄を防ぐ
  • コンピューティングリソースうを増やす
    • CPUも早くなるので初期化処理も早くなる
  • ランタイムを変える
    • Java(JVM)は起動が遅い
      • 一回起動しちゃうとJavaの方が早い
  • VPCを使わない
  • パッケージサイズを小さくする
    • サイズが大きくなると起動時間も長くなる
    • 不要なコードは減らす
    • 依存関係を減らす
    • Javaは肥大しがち
  • 初期化処理をハンドラ外に書くとコールドスタートが遅くなるので、遅延ロードを行う
ローカル実行
  • テストドライバ
Q&A
  • 後日ブログで
告知

感想

 AWS Lambdaは今まさに仕事で使っているサービスで、オレにとって実質最初に触ったAWSサービスと言えるんですが、とっても大好きです。こういう要らんこと気にせずに、やりたいことに集中できて、パズルみたいに組み合わせて作れるのは非常に楽しいですね。今回のオンラインセミナーでは、オレが思ってた以上にLambdaの活用パターンがあることが知れて、とても参考になりました。今後Lambdaと連携できるサービスも増えるようですので、今後とも活用していきたいです。