メインコンテンツまでスキップ

その他各種推奨実装パターン

アプリケーションタイプに関らず、AWS Lambda 上での稼働を鑑みた推奨実装パターンを紹介します。

AWS SDKを利用する場合の推奨構成

aws ディレクトリに、AWS SDK (boto3) のラッパークラスを実装して配置し、モジュールとして利用します。

メリットは以下のようになります。

  • 再利用性向上
    • サーバーレスでは特にAWSサービスの呼出しが多い
  • テスト便宜性・保守性向上
    • Mock 化のしやすさ
    • AWS SDK のバージョンアップや仕様変更による影響範囲を最小化
  • コード可読性向上

AWS SDK のみならず、外部API呼び出しやライブラリを利用する際は、同様な構成にすることで上記のメリットを享受できます。

ラッパークラスの例

例えば、以下は S3 にアクセスする部分のラッパークラスの実装例です。

import boto3, os

AWS_DEFAULT_REGION = os.getenv('AWS_DEFAULT_REGION', 'ap-northeast-1')

class S3Client:

def __init__(self):
self.s3_client = boto3.client(
service_name='s3',
region_name=AWS_DEFAULT_REGION,
endpoint_url=os.getenv('S3_ENDPOINT_URL')
)

def get_object_as_string(self, **kwargs):
bucket = kwargs['bucket']
key = kwargs['key']

response = self.s3_client.get_object(Bucket=bucket, Key=key)
utf8_decoded_string = response['Body'].read().decode('utf-8')
return utf8_decoded_string

def upload(self, **kwargs):
file_path = kwargs['file_path']
bucket = kwargs['bucket']
key = kwargs['key']

self.s3_client.upload_file(file_path, bucket, key)

def download(self, **kwargs):
file_path = kwargs['file_path']
bucket = kwargs['bucket']
key = kwargs['key']

self.s3_client.download_file(bucket, key, file_path)

Logger

本カタログで推奨する JSON 構造化ログを出力するために、Powertools for AWS Lambda (Python) の Logger を利用したログ出力方法を説明します。

使い方

以下のようにインスタンス化して利用します。ニーズに項目の増減を行うこともでき、Lambda エントリーポイントの開始時点または logger クラスを別途定義し、初期化と設定(contextの反映)を行うようにしてください。

  • src/sample_api/index.py
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST, clear_state=True)
def lambda_handler(event, context):

# Logger のカスタマイズやキーの追加については以下をご参照ください。
# 別途 Logger ラッパークラスを作成した上で各種設定を行うことでカスタマイズ利用もできます。
# https://docs.powertools.aws.dev/lambda/python/latest/core/logger/#append_keys-method
additional_log_attributes = {
"process": "%(process)d",
"processName": "%(processName)s"
}
# 任意の項目を追加
logger.append_keys(**additional_log_attributes)
# 任意の項目を削除
logger.remove_keys(["processName"])

return app.resolve(event, context)

デフォルトでは、以下のようなログが出力されます。

{
"level": "INFO",
"location": "create_news:19",
"message": "Created new news record - {'news_type': 'sports', 'title': 'sample_news_title', 'content': 'sample_news_conten'}",
"timestamp": "2025-04-20 01:51:45,781+0000",
"service": "service_undefined",
"cold_start": true,
"function_name": "tester-function",
"function_memory_size": 256,
"function_arn": "invoked_function_arn",
"function_request_id": "aws_request_id"
}

CloudWatch Logs でのログ検索

上記のフォーマットを元に、CloudWatch Logs では以下のようにログ検索を行うことができます。

# ログレベルを指定して検索
{ $.level = "ERROR" }

# Request ID を指定して検索
{ $.requestId = “xxx” }

CloudWatch Logs で検索すると、以下のような結果になります。