Lambda の実行モデルを理解する

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

Claudio Canales

Senior DevOps Engineer

自動実行

イベント駆動型 AWS

  • Lambda はイベント発生時にコードを実行します。
  • 例:S3 アップロード → 画像のリサイズ。
  • トリガーが異なっても、パターンは同じです。
AWS Lambda によるサーバーレスアプリケーション

トリガーされるまで待機

待機 → イベント → 実行 → 停止

  • 待機中:何も実行されません。
  • イベント発生:ハンドラーが実行され、その後停止します。

Lambda の人感センサーライトの例え

  • 人感センサーライトと同様に、トリガーされるまで待機します。
  • トリガーにより「オフ」から「オン」に切り替わります。
AWS Lambda によるサーバーレスアプリケーション

AWS Lambda とは?

AWS Lambda の概要

  • イベント駆動型のコンピューティングサービスです。
  • 需要に応じて自動的にスケールします。
  • 実行時間分のみ課金されます。
AWS Lambda によるサーバーレスアプリケーション

Lambda がコードを実行する仕組み

Lambda の実行フロー

  • イベントソースが Lambda をトリガーします。
  • Lambda はイベントペイロードをハンドラーに渡します。
  • ハンドラーが結果を返します。
AWS Lambda によるサーバーレスアプリケーション

需要に応じたスケーリング

スケーリングによる実行環境の増加

  • イベントが増えると、並列実行数も増加します。
  • Lambda はさらに多くの実行環境を起動します。
  • 新しい環境ごとにコールドスタートが発生することがあります。
AWS Lambda によるサーバーレスアプリケーション

ハンドラー関数

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event:入力ペイロード(JSON)。
  • context:ランタイムのメタデータ。
  • return:出力(または成功/失敗)。

ハンドラーがイベントとコンテキストを受け取る

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

イベントオブジェクト

オブジェクトストレージのイベントペイロード

S3 イベント:バケット+オブジェクトキー。

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • やることは同じ:必要な値を取り出します。

HTTP リクエストのイベントペイロード

API イベント:メソッド、パス、ボディ。

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • トリガーが異なれば、JSON の内容も異なります。
AWS Lambda によるサーバーレスアプリケーション

コンテキストオブジェクト

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis:タイムアウトまでの残り時間。
  • aws_request_id:ログ追跡用のリクエスト ID。
AWS Lambda によるサーバーレスアプリケーション

ステートレスな実行

ウォームスタートの再利用とリセット

  • 各呼び出しは独立しています。
  • 環境の再利用は可能ですが、保証されません。
  • 状態は Lambda の外部に保存してください。
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # may reset
    return counter
AWS Lambda によるサーバーレスアプリケーション

コールドスタート

コールドスタートのタイムライン

  • 新しい実行環境が作成されます。
  • コードと依存関係を読み込みます。
  • 初期化を実行してからハンドラーを起動します。
AWS Lambda によるサーバーレスアプリケーション

ウォームスタート

ウォームスタートのタイムライン

  • 既存の環境を再利用します。
  • 初期化の大部分をスキップします。
  • ハンドラーがより早く実行されます。
AWS Lambda によるサーバーレスアプリケーション

初期化、呼び出し、フリーズ

実行環境のライフサイクル

  • 初期化は環境ごとに1回だけ実行されます。
  • ハンドラーは呼び出しごとに実行されます。
  • 実行と実行の間、環境はフリーズすることがあります。
AWS Lambda によるサーバーレスアプリケーション

コールドスタートの最適化

# init (once per env)
import boto3
s3 = boto3.client('s3')
# handler (every invocation)
def lambda_handler(event, context):
    return {"statusCode": 200}

初期化は1回、ハンドラーは呼び出しごと

  • インポートと SDK クライアントはハンドラーの外側に記述してください。
AWS Lambda によるサーバーレスアプリケーション

練習しましょう!

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

Preparing Video For Download...