0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CloudFunctionを使って他のPJのCloudStorageにあるCSVデータをCloudSQLに入れる方法

Last updated at Posted at 2020-06-19

アーキテクチャ図

CF2SQL.png
ちなみにステップ数は約20ステップ。こんなの楽勝だと思ってたら何日もハマってしまった。

ソース

ソースも簡単。StackOverflowにあるまんま書けば良い。

MAIN.PY
def importDs(request):
    import googleapiclient.discovery
    from oauth2client.client import GoogleCredentials

    credentials = GoogleCredentials.get_application_default()
    service = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)

    # Project ID of the project that contains the instance.
    project = '[プロジェクト名]'  # TODO: Update placeholder value.
    # Cloud SQL instance ID. This does not include the project ID.
    instance = '[CloudSQLのインスタンス名]'  # TODO: Update placeholder value.
    instances_import_request_body = {
        "importContext": {
            "uri": "[GCSの場所]",
            "database": '[database名]',
            "fileType": "CSV",
            "csvImportOptions": {
                "table": "[テーブル名]"
            }
        }
    }

    request = service.instances().import_(project=project, instance=instance, body=instances_import_request_body)
    response = request.execute()
REQUIREMENTS.TXT
google-api-python-client==1.9.3
google-auth-httplib2==0.0.3
google-auth==1.17.2
oauth2client==4.1.3

The service account does not have the required permissions for the bucket.にハマる。

参照するCloudStorageにあるCSVファイルが他のPJなので、Cloud Funtionの権限をCloudStorageにつけてもアクセスが出来ない。
え?なんで?普通これで動くんじゃないのか??PJすべてのサービスアカウントやIAMで定義されているものすべて付けても動かない。これで何日もハマる。

正解は、CloudSQLインスタンスのサービスアカウントをCloudStrageに付与

「CloudFuntionはCloudSQLのAPIからimportするから、CloudSQLインスタンスのサービスアカウントをCloudStrageに付与すれば動くんじゃないのか?」と思いついてやったら、アッサリ動きました。

CloudSQLサービスアカウント.png
ここのサービスアカウントをCloudStoregeのバケットに付与する。

gcs_権限.png
CloudStorageの該当バケットの三点リーダーを押して、権限を追加します。

gcs権限追加.png
「項目を追加」から、
エンティティ: 「ユーザー」
名前 : CloudSQLインスタンスのサービスアカウント
アクセス権: 「読み取り」 (読み取りしか使わないため)
上記で追加する。

backetでやる場合

ファイルでやるのではなくて、backetでやる場合
bucket_permission.png

バケットの編集権限を付与します。
bucket_add_member.png
メンバーを追加します。
bucket_add_member2.png
Storageオブジェクトを閲覧にして追加します。

わかってしまえば1日もかからない作業に何日もかかってしまった。

ちょっと気になる

oauth2clientはもうdescriptionなので、google-authを使う形に変えたほうがいい。

参考URL

参考1:Import GCS CSV into Cloud SQL from Cloud Function
参考2:Google Cloud ドキュメント Method: instances.import
参考3:Google Cloud ドキュメント Cloud SQL にデータをインポートする
参考4:Google Cloud ドキュメント Cloud Functions から Cloud SQL に接続する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?