[小ネタ] 日本語のS3オブジェクトをLambdaのトリガーに設定してみた

2020.11.24

こんにちは、コンサルティング部の後藤です。

表題通り、Lambdaのトリガーでフォルダ名が日本語のS3オブジェクトを指定するやり方をご紹介します。

S3オブジェクトについて

今回は検証のため、S3バケットにアルファベット表記の「test」と日本語表記の「テスト」のフォルダを用意しました。

Lambdaについて

オブジェクト作成後、「バケット名」と「オブジェクト名」を出力するLambdaを使用します。

import json

def lambda_handler(event, context):
    # TODO implement
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    print(bucket+'バケットに'+key+'が作成されました')

アルファベット表記のフォルダを設定してみる

まずアルファベット表記の「test」をトリガーとして設定します。

トリガーが設定されたら、S3「test/」に「test-object.txt」をアップロードします。

すると、想定通りLambdaはオブジェクト作成をトリガーに起動して、CloudWatchLogsにLambdaの実行結果が出力されました。

日本語表記のフォルダを設定してみる

次に日本語表記のフォルダ「テスト/」をトリガーとして同様に設定してみます。

先程と同様に、「test-object.txt」をアップロードしてみますが、Lambdaは起動せず、CloudWatchLogsにも出力が確認できませんでした。

オブジェクトURLを確認してみる

S3にアップロードした「テスト/test-object.txt」のオブジェクトURLを確認してみます。 すると、以下の通りに記載されておりました。

https://s3-074547258653.s3-ap-northeast-1.amazonaws.com/%E3%83%86%E3%82%B9%E3%83%88/test-object.txt

日本語表記の部分がUTF-8にエンコードされている事がわかると思います。

UTF-8に変換して設定してみる

先程「テスト/」で設定したLambdaのトリガーをUTF-8にエンコードした「%E3%83%86%E3%82%B9%E3%83%88/」で設定し、再度オブジェクトをアップロードしてみます。

すると、CloudWatchLogsにLambda実行結果が出力されていることが確認出来ました。

最後に

以上、S3の日本語フォルダ名をLambdaのトリガーとして扱うやり方でした。
S3ドキュメントにも記載がある通り、S3のオブジェクトキーはUTF-8を使用しております。またセーフ文字として数字、アルファベット、一部特殊文字と記載がありますので、詳細が気になる方は確認してみてください。

この記事が何方かのお役に立てば幸いです。