見出し画像

AWSLambda関数のエントリーポイントの定義を学ぶ。

  • この記事は一部プロモーションを含みます

lambda_handler関数が呼び出されると、Lambda の処理が開始されます。lambda_handler関数の中では event や context という引数が利用され、これにより様々なリクエストデータや実行環境情報を扱うことができます。
※関数名は自由に定義することができます。今回は、関数「lambda_handler」として解説します。

それぞれの要素を詳しく見ていきましょう。

1. lambda_handler 関数

def lambda_handler(event, context):
    # 処理内容

lambda_handlerは、Lambda 関数を定義するための関数です。AWS Lambda がリクエストを受け取ると、自動的にこの関数が実行されます。この中で、リクエストの処理や外部サービスとのやりとりなどを行います。


2. event 引数

event は、Lambda 関数がトリガーされた際に入力として渡されるデータです。このデータはトリガーの種類によって異なり、例えば以下のようなものが含まれます。

  • API Gateway の場合
    HTTPリクエストの内容(メソッド、ヘッダー、パラメータ、ボディなど)が event に含まれます。

  • S3トリガーの場合
    S3バケット内のオブジェクトの変更(作成や削除)の情報が event に渡されます。

  • DynamoDBのストリームの場合
    テーブルの変更履歴が event に含まれます。

event の例(API Gatewayからの呼び出し)

{
  "resource": "/myresource",
  "path": "/myresource",
  "httpMethod": "GET",
  "headers": {
    "header1": "value1"
  },
  "queryStringParameters": {
    "parameter1": "value1"
  },
  "body": "request body"
}

この場合、API Gatewayからのリクエストのメソッドやクエリパラメータ、ボディなどの情報が event オブジェクトとして渡されます。

event の例(S3からの呼び出し)

S3のファイル作成や削除によりLambdaがトリガーされた場合、event にはS3のバケットやオブジェクトに関する情報が含まれます。

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-west-2",
      "eventTime": "2020-09-15T12:34:56.789Z",
      "s3": {
        "bucket": {
          "name": "my-bucket-name"
        },
        "object": {
          "key": "my-object-key.txt"
        }
      }
    }
  ]
}

ここでは、ファイルが保存されたバケット名やオブジェクトのキーが event に含まれ、ファイルの処理や解析などを行うことができます。

event の例(DynamoDBのストリームからの呼び出し)

{
  "Records": [
    {
      "eventID": "1",
      "eventName": "INSERT",
      "eventVersion": "1.1",
      "eventSource": "aws:dynamodb",
      "awsRegion": "us-west-2",
      "dynamodb": {
        "Keys": {
          "Id": {
            "S": "101"
          }
        },
        "NewImage": {
          "Id": {
            "S": "101"
          },
          "Name": {
            "S": "John Doe"
          },
          "Age": {
            "N": "29"
          }
        },
        "SequenceNumber": "111",
        "SizeBytes": 26,
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "eventSourceARN": "arn:aws:dynamodb:us-west-2:123456789012:table/ExampleTable/stream/2020-01-01T00:00:00.000"
    },
    {
      "eventID": "2",
      "eventName": "MODIFY",
      "eventVersion": "1.1",
      "eventSource": "aws:dynamodb",
      "awsRegion": "us-west-2",
      "dynamodb": {
        "Keys": {
          "Id": {
            "S": "102"
          }
        },
        "OldImage": {
          "Id": {
            "S": "102"
          },
          "Name": {
            "S": "Jane Doe"
          },
          "Age": {
            "N": "25"
          }
        },
        "NewImage": {
          "Id": {
            "S": "102"
          },
          "Name": {
            "S": "Jane Doe"
          },
          "Age": {
            "N": "26"
          }
        },
        "SequenceNumber": "222",
        "SizeBytes": 59,
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "eventSourceARN": "arn:aws:dynamodb:us-west-2:123456789012:table/ExampleTable/stream/2020-01-01T00:00:00.000"
    }
  ]
}
  • Records: 配列形式で、DynamoDBテーブルの変更ごとに1つのレコードが含まれます。1つのイベントで複数のレコードを処理する場合があります。

  • eventID: それぞれのストリームイベントの一意のIDです。

  • eventName: テーブルに対する変更の種類を示します。以下のような値が入ります:

    • INSERT: 項目が新しく作成された場合

    • MODIFY: 項目が更新された場合

    • REMOVE: 項目が削除された場合

  • dynamodb: DynamoDBの変更に関する詳細情報が含まれています。

    • Keys: テーブルの主キーの情報を含みます。この例では Id が主キーです。

    • NewImage: INSERT または MODIFY イベント時に、変更後の項目の全ての属性が含まれます。

    • OldImage: MODIFY または REMOVE イベント時に、変更前または削除前の項目の全ての属性が含まれます。

    • StreamViewType: ストリームにどのデータが含まれているかを示します。この例では NEW_AND_OLD_IMAGES が指定されており、項目の新旧両方のデータが含まれています。

  • awsRegion: DynamoDBテーブルが属するリージョンです。

  • eventSourceARN: DynamoDBストリームのARN(Amazon Resource Name)です。



3. context 引数

context には、Lambda 関数の実行環境に関する情報が含まれます。
例えば、実行時間やメモリ使用量、ログストリームの情報などが参照できます。これを利用して、Lambda 関数の実行に関するメタデータを処理することができます。

context の主な属性

  • context.function_name: Lambda 関数の名前

  • context.memory_limit_in_mb: Lambda 関数に割り当てられたメモリ量(MB単位)

  • context.log_group_name: ロググループの名前

  • context.log_stream_name: ログストリームの名前

  • context.aws_request_id: リクエストごとに生成される一意のID

  • context.get_remaining_time_in_millis(): 残りの実行時間(ミリ秒単位)

context の例

def lambda_handler(event, context):
    print("Function name:", context.function_name)
    print("Memory limit (MB):", context.memory_limit_in_mb)
    print("Log group name:", context.log_group_name)
    print("Log stream name:", context.log_stream_name)
    print("AWS request ID:", context.aws_request_id)
    print("Remaining time (ms):", context.get_remaining_time_in_millis())


4. 実際の処理内容

lambda_handler 関数では、上記の event や context の情報を使って処理を行い、結果を返します。

以下の例は、API Gateway からリクエストを受け取り、そのリクエストボディをログに出力し、レスポンスを返すシンプルなLambda関数です。

例: API Gatewayからのリクエストに対するレスポンス

def lambda_handler(event, context):
    # リクエストの内容をログに出力
    print("Received event:", event)
    
    # レスポンスを作成
    response = {
        "statusCode": 200,
        "body": "Hello from Lambda!"
    }
    
    return response

この例では、event オブジェクトに含まれるデータをログに出力し、その後に「Hello from Lambda!」というメッセージを含んだレスポンスを返しています。


まとめ

lambda_handler(event, context) は、AWS Lambda関数の中核となる部分で、event には外部からの入力データ、context には実行環境に関する情報が含まれます。
これらを適切に使いこなすことで、様々なトリガーに対応した柔軟な処理を実現できます。


おまけ

AWS S3 からデータを取得するためのシンプルな Lambda 関数のコード例

import json
import boto3
import logging

# ログ出力の設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# S3クライアントの初期化
s3_client = boto3.client('s3')

def lambda_handler(event, context):
    try:
        # イベントからバケット名とオブジェクトキーを取得
        bucket_name = event['Records'][0]['s3']['bucket']['name']
        object_key = event['Records'][0]['s3']['object']['key']
        
        # S3からオブジェクトを取得
        response = s3_client.get_object(Bucket=bucket_name, Key=object_key)
        
        # オブジェクトの内容を取得
        data = response['Body'].read().decode('utf-8')
        
        # オブジェクトの内容をログに出力
        logger.info(f'バケット: {bucket_name} からオブジェクト: {object_key} の内容: {data}')
        
        return {
            'statusCode': 200,
            'body': json.dumps('S3からファイルを正常に取得しました')
        }
    except Exception as e:
        logger.error(f'バケット {bucket_name} からオブジェクト {object_key} を取得中にエラーが発生しました。エラー内容: {str(e)}')
        
        return {
            'statusCode': 500,
            'body': json.dumps(f'エラーが発生しました: {str(e)}')
        }


API GatewayからトリガーされるシンプルなLambda関数のコード例

API Gatewayを介してHTTPリクエストを受け取り、レスポンスとしてメッセージを返す。

import json

def lambda_handler(event, context):
    # 受け取ったHTTPメソッドやパスをログに出力
    http_method = event['httpMethod']
    path = event['path']
    
    # 受け取ったクエリパラメータをログに出力(オプション)
    query_params = event.get('queryStringParameters', {})
    
    print(f"受け取ったHTTPメソッド: {http_method}")
    print(f"リクエストパス: {path}")
    print(f"クエリパラメータ: {query_params}")
    
    # レスポンスを作成
    response = {
        'statusCode': 200,
        'body': json.dumps({
            'message': 'Lambdaからのメッセージ: こんにちは!',
            'method': http_method,
            'path': path,
            'queryParams': query_params
        }),
        'headers': {
            'Content-Type': 'application/json'
        }
    }
    
    return response


DynamoDBと連携したシンプルなLambda関数のコード例

DynamoDBのテーブルにデータを保存し、保存完了後に結果を返す。

import json
import boto3
import logging

# DynamoDBクライアントを初期化
dynamodb = boto3.resource('dynamodb')
table_name = 'dynamodb-table'  # 使用するDynamoDBテーブルの名前
table = dynamodb.Table(table_name)

# ログ出力の設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    # リクエストボディからデータを取得
    try:
        body = json.loads(event['body'])  # リクエストボディをJSONとして解析
        item_id = body['id']              # 保存するデータのID
        item_name = body['name']          # 保存するデータの名前

        # DynamoDBにデータを保存
        table.put_item(
            Item={
                'id': item_id,
                'name': item_name
            }
        )

        # 成功した場合のレスポンス
        return {
            'statusCode': 200,
            'body': json.dumps({
                'message': 'データが正常に保存されました',
                'item': {
                    'id': item_id,
                    'name': item_name
                }
            }),
            'headers': {
                'Content-Type': 'application/json'
            }
        }

    except Exception as e:
        logger.error(f"データ保存中にエラーが発生しました: {str(e)}")

        # エラーが発生した場合のレスポンス
        return {
            'statusCode': 500,
            'body': json.dumps({
                'message': 'データ保存中にエラーが発生しました',
                'error': str(e)
            }),
            'headers': {
                'Content-Type': 'application/json'
            }
        }


AWSの理解を深めるためのおすすめ本(PR)


コンテンツ紹介


この記事が気に入ったらサポートをしてみませんか?