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秒までのようです。