API Gateway(REST API)とLambda(Python)でBOM付きUTF8なCSVをレスポンスする方法

API Gateway(REST API)とLambda(Python)の構成で、LambdaでBOM付きUTF8のCSVを作成して、API Gateway経由でCSVをレスポンスする方法を記載します。

BOM付きUTF8とすることで外字が文字化けしないCSVをAPI Gateway経由でダウンロードできます。

やること

AWSの構成はAPI GatewayとLambda
使用する言語はPython
外字が文字化けしないCSVをダンロードできるようにする
→BOM付きUTF8とすることで文字化け対策ができます。

スポンサーリンク

Lambdaの作成

以下のソースコードでLambdaを作成します。



def lambda_handler(event, context):
    body_str = """column1,column2
"㐂","昱"
"""
    return {
        'statusCode': 200,
        'isBase64Encoded': True,
        'headers': {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials': True,
            'Content-Type': "application/vnd.ms-excel",
            'Content-disposition': "attachment; filename=hoge.csv" # CSVファイル名を指定
        },
        'body': f'\ufeff{body_str}' # BOMを設定
    }

「body_str」がレスポンスするCSVの中身になりますので適宜調整します。

次はAPI Gatewayです

API Gatewayの設定

REST APIを新規作成します。特に気にする設定項目はないので、とにかくREST APIを作成です。

次にメソッドを追加します。このとき、以下の画面のように「Lambda プロキシ統合の使用」にチェックを入れておきます。

API-Gatewayメソッド追加

API-Gatewayメソッド追加

Lambda プロキシ統合の使用」にチェックを入れないと、Lambdaで返却したJSONがそのままレスポンスボディとして返却され、CSVではなく、ヘッダ情報を含んだJSONがレスポンスされてしまう現象にハマります。

最後にAPIをデプロイします。

動作確認

API GatewayのステージからURLを確認し、ブラウザでアクセスします。

この時、メソッドやパスは、作成したAPI Gatewayに沿ったものを設定する必要があります。

URLにアクセスするとCSVダウンロードができ、文字化けもしていないかと思います。

まとめ

API Gateway(REST API)とLambda(Python)の構成で、CSVダウンロードできました!

Lambdaにはリクエストとレスポンスの上限サイズとして、それぞれ 6 MBが上限という制限があります。6MB以上のCSVはLambdaではレスポンスできないということです。

大きいCSVファイルを扱うには、LambdaでCSVを作成して、S3に保存して、ユーザーにはS3のデータをダウンロードしてもらった方が良さそうですね。