GCPのストレージサービス、GoogleCloudStrage上にあるCSVデータをCloudSQLへインポートするにはGoogleが提供しているAPIを使うと便利です。
https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/import?hl=ja
以下、Pythonを使ったインポート処理。
# APIのインスタンス取得
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials)
project = 'my-project'
instance = 'cloudsql_instance'
instances_export_request_body = {
"importContext": {
"kind": "sql#importContext",
"fileType": "CSV",
"uri": "path-to-strage",
"database":"database",
"importUser": "hogehoge",
"csvImportOptions": {
"table": "users",
"columns": [
"name", "tel", "fax", "email"
]
}
}
}
# 実行
request = service.instances().export(project=project, instance=instance, body=instances_export_request_body)
response = request.execute()
仕組みはシンプルで、用意されたプロパティに必要な値を定義していきます。
上の例では、テーブル「users」にある、カラム「name,tel,fax,email」をCloudSQLにインポートできます。
処理中はリクエストを受け付けない
ただし、インポート処理が終わりきらずにもう一度同じAPIを実行するとリクエストを受け付けてくれません。
エラーログを残してないのですが、task is busy
のような返答で、ストックとかもされず拒否されます。データ量が多いと待たないといけない時間が長くなります。
対策としては自前でタスク管理するか、TaskQueueを使ってリトライさせる方法かなと思います。