web-dev-qa-db-ja.com

Dockerコンテナ内のプロキシ経由でGoogleCloudSQLにアクセスする方法はありますか

Djangoサーバー(これにはGoogle Cloud SQLアクセスへのアクセスが必要です)をホストするGoogle Compute Engineで実行されている複数のDockerマシン(dev、staging)があります。複数のGoogle CloudSQLインスタンスが実行されています。インスタンスは、Google ComputeEngineインスタンスのそれぞれのDockerマシンで使用されます。

現在、Compute EngineIPをホワイトリストに登録してCloudSQLにアクセスしています。しかし、明らかな理由でIPを使用したくありません。つまり、開発マシンに静的IPを使用しません。

しかし、今度はgoogle_cloud_proxyの方法を使用してアクセスを取得したいと思います。しかし、どうすればそれを行うことができますか? GCPには、Google CloudSQLインスタンスにアクセスするための複数の方法があります。しかし、それらのどれも私のユースケースに適合しません:

このオプションがあります https://cloud.google.com/sql/docs/mysql/connect-compute-engine ;しかしこれは

  1. コンピュータエンジンにSQLインスタンスへのアクセスのみを許可します。 Dockerからアクセスする必要があります。
  2. これは、同じComputeEngineマシンで複数のSQLインスタンスをプロキシすることをサポートしていません。可能であれば、Docker内でこのプロキシを実行したいと思っていました。

では、Docker内のCLoud SQLにアクセスするにはどうすればよいですか? dockercomposeが開始するためのより良い方法である場合。 kubernetesの実装はどれほど簡単ですか(本番環境ではGoogleコンテナエンジンを使用しています)

12
rrmerugu

Docker-composeを使用して、ローカルのdocker環境でcloudsql-proxyを使用する方法を理解することができました。 Cloud SQLインスタンスの認証情報をプルダウンして、準備する必要があります。それらをプロジェクトルートにcredentials.jsonとして保持し、プロジェクトの.gitignoreに追加します。

私が見つけた重要な部分は、ポートを転送できるように、GCPインスタンスIDの後に=tcp:0.0.0.0:5432を使用することでした。次に、アプリケーションで、ホスト名としてlocalhostの代わりにcloudsql-proxyを使用します。 cloudsql-proxyコンテナによって提供されるローカルプロキシを介して接続できるように、残りのdbcredがアプリケーションシークレットで有効であることを確認してください。

注:Tomcat Javaアプリケーションを作成しており、docker-compose.ymlはそれを反映していることに注意してください。

docker-compose.yml:

version: '3'
services:
  cloudsql-proxy:
      container_name: cloudsql-proxy
      image: gcr.io/cloudsql-docker/gce-proxy:1.11
      command: /cloud_sql_proxy --dir=/cloudsql -instances=<YOUR INSTANCE ID HERE>=tcp:0.0.0.0:5432 -credential_file=/secrets/cloudsql/credentials.json
      ports:
        - 5432:5432
      volumes:
        - ./credentials.json:/secrets/cloudsql/credentials.json
      restart: always

  tomcatapp-api:
    container_name: tomcatapp-api
    build: .
    volumes:
      - ./build/libs:/usr/local/Tomcat/webapps
    ports:
      - 8080:8080
      - 8000:8000
    env_file:
      - ./secrets.env
    restart: always
13
Dan