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)
コンテンツ紹介
この記事が気に入ったらサポートをしてみませんか?