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 プロキシ統合の使用」にチェックを入れておきます。
「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のデータをダウンロードしてもらった方が良さそうですね。