Lambda 関数の設定

AWS Lambda によるサーバーレスアプリケーション

Claudio Canales

Senior DevOps Engineer

設定が重要な理由

  • 同じコードでも、設定が異なると動作が大きく変わります。
  • 設定はパフォーマンス、コスト、安全性を左右します。
  • 開発環境と本番環境で一貫した動作を目指しましょう。

同じコード、異なる設定

AWS Lambda によるサーバーレスアプリケーション

コードと設定の違い

コードパッケージ

  • コードパッケージ
  • ハンドラーロジックと依存関係。
  • 変更にはデプロイが必要です。

関数の設定

  • 関数の設定
  • メモリ、タイムアウト、環境変数。
  • 実行ロールとレイヤー。
AWS Lambda によるサーバーレスアプリケーション

設定できる項目

  • ランタイム+ハンドラー:Lambda が実行するコードを指定します。
  • メモリ+タイムアウト:パフォーマンス、コスト、安全性に影響します。
  • 環境変数:コードを変更せずに設定を管理できます。
  • 実行ロール:AWS API へのアクセス権限を制御します。
  • レイヤー:複数の関数で依存関係を共有できます。

Lambda 設定のコントロール

AWS Lambda によるサーバーレスアプリケーション

ランタイムとハンドラーの基本

  • ランタイム=言語環境(例:Python)。
  • ハンドラー=Lambda が呼び出すエントリーポイント。
  • ハンドラーの形式:file.function
  • 例:lambda_function.lambda_handler

ハンドラー文字列の構成

AWS Lambda によるサーバーレスアプリケーション

ハンドラー文字列でよくある問題

# lambda_function.py
def lambda_handler(event, context):
    return {"statusCode": 200}

インポートからハンドラー呼び出しの流れ

AWS Lambda によるサーバーレスアプリケーション

実行ロール(IAM)

  • IAM=Identity and Access Management(権限管理)。
  • 実行ロールは、関数が実行できる操作を定義します。
  • どの AWS API をコードから呼び出せるかを制御します。

キーカードとしての実行ロール

AWS Lambda によるサーバーレスアプリケーション

Lambda レイヤーとは

  • レイヤーは関数にアタッチする ZIP ファイルです。
  • Lambda は実行時にレイヤーのファイルを /opt に配置します。
  • 共有ライブラリや共通ユーティリティにレイヤーを活用しましょう。
  • レイヤーを一度更新すれば、複数の関数で再利用できます。

/opt にマウントされるレイヤー

AWS Lambda によるサーバーレスアプリケーション

実行時のレイヤーの配置場所

  • 関数コードは /var/task にマウントされます。
  • アタッチしたレイヤーは /opt にマウントされます。
  • Lambda は一時フォルダーとして /tmp も提供します。

ランタイムフォルダー:/var/task、/opt、/tmp

AWS Lambda によるサーバーレスアプリケーション

メモリが CPU にも影響する理由

  • メモリを増やすと CPU も増加します。
  • CPU バウンドなタスクの実行時間を短縮できます。
  • 総コストは実行時間とメモリの両方に依存します。

メモリが CPU に与える影響

AWS Lambda によるサーバーレスアプリケーション

計測によるメモリのチューニング

  • 適切なデフォルト値から始めましょう(例:256 MB)。
  • 実際のイベントを使ってテストします。
  • メモリサイズごとに実行時間とコストを比較しましょう。

メモリスイープ:実行時間とコストの計測

AWS Lambda によるサーバーレスアプリケーション

タイムアウトと安全な実行

  • タイムアウトは実行の暴走を防ぎます。
  • 長い処理の前に残り時間を確認しましょう。
  • 適切な場面では早期に失敗してリトライします。

安全タイマーとしてのタイムアウト

AWS Lambda によるサーバーレスアプリケーション

ウォークスルー:残り時間の確認

def lambda_handler(event, context):
    time_left = context.get_remaining_time_in_millis()
    if time_left < 500:
        raise TimeoutError("Not enough time left")
    return {"statusCode": 200}

コンテキストによる残り時間のガード

AWS Lambda によるサーバーレスアプリケーション

環境変数

  • 設定値はコードに直接書かないようにしましょう。
  • 開発・テスト・本番の設定を分離します。
  • 機密情報には Secrets Manager を使用しましょう。

環境変数による動作の設定

AWS Lambda によるサーバーレスアプリケーション

ウォークスルー:環境変数の読み取り

import os

STAGE = os.getenv("STAGE", "dev")
LOG_LEVEL = os.getenv(
    "LOG_LEVEL", "INFO"
)

デフォルト値でローカルテストを安全に

  • 環境変数にアクセスするには os をインポートします。
  • os.getenv は値またはデフォルト値を返します。
AWS Lambda によるサーバーレスアプリケーション

設定でよくある失敗

  • ステージの値をコードにハードコーディングしている。
  • タイムアウトが短すぎる、または IAM 権限が不足している。
  • 機密情報を通常の環境変数に平文で保存している。

よくある落とし穴と注意点

AWS Lambda によるサーバーレスアプリケーション

練習しましょう!

AWS Lambda によるサーバーレスアプリケーション

Preparing Video For Download...