Python
gcp
cloudsql

GCPのGCS上のデータをCloudSQLへインポートする方法と注意点

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を使ってリトライさせる方法かなと思います。