Cloud SQL Proxy V2をDockerで使用する

微妙に記述が変わっていてそこそこ手間取った。
Cloud SQLへアクセスする方法は以前まとめているが、Dockerのアプリケーションからプロキシ経由でCloud SQLヘアクセスする場合は一手間必要になる。
https://trueman-developer.blogspot.com/2020/07/gcp-cloud-sqlmysql.html

Docker Run経由でCloud SQL Proxy



DB接続名確認

gcloud sql instances describe データベース名 --format='value(connectionName)'
※Cloud SQLのダッシュボードから確認可能

認証用jsonファイル取得

https://cloud.google.com/sql/docs/mysql/authentication?hl=ja

https://cloud.google.com/sql/docs/mysql/add-manage-iam-users?hl=ja#creating-a-database-user

IAMと管理 → サービスアカウントからサービスアカウントを作成。 https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts

②このサービス アカウントにプロジェクトへのアクセスを許可する でロールを追加する。
ロール: Cloud SQL クライアント

作成したサービスアカウントを選択してキーの作成(JSON)
xxxxxxxxxxxxxxxx.json
ダウンロードしたjsonファイルはProxyと同階層に配置する必要がある。

Docker run

以下はCloud SQL ProxyV2での指定方法。
docker run -d \
  -v ./xxxxxxxxxxxxxxx.json:/var/service-account-key.json \
  -p 127.0.0.1:13306:13306 \
  gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0 \
  --credentials-file /var/service-account-key.json joy-service:asia-northeast2:joy-service-db

※ -pは任意のポート番号。接続するときに指定する。
※ -vはボリューム。先ほど取得したjsonファイルをDocker配下へコピーする。



docker-composeの記述方法


以下はLaravel Sailの例。
cloud-sql-proxyのvolumes, networks, commandの最後の2つjsonファイル名と接続名をを変更すれば良い

version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.2
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.2/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            IGNITION_LOCAL_SITES_PATH: '${PWD}'
        volumes:
            - '.:/var/www/html'
            - '/var/www/html/storage/framework'
        networks:
            - sail
        depends_on:
            - cloud-sql-proxy
    cloud-sql-proxy:
        container_name: cloudsql-proxy
        image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0
        volumes:
            - ./xxxxxxxxxxxxxxxx.json:/var/xxxxxxxxxxxxxxxx.json
        ports:
            - "127.0.0.1:13306:13306"
        networks:
            - sail
        command:
            [
                "--address",
                "0.0.0.0",
                "--port",
                "13306",
                "--credentials-file",
                "/var/xxxxxxxxxxxxxxxx.json",
                "service名:asia-northeast2:DB名"
            ]

これでDockerのアプリケーションからGCPのDBへアクセスできるようになる。
また適当なDB接続クライアントでDBの操作ができるようになる。



接続情報


Host: 127.0.0.1
Username:root
Password:
Port:13306

HostはDockerアプリケーションから接続する場合"cloud-sql-proxy"を指定する。
Username/PasswordはGCPのCloudSQLから設定する。
PortはDockerで指定した左側のポート番号になる。



参考


https://cloud.google.com/sql/docs/postgres/connect-auth-proxy?hl=ja#docker

https://qiita.com/r-dohara/items/28cf0e6a2bfb31f05d45#docker-compose

2023年8月7日月曜日