背景
AWSを使用している開発者にとって、S3のイベント通知を処理するLambda関数は一般的なユースケースです。
しかし、オブジェクトキーに半角スペースが含まれている場合、S3はこれをプラス記号にエンコードして通知を送信します。
このエンコードにより、Lambda関数にはエンコード後のオブジェクトキー名が渡され、開発者が予期しない問題に直面する可能性があります。
例えば、S3のイベント通知で起動するLambda関数で、イベントデータからオブジェクトキーを取得し、何らかの処理をするとします。
Lambdaにはエンコード後のキー名が渡されるので、開発者はオブジェクトキーを適切に処理することができず、期待しない動作が発生する可能性があります。
(S3から当該キーのダウンロードに失敗する、など)
解決策
この問題を解決するためには、オブジェクトキーをLambda関数内で適切にデコードする必要があります。
Pythonの場合、urllib.parse.unquote_plus関数を使用して、エンコードされたオブジェクトキーをデコードすることができます。
このメソッドを使用することで、プラス記号が半角スペースに変換されます。
以下は、解決策の実装例です。
lamder_handler.py
import urllib.parse
def lambda_handler(event, context):
# オブジェクトキーを取得
object_key = event['Records'][0]['s3']['object']['key']
# URLエンコードされたオブジェクトキーをデコード
decoded_object_key = urllib.parse.unquote_plus(object_key)
print(decoded_object_key)
# ここに他の処理を追加する
return {
'statusCode': 200,
'body': decoded_object_key
}
参考資料