本番環境向け AWS Lambda の設定

AWS へのアプリケーションデプロイ

Dunieski Otano

Amazon Web Services Solutions Architect

テストでは動いたのに

  • テストはすべて通過しました
  • 本番環境ではタイムアウトとスロットリングが発生します
  • コードではなく、設定に問題がありました

テストは通過したものの本番環境で問題が発生するサーバーレス関数。メモリとタイムアウトのダイヤルを調整している様子

AWS へのアプリケーションデプロイ

本番環境で重要な Lambda の設定項目

Lambda ロゴを中心に、4 つの本番設定項目が放射状に配置されている。CPU スケーリングダイヤルを持つメモリ、クロック付きタイムアウト、エフェメラルストレージ、並列実行インスタンスを示すコンカレンシー

  • メモリ:CPU とネットワークも比例してスケールします
  • タイムアウト:関数が強制終了されるまでの最大秒数
  • エフェメラルストレージ:/tmp の一時領域
  • コンカレンシー:同時実行数
AWS へのアプリケーションデプロイ

メモリのサイジングと CPU の関係

  • メモリを増やすと CPU も比例して増加 します
  • CPU バウンドな関数はメモリを増やすことで高速化できます
  • 実行時間の短縮は コスト削減 につながります
  • 推測せず、テストで適切なサイズを見つけましょう

メモリとコストの曲線グラフ。メモリ増加に伴い実行時間は急減後に横ばいになり、総コストは U 字曲線を描く。最もコストが低い最適点が中央に強調表示されている

AWS へのアプリケーションデプロイ

コンカレンシー:予約済みとプロビジョニング済みの違い


予約済みコンカレンシー

  • 同時実行数の上限を設定します
  • 下流システムや他の関数を保護します

プロビジョニング済みコンカレンシー

  • インスタンスを事前ウォームアップし、コールドスタートを防ぎます
  • レイテンシーが重要なユーザー向け関数に適しています
AWS へのアプリケーションデプロイ

設定の管理と共有コードのパッケージング

  • 環境変数:環境ごとの設定値
  • レイヤー:コードや依存関係を関数間で共有
  • エクステンション:ツール用に関数と並行して実行
  • 設定はデプロイパッケージに含めないようにしましょう

Lambda のパッケージングオプション。外部設定を保持する環境変数、関数間で共通ライブラリを共有するレイヤー、モニタリングやシークレット管理のためにハンドラーと並行して実行されるエクステンション

AWS へのアプリケーションデプロイ

Lambda を VPC に接続する

プライベートサブネット内の ENI を介してプライベート VPC に接続された Lambda。セキュリティグループがアウトバウンドアクセスを制御し、NAT ゲートウェイがインターネット接続を提供している

  • 内部リソースへのアクセスには プライベートサブネット に Lambda をアタッチします
  • Lambda は VPC 内に ENI を作成します
  • セキュリティグループ でアクセス先を制御します
  • 外部アクセスには NAT または VPC エンドポイントが必要です
AWS へのアプリケーションデプロイ

Destinations と DLQ による失敗処理

  • 非同期呼び出しは失敗時に 自動的に再試行 されます
  • Lambda Destinations:onSuccess と onFailure でルーティング
  • デッドレタキュー:最終的に失敗したイベントを捕捉
  • 失敗したイベントを無視しないようにしましょう

Lambda の非同期失敗処理。再試行ループから Lambda Destinations の onSuccess・onFailure の分岐へ続き、再試行を使い切ったイベントをデッドレタキューが捕捉する

AWS へのアプリケーションデプロイ

練習しましょう!

AWS へのアプリケーションデプロイ

Preparing Video For Download...