Google Container Engine から接続する

ここでは、Cloud SQL Proxy Docker イメージを使用して、Google Container Engine で実行しているアプリケーションから Cloud SQL インスタンスへの接続を設定する方法を説明します。

はじめに

Google Container Engine で実行しているアプリケーションから Google Cloud SQL インスタンスにアクセスするには、Cloud SQL Proxy Docker イメージを使用します。Cloud SQL Proxy の詳細については、Cloud SQL Proxy についてをご覧ください。

始める前に

この手順を開始する前に、以下のものを用意する必要があります。

  • バージョン 1.2 以降を実行している Container Engine クラスタと、クラスタとのやりとりのためにインストールおよび設定された kubectl コマンドライン ツール。

    Google Container Engine の概要については、クイックスタートをご覧ください。

  • Container Engine クラスタ上のポッド内にあるアプリケーション コンテナ。

    Cloud SQL Proxy は、「サイドカー」というポッドパターンを使用してポッドに追加されます。Kubernetes クラスタの設定と使用の詳細については、Kubernetes ユーザーガイドをご覧ください。サイドカー ポッドパターンの概要図については、コンポジット コンテナのパターンをご覧ください。

  • デフォルト ユーザーが構成された第 2 世代インスタンス。

    Cloud SQL インスタンスの作成方法については、インスタンスを作成するをご覧ください。

1. API を有効にする

  1. Cloud SQL Administration API を有効にする。

    Enable the API

    API を有効にすると、認証情報を得る必要はありません。

2. サービス アカウントを作成する

プロキシには、Cloud SQL インスタンスに対する適切な権限を持つサービス アカウントが必要です。サービス アカウントの詳細については、Google Cloud Platform 認証ガイドをご覧ください。

  1. Google Cloud Platform Console の Cloud SQL の [サービス アカウント] ページに移動します。

    [サービス アカウント] ページに移動

  2. 必要に応じて、Cloud SQL インスタンスを含むプロジェクトを選択します。
  3. [サービス アカウントを作成] をクリックします。
  4. [サービス アカウントを作成] ダイアログで、わかりやすいサービス アカウント名を指定します。
  5. [役割] で、[Cloud SQL] > [Cloud SQL クライアント] を選択します。

    [役割] > [編集者] を選択することで、基本の役割として編集者を使用することもできますが、編集者の役割には Google Cloud Platform 全体に対する権限が含まれます。

  6. 必要に応じて、[サービス アカウント ID] を短い値に変更します。
  7. [新しい秘密鍵の提供] をクリックします。
  8. デフォルトのキータイプは JSON であり、この値を使用して問題ありません。
  9. [作成] をクリックします。

    秘密鍵ファイルがマシンにダウンロードされます。秘密鍵ファイルは、別の場所に移動できます。安全な場所に鍵ファイルを保管してください。

このキーファイルの場所は、この作業の後の方で PROXY_KEY_FILE_PATH として指定します。

3. プロキシのユーザー アカウントを作成する

プロキシは、特別な名前を使用してデータベースにアクセスします。こうすることで、設定のセキュリティが向上します。このプロキシだけが、このホストによって作成された任意のユーザー アカウントを使用できるからです。パスワードを指定する必要はありません。プロキシのユーザーが作成されていない場合は、cloudsqlproxy~% というホスト名で作成します。ユーザー名には任意のものを選択できます。

次に例を示します。

 gcloud sql users create proxyuser cloudsqlproxy~% --instance=myinstance1

ユーザー アカウントの作成方法については、ユーザーを作成するをご覧ください。

4. インスタンス接続名を取得する

インスタンス接続名は、Google Cloud Platform のインスタンスを識別するためのものです。これを取得するには Google Cloud Platform Console を使用するか、次の gcloud コマンドライン ツールを使用します。

 gcloud sql instances describe [INSTANCE_NAME]

たとえば、プロジェクト myproject1 のインスタンス myinstance1 の場合、インスタンス接続名は次のようになります。

myproject1:us-central1:myinstance1

この値は後で INSTANCE_CONNECTION_NAME として指定します。

5. シークレットを作成する

Container Engine アプリケーションが Cloud SQL インスタンスのデータにアクセスできるようにするには、2 つのシークレットが必要になります。

  • cloudsql-instance-credentials シークレットは、アプリケーションが Cloud SQL インスタンスに接続できるようにします。
  • cloudsql-db-credentials シークレットは、アプリケーションがデータベースに接続できるようにします。

この 2 つのレベルのアクセス制御の詳細については、インスタンスのアクセス制御をご覧ください。

シークレットを作成するには、以下を実行します。

  1. サービス アカウントの作成時にダウンロードしたキーの場所を指定して、インスタンスレベルのアクセスのためのシークレットを作成します。
    kubectl create secret generic cloudsql-instance-credentials \
                           --from-file=credentials.json=[PROXY_KEY_FILE_PATH]
    
  2. データベース アクセスに必要なシークレットを作成し、プロキシ ユーザーの名前(必要があればパスワードも)を指定します。
    kubectl create secret generic cloudsql-db-credentials --from-literal=username=[PROXY_USER]
    

    プロキシにパスワードがある場合は、上記のコマンドに --from-literal=password=[PROXY_PASSWORD] を追加して指定します。

    上記の例で作成したプロキシ ユーザーの場合は、次のコマンドを使用します。

    kubectl create secret generic cloudsql-db-credentials --from-literal=username=proxyuser
    

6. ポッド設定ファイルを更新する

ポッド設定ファイルには、データベースのホストアドレス、シークレット、Cloud SQL インスタンスの場所が含まれている必要があります。

必要になる厳密な変数名は、使用しているアプリケーション コンテナによって異なります。サンプルコードを含む完全なサンプル デプロイについては、CloudSQL の例をご覧ください。

  1. アプリケーションがデータベースへのアクセスに使用するホストアドレスとして 127.0.0.1:3306 を指定します。

    プロキシは、同じポッド内の 2 番目のコンテナで実行されるため、アプリケーションには localhost として表示されます。このため、この接続には 127.0.0.1:3306 を使用します。

  2. cloudsql-db-credentials シークレットを指定して、アプリケーションがデータベースにログインできるようにします。

    たとえば、アプリケーションが DB_USERDB_PASSWORD を想定しているとします。

    - name: DB_USER
      valueFrom:
        secretKeyRef:
          name: cloudsql-db-credentials
          key: username
    

    プロキシ ユーザーにパスワードが必要な場合は、以下も追加します。

    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: cloudsql-db-credentials
          key: password
    

  3. ポートを 3306 に設定し、記録済みの接続名を使用して、プロキシで使用するコンテナを定義します。

    - image: gcr.io/cloudsql-docker/gce-proxy:1.09
      name: cloudsql-proxy
      command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                "-instances=[INSTANCE_CONNECTION_NAME]=tcp:[PORT]",
                "-credential_file=/secrets/cloudsql/credentials.json"]
      volumeMounts:
        - name: cloudsql-instance-credentials
          mountPath: /secrets/cloudsql
          readOnly: true
        - name: ssl-certs
          mountPath: /etc/ssl/certs
        - name: cloudsql
          mountPath: /cloudsql

    この手順では、コンテナのマウント ポイントも定義します。

  4. ボリュームを定義します。

    volumes:
      - name: cloudsql-instance-credentials
        secret:
          secretName: cloudsql-instance-credentials
      - name: ssl-certs
        hostPath:
          path: /etc/ssl/certs
      - name: cloudsql
        emptyDir:

  5. ポッドを作成します。

    kubectl create -f [CONFIGURATION_FILE]
    

7. Cloud SQL に接続するようにアプリケーションを更新する

Google Container Engine 環境をセットアップしたら、プロキシを使用している他の外部アプリケーションと同じ方法で Cloud SQL に接続します。正確な接続文字列は、使用する言語とフレームワークによって異なります。

接続文字列の例については、言語固有の情報と例を参照してください。

次のステップ

外出先でもリソースをモニタリング

Google Cloud Console アプリを入手して、プロジェクトの管理にお役立てください。

フィードバックを送信...