構成

GCSのアップロードをトリガにGCFでファイル変換を行う手順.

アップロードはzipファイルにしたいけど、ストレージ上にはzipを解凍しておきたい、と思った時に色々つまずいたので、備忘録がてらメモしておきます.

  1. GCFのトリガーをCloud Storageに設定.イベントタイプはファイナライズ/作成
  2. トリガー対象のバケットを設定
  3. CloudFunctionに以下のコードを書く
    requirements.txt
    1
    google-cloud-storage
    main.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from google.cloud import storage
    import glob
    import os
    import zipfile
    import shutil
    def Unzipper(event,context):
    try:
    #Download
    bucket_name = event['bucket']
    filename = event['name']
    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(filename)
    blob.download_to_filename('/tmp/'+filename)

    #Unzip
    direc='/tmp/'+filename[:filename.find('.')]
    z = zipfile.ZipFile('/tmp/'+filename)
    z.extractall('/tmp/')

    #Upload
    files=glob.glob(direc+'/*')
    for f in files:
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(os.path.basename(f))
    blob.upload_from_filename(f)
    os.remove(f)
    os.remove('/tmp/'+filename)
    shutil.rmtree(direc+'/')
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(event['name'])
    blob.delete()
    except Exception as e:
    print(e)
  4. サービスアカウントをCloudFunctionの設定Storageをいじれるアカウントに設定

所感

cloud functionはファイル保存が/tmp以下にしかできないらしく、保存できない理由が認証関係のエラーと勘違いして、半日ぐらいつまづいてましたorz

実際のサービスでは、ユーザは複数ファイルでアップロード可能だけど、ストレージ上では一種類のファイルで管理したいときとかにも使えそう.