2010年くらいに作ったGoogle App Engine/Python2.7のアプリ(当初は2.5)で結構強引にCSV生成していたのですが、 改修するタイミングでCloud Functionを使えないかと試してみました。
DataStoreからデータを取得します。
def download(request):
import csv
from io import StringIO
from google.cloud import datastore
from flask import make_response
# request
category_id = request.values.get('category_id')
filename = 'data.csv'
if category_id:
filename = 'data_{}.csv'.format(category_id)
# DataStoreからデータ取得
datastore_client = datastore.Client()
kind = 'Kind' # DataStoreのkind名を指定
query = datastore_client.query(kind=kind)
if category_id:
# フィルタ追加
query.add_filter('category_id', '=', category_id)
header = ['id', 'content'] # タイトル行を指定
rows = [header]
rows += [[entity['id'], entity['content']] for entity in query.fetch()]
# CSV作成
memory_file = StringIO()
writer = csv.writer(memory_file)
writer.writerows(rows)
# Flaskのresponse作成して返す
encoding = 'cp932'
response = make_response()
response.data = memory_file.getvalue().encode(encoding=encoding)
response.headers['Content-Type'] = 'application/octet-stream'
response.headers['Content-Disposition'] = u'attachment; filename={}'.format(filename)
return response
10,000件程度のデータ数ならタイムアウトをのばしてあげれば出力できました。 タイムアウトは最大540秒までのようです。