概要
Google Cloud PlatformでCloud StorageにCSVファイルがアップロードされたらCloud SQL上のテーブルにインポートされるようにしたいと思い、Cloud Functionsで関数を作成してみました。
その際に個人的に苦戦した箇所のメモです。
なお、今回 Cloud SQL は MySQL8.0, Cloud Functions は Python3.7を使用しました。
ソース
main.py
def importDs(self, request):
from pprint import pprint
import googleapiclient.discovery
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
service = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials, cache_discovery=False)
project = 'プロジェクト名'
instance = 'Cloud SQLのインスタンス名'
instances_import_request_body = {
"importContext": {
"uri": "gs://バケット名/フォルダパス/CSVファイル名.csv",
"database": 'データベース名',
"kind": "sql#importContext",
"fileType": "CSV",
"csvImportOptions": {
"table": "users",
"columns": [
"カラム名1",
"カラム名2"
]
}
}
}
request = service.instances().import_(project=project, instance=instance, body=instances_import_request_body)
response = request.execute()
pprint(response)
苦戦した箇所
引数の設定
修正後
def importDs(self, request):
修正前
def importDs(request):
修正前のような形で書いていたらTypeErrorが発生したので、下記記事を参考に引数を追加しました。
buildの引数
ImportErrorが発生したため、下記記事を参考に引数に「cache_discovery=False」を追加しました。
service = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials, cache_discovery=False)
権限の設定
実行時にパーミッションエラーが出たため、下記記事を参考に権限付与しました。
参考
Cloud Functionsのソース作成及びトラブルシューティング時に、下記のページを参照しました。