AWS の公式ドキュメント「AWS Lambda Operator Guide」を読んだ❗️AWS Lambda を軸にサーバーレスアプリケーションを構築するときに意識しておくべき "運用面のポイント・ベストプラクティス" がまとまっていて,とても良いドキュメントだった👏 内容的には AWS Well-Architected Framework: Serverless Applications Lens と重複するところもあるけど,サーバーレスアプリケーションを開発・運用しているなら1度は読んでおくと良いのではないでしょうか❗️
\( 'ω')/ 多くの人に読みやすくなるように日本語翻訳もあるとイイなぁ〜
構成
ドキュメントとしては全6章で構成されている.どれも重要で,理解を深めるために読むのはもちろん,開発中もしくは運用中のアプリケーションに対して「これは検討できてるかな?こっちはどう?」という感じで自問自答しながらセルフレビューに活用できたりもする💡
- 1. Event-driven architectures(イベント駆動型アーキテクチャ)
- 2. Application design(アプリケーション設計)
- 3. Security(セキュリティ)
- 4. Debugging(デバッグ)
- 5. Monitoring and observability(モニタリングとオブザーバビリティ)
- 6. Performance optimization(パフォーマンス最適化)
⚡️1. Event-driven architectures(イベント駆動型アーキテクチャ)
トピック一覧
- How Lambda fits into the event-driven paradigm(Lambda がイベント駆動型パラダイムにどのように適合するか)
- The benefits of event-driven architectures(イベント駆動型アーキテクチャのメリット)
- Trade-offs of event-driven architectures(イベント駆動型アーキテクチャのトレードオフ)
- Design principles(設計原則)
- Anti-patterns in Lambda-based applications(Lambda を使ったアプリケーションのアンチパターン)
- Frequently asked questions(よくある質問)
メモ
AWS Lambda の活用例としてよく出てくる「イベント駆動型」に関するトピックを学べる.前半ではイベント駆動型のメリットやポーリング型との違いなどがまとまっている.後半ではトレードオフ・設計原則・アンチパターンまでまとまっていて,イベント駆動型アーキテクチャを実践するときに理解しておくべきポイントが凝縮されている.
Design principles の Developing for retries and failures では「冪等性」の実現例として,Amazon DynamoDB に TTL (Time To Live) 付きの項目を登録して,トランザクションが以前に処理されたかどうかを判断するテクニックが載っていた💡これはとても実践的で,実は最近仕事で似たような実装を検討していて,関連情報として使えるな〜なんて思ったりもした.
他には Anti-patterns in Lambda-based applications で The Lambda monolith(モノリスラムダ)という印象的な名前のアンチパターンも紹介されていたりもする❗️
⚡️2. Application design(アプリケーション設計)
トピック一覧
- Understanding quotas(クォータを理解する)
- Scaling and concurrency in Lambda(Lambda でのスケーリングと同時実行)
- Choosing and managing runtimes in Lambda functions(Lambda 関数でのランタイムの選択と管理)
- Networking and VPC configurations(ネットワーク構成と VPC 構成)
- Comparing Lambda invocation modes(Lambda 呼び出しモードの比較)
- Controlling traffic flow for server-based resources(サーバーを使ったリソースのトラフィックフローのコントロール)
- Frequently asked questions(よくある質問)
メモ
サーバーレスアプリケーションをスケールしようとするときに重要になる AWS Lambda や Amazon API Gateway 関連のクォータ・設定項目がまとまっているのは良かった❗️同時実行数・バースト同時実行数・予約された同時実行数など.以下のドキュメントにも詳しく載っている.
Choosing and managing runtimes in Lambda functions の Runtimes and performance では AWS Lambda 関数のランタイムをどう選ぶかというトピックも載っていた.例えば Python / Node.js は初期化が高速で,Go は起動と実行どちらもパフォーマンスが良いなど.さらに Managing AWS SDKs in Lambda functions では,Python など一部のランタイムには AWS SDK(例えば boto3)がバンドルされているけど,Lambda レイヤーを使って AWS SDK のバージョンを固定するべきというベストプラクティスも載っていた❗️
AWS SDK のバージョンを固定するという話は The Twelve-Factor App の "依存関係" で宣言されている システム全体にインストールされるパッケージが暗黙的に存在することに決して依存しない
を意識することにも繋がって非常に重要なプラクティスと言える👌
⚡️3. Security(セキュリティ)
トピック一覧
- Understanding the Lambda execution environment(Lambda 実行環境の理解)
- Applying the principles of least privilege(最小権限の法則を適用)
- Securing workloads with public endpoints(パブリックエンドポイントでのワークロードの保護)
- Encrypting data in Lambda-based applications(Lambda を使ったアプリケーションでのデータの暗号化)
- Governance controls with AWS CloudTrail(AWS CloudTrail によるガバナンスコントロール)
- Frequently asked questions(よくある質問)
メモ
Understanding the Lambda execution environment に載っている Lambda 実行環境の構成図は AWS Lambda 関数がどうやって立ち上がるのかを理解するのに良いと思う💡
また Avoiding granting wildcard permissions in IAM policies では AWS Lambda 関数に設定する IAM Role のポリシーでワイルドカードを回避して最小権限にするべきという話も載っている.理解はしつつもワイルドカードのまま設定されている AWS Lambda 関数はよく見るし,改めて意識しないとな〜と思えた.
⚡️4. Debugging(デバッグ)
- Standardizing a debugging approach(デバッグアプローチの標準化)
- Troubleshooting payloads(ペイロードのトラブルシューティング)
- Troubleshooting integration errors(統合エラーのトラブルシューティング)
- Troubleshooting Lambda configurations(Lambda 構成のトラブルシューティング)
- Troubleshooting queue processing by Lambda functions(Lambda 関数によるキュー処理のトラブルシューティング)
- Best practices for your debugging environment(デバッグ環境のベストプラクティス)
メモ
サーバーレスアプリケーションでは複数のコンポーネントを組み合わせることになるため,デバッグするポイントも増える.多種多様な観点で,どのようなトラブルが起きる可能性があるのか?という視野を広げられる内容になっている💡
例えば Troubleshooting payloads では,予期しないペイロードを受け取る可能性もあるので例外処理をしようというプラクティスが載っていて,すぐに使えそうだった.また Troubleshooting queue processing by Lambda functions では AWS Lambda と Amazon SQS を組み合わせる場合の注意点も詳しく載っているのも参考になる❗️
⚡️5. Monitoring and observability(モニタリングとオブザーバビリティ)
トピック一覧
- Monitoring concepts in Lambda-based applications(Lambda を使ったアプリケーションのモニタリング概念)
- Logging and metrics with Amazon CloudWatch(Amazon CloudWatch によるログとメトリクス)
- Searching across logs with CloudWatch Logs Insights(CloudWatch Logs Insights を使ったログ全体の検索)
- Tracing requests with AWS X-Ray(AWS X-Ray を使ったリクエストのトレース)
- Troubleshooting walkthrough: isolating and resolving issues(トラブルシューティングウォークスルー: 問題の切り分けと解決)
- A general approach to debugging Lambda performance issues and errors(Lambda のパフォーマンス問題とエラーをデバッグするための一般的なアプローチ)
- Monitoring Lambda code storage(Lambda コールドストレージのモニタリング)
メモ
オブザーバビリティの定義としてよくある「メトリクス・ログ・トレース」それぞれをどのように実現するか?というトピックがまとまっている💡Logging and metrics with Amazon CloudWatch の Important metrics for CloudWatch では AWS Lambda をモニタリングするときに特に重要なメトリクス一覧が載っていて,Searching across logs with CloudWatch Logs Insights の Useful Insights queries では AWS Lambda 関数のログ検索でよく使う CloudWatch Logs Insights のクエリテンプレートも載っていて参考になる❗️
他にも Troubleshooting walkthrough: isolating and resolving issues は実際のアプリケーションでパフォーマンス問題を解決するというトラブルシューティングウォークスルーになっていて良かった💡
⚡️6. Performance optimization(パフォーマンス最適化)
トピック一覧
- Lambda execution environments(Lambda 実行環境)
- Memory and computing power(メモリと計算能力)
- Optimizing static initialization(初期化の最適化)
- Architecture and Best Practices(アーキテクチャとベストプラクティス)
メモ
Lambda 入門者が理解しておくと良い "コールドスタート" と "ウォームスタート" の違いが紹介されている.またドキュメントでは functions warmers という用語で紹介されていたけど,Amazon EventBridge を使って定期的に AWS Lambda 関数を呼び出し続けるという,前からよく知られたテクニックは,コールドスタートを削減することを保証するわけではないけど低優先度のワークロードであれば適しているかもしれないと紹介されているのも良かった💡
他には Profiling functions with AWS Lambda Power Tuning ではAWS Lambda 関数に割り当てる最適なメモリサイズを模索するために AWS Lambda Power Tuning や AWS Compute Optimizer を使うという話なども載っている.
まとめ
AWS の公式ドキュメント「AWS Lambda Operator Guide」を読んだ❗️サーバーレス(特に AWS Lambda)に対する理解度をグッと高められる良いドキュメントだった👏
サーバーレスアプリケーションを開発・運用しているなら1度は読んでおくと良いのではないでしょうか❗️