Python API Gateway からCSVダウンロードする

Python Lambda で作ったカンマ区切り文字列を API Gateway 経由で CSVダウンロードする

API Gateway から Python ( Lambda ) で作成した カンマ文字列を CSV形式でダウンロードできるようにする方法です

Lambda 側で headersを指定して返せば どんなフォーマットでも返すことは可能です

CSVファイルを返す場合 ヘッダーは Content-TypeContent-disposition を使います

Python ( Lambda )コード例 ↓

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

body_strという変数に、 カンマ区切り文字列を代入し

その値をCSVファイルとして ダウンロードできるように返しています

文字列の先頭に \ufeff を入れるのは、 BOMです

API Gateway のURLにアクセスすると、下のようにCSVファイル形式でダウンロードできました

body_str に代入したカンマ区切りの文字列

Python AWS Lambda ModuleのPath指定

AWS Lambda PYTHONPATH

AWS LambdaPythonを動かす場合”PYTHONPATH“は「/var/runtime」になっているようで
下記コードを実行すると確認できます

import json
import os
def lambda_handler(event, context):
    PYTHONPATH = os.getenv('PYTHONPATH', '')
    print(PYTHONPATH)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

下記のコードを使ってsys.pathを確認すると

import json
import os
import sys
def lambda_handler(event, context):
    PYTHONPATH = sys.path
    print(PYTHONPATH)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

[‘/var/task’, ‘/opt/python/lib/python3.8/site-packages’, ‘/opt/python’, ‘/var/runtime’, ‘/var/lang/lib/python38.zip’, ‘/var/lang/lib/python3.8’, ‘/var/lang/lib/python3.8/lib-dynload’, ‘/var/lang/lib/python3.8/site-packages’, ‘/opt/python/lib/python3.8/site-packages’, ‘/opt/python’]配列で入っています

Lambdaの環境変数設定にPYTHONPATHを追加した

Lambdaの環境変数設定にPYTHONPATHを追加
Lambdaの環境変数設定にPYTHONPATHを追加

Lambdaを実行すると環境変数が予想通り設定できているように思うが違うようにも思える

['/var/task', '/var/runtime', '/var/task/lib', '/var/runtime', '/var/lang/lib/python38.zip', '/var/lang/lib/python3.8', '/var/lang/lib/python3.8/lib-dynload', '/var/lang/lib/python3.8/site-packages']

環境変数でのPYTHONPATH追加は大丈夫なのか?よくわからないのでPythonのコードに追加して確かめる

import json
import os
import sys
def lambda_handler(event, context):
    sys.path.append(os.path.join(os.path.dirname(__file__), 'lib2'))
    print(PYTHONPATH)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

lib2を追加した下記のようにlib2も追加されていた

[
	'/var/task', '/var/runtime', '/var/task/lib', '/var/runtime', '/var/lang/lib/python38.zip',
    '/var/lang/lib/python3.8', '/var/lang/lib/python3.8/lib-dynload',
    '/var/lang/lib/python3.8/site-packages', '/var/task/lib2'
]

PYTHONPATHとsys.pathがイコールなのかわからないけど同じようにも見える

結果:思ったことは、Lambda環境設定のPYTHONPATHに追加すればいい感じにしてくれるのかもしれない

pip3 インストール ターゲットpath指定

AWS Lambda Function内のlibにpip3インストールしたライブラリを入れたい場合下記のコマンドで可能です

pip3 install --target ./lib インストールしたいモジュール名

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED