パブリック IP 接続の構成

ここでは、Cloud SQL インスタンスで使用するパブリック IP 接続を構成する方法を説明します。

はじめに

パブリック IPv4 アドレスを使用するように Cloud SQL インスタンスを構成し、特定の IP アドレスまたはアドレス範囲からの接続を受け入れるには、承認済みアドレスをインスタンスに追加します。

承認済みネットワークとしてプライベート ネットワーク(10.x.x.x など)を指定することはできません。

MySQL インスタンスのパブリック IP アドレス:

  • IPv6: インスタンスは IPv6 をサポートしていません。
  • IPv4: インスタンスには静的 IPv4 アドレスが自動的に割り当てられます。インスタンスがオフ(非アクティブ)の間も常に、IP アドレスにわずかな料金がかかります。

IP 接続で管理クライアントをインスタンスに接続する方法については、IP アドレスを使用して MySQL クライアントを接続するをご覧ください。

パブリック IP アドレスを使用して接続を受け入れるようにインスタンスを構成する場合は、SSL を使用してデータを保護するように構成する必要もあります。詳細については、インスタンス用に SSL を構成するをご覧ください。

公共のインターネットに公開されない IP アドレスでインスタンスを構成するには、プライベート IP 接続を構成するの手順に従います。

パブリック IP を有効にして、承認済みアドレスまたはアドレス範囲を追加する

インスタンスのパブリック IP を有効にすると、Cloud SQL は、公共のインターネットの静的な IPv4 アドレスを使用してインスタンスを構成します。パブリック IP を有効にしたら、データベース接続の承認を設定する必要があります。詳細については、承認のオプションをご覧ください。

パブリック IP を有効にして承認済みアドレスを追加するには:

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [パブリック IP] チェックボックスをオンにします。
  5. [ネットワークを追加] をクリックします。
  6. [ネットワーク] フィールドに、接続を許可する IP アドレスまたはアドレス範囲を入力します。

    CIDR 表記を使用します。

  7. 必要に応じて、このエントリの名前を入力します。
  8. [Done] をクリックします。
  9. [保存] をクリックしてインスタンスを更新します。

gcloud

  1. IPv4 アドレスをまだインスタンスに追加していない場合は、次のコマンドを使用して追加します。
    gcloud sql instances patch [INSTANCE_NAME] --assign-ip
    
  2. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。
    gcloud sql instances describe [INSTANCE_NAME]
    

    ipConfiguration の下で authorizedNetwork エントリを探し、維持する承認済みアドレスをメモします。

  3. 承認済みネットワークのリストを更新して、必要なすべてのアドレスを追加します。
    gcloud sql instances patch [INSTANCE_NAME] --authorized-networks=[IP_ADDR1],[IP_ADDR2]...
    

    CIDR 表記を使用します。

  4. 変更を確定します。
    gcloud sql instances describe [INSTANCE_NAME]
    

REST API v1beta4

  1. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  2. インスタンスに設定するすべてのアドレスが含まれるように、インスタンスを更新します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • network_range_1: 認可済みの IP アドレスまたは範囲
    • network_range_2: 別の認可済み IP アドレスまたは範囲

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    JSON 本文のリクエスト:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks":
            [{"value": "network_range_1"}, {"value": network_range_2"}]
        }
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

    CIDR 表記を使用します。

  3. 変更を確定します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • ip-address1: 最初の IP アドレスの CIDR 形式
    • ip-address-name1: 最初の IP アドレスの名前
    • ip-address2: 2 番目の IP アドレスの CIDR 形式
    • ip-address-name2: 2 番目の IP アドレスの名前
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

承認済みアドレスまたはアドレス範囲の削除

承認済みアドレスを削除するには、次の手順を実行します。

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. 削除するアドレスの削除アイコン 削除 をクリックします。
  5. [保存] をクリックしてインスタンスを更新します。

gcloud

  1. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。
    gcloud sql instances describe [INSTANCE_NAME]
    

    ipConfiguration の下で authorizedNetwork エントリを探し、維持する承認済みアドレスをメモします。

  2. 承認済みネットワーク リストを更新し、削除するアドレスを削除します。
    gcloud sql instances patch [INSTANCE_NAME] --authorized-networks=[IP_ADDR1],[IP_ADDR2]...
    
  3. 変更を確定します。
    gcloud sql instances describe [INSTANCE_NAME]
    

REST API v1beta4

  1. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • ip-address1: 最初の IP アドレスの CIDR 形式
    • ip-address-name1: 最初の IP アドレスの名前
    • ip-address2: 2 番目の IP アドレスの CIDR 形式
    • ip-address-name2: 2 番目の IP アドレスの名前
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  2. 保持するすべてのアドレスを含め、削除するすべてのアドレスを削除して、インスタンスを更新します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • network_range_1: 削除する認可済み IP アドレスまたはネットワーク範囲

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    JSON 本文のリクエスト:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks":
            [{"value": "network_range_1"}]
        }
      }
    }
    
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  3. 変更を確定します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • ip-address: IP アドレスの CIDR 形式
    • ip-address-name: IP アドレスの名前
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

すべてのパブリック IP 接続を拒否するためのインスタンスの構成

すべてのパブリック IP 接続を拒否するようにインスタンスを構成するには、次の手順に従います。

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. 承認済みのすべてのアドレスの削除アイコン 削除 をクリックします。
  5. [保存] をクリックしてインスタンスを更新します。

gcloud

  1. 承認済みアドレスリストをクリアします。
    gcloud sql instances patch [INSTANCE_NAME] --clear-authorized-networks
    
  2. 変更を確定します。
    gcloud sql instances describe [INSTANCE_NAME]
    

REST API v1beta4

  1. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • ip-address1: 最初の IP アドレスの CIDR 形式
    • ip-address-name1: 最初の IP アドレスの名前
    • ip-address2: 2 番目の IP アドレスの CIDR 形式
    • ip-address-name2: 2 番目の IP アドレスの名前
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  2. インスタンスを空のアドレスリストで更新します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    JSON 本文のリクエスト:

    {
      "settings":
      {
        "ipConfiguration":
        {
          "authorizedNetworks": []
        }
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  3. 変更を確定します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

パブリック IP の無効化

パブリック IP を無効にできますが、プライベート IP も使用するようにインスタンスが構成されている場合に限られます。プライベート IP を有効にするには、プライベート IP を使用するように既存のインスタンスを構成するをご覧ください。

パブリック IP を無効にするには:

Console

  1. Google Cloud Console の [Cloud SQL インスタンス] ページに移動します。

    [Cloud SQL インスタンス] ページに移動

  2. インスタンス名をクリックして [インスタンスの詳細] ページを開きます。
  3. [接続] タブを選択します。
  4. [パブリック IP] チェックボックスをオフにします。
  5. [保存] をクリックしてインスタンスを更新します。

gcloud

  1. インスタンスを更新します。
    gcloud sql instances patch [INSTANCE_NAME] --no-assign-ip
    
  2. 変更を確定します。
    gcloud sql instances describe [INSTANCE_NAME]
    

REST API v1beta4

  1. インスタンスを記述して、既存のすべての承認済みアドレスを表示します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • ip-address1: 最初の IP アドレスの CIDR 形式
    • ip-address-name1: 最初の IP アドレスの名前
    • ip-address2: 2 番目の IP アドレスの CIDR 形式
    • ip-address-name2: 2 番目の IP アドレスの名前
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  2. インスタンスを更新します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID

    HTTP メソッドと URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    JSON 本文のリクエスト:

    {
      "settings":
      {
        "ipConfiguration": {"ipv4Enabled": false}
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  3. 変更を確定します。

    後述のリクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • machine-type: インスタンスのマシンタイプ
    • zone: インスタンス ゾーン

    HTTP メソッドと URL:

    GET  https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id?fields=settings

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

トラブルシューティング

表内のリンクをクリックすると、詳細が表示されます。

この問題については... 次のような問題が考えられます... 次のことを試します...
Aborted connection パケットの読み取りエラー、または接続が中断された。 次の方法をお試しくださいをご覧ください。
Unauthorized to connect エラー。 多くの根本原因が考えられます。 次の方法をお試しくださいをご覧ください。
ネットワークの関連付けに失敗した。 プロジェクトで Service Networking API が有効になっていません。 プロジェクトで Service Networking API を有効にします
Remaining connection slots are reserved 最大接続数に達しました。 max_connections フラグの値を大きくします
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project サービス ネットワーキングのサービス アカウントが servicenetworking.serviceAgent ロールにバインドされていません。 サービス ネットワーキングのサービス アカウントを servicenetworking.serviceAgent ロールにバインドします
error x509: certificate is not valid for any names, but wanted to match project-name:db-name 既知の問題: 現時点では、Cloud SQL Proxy Dialer は Go 1.15 と互換性がありません。 修正されるまで、回避策が記載されている GitHub のディスカッションをご覧ください。
一部のオペレーティング システムで証明書を解析できない。 macOS 11.0(Big Sur)の x509 ライブラリを使用しているクライアントは、mysql インスタンスの一部の証明書を解析できない場合があります。「cancelled」などの一般的なエラーとしてクライアントに表示される場合があります。 この問題を回避する方法は、サーバー証明書をローテーションして、クライアント証明書を再作成することです。
Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection 割り振り範囲を変更または削除した後に VPC ピアリングが更新されませんでした。 VPC ピアリングの更新の詳細については、次の方法をお試しくださいをご覧ください。
Allocated IP range not found in network 割り振り範囲を変更または削除した後に VPC ピアリングが更新されませんでした。 VPC ピアリングの更新の詳細については、次の方法をお試しくださいをご覧ください。
ERROR: (gcloud.sql.connect) It seems your client does not have ipv6 connectivity and the database instance does not have an ipv4 address. Please request an ipv4 address for this database instance. Cloud Shell を使用してプライベート IP インスタンスに接続しようとしています。 現時点では、Cloud Shell からプライベート IP アドレスのみを持つインスタンスへの接続はサポートされていません。

接続が中断された

エラー メッセージ Got an error reading communication packets または Aborted connection xxx to db: DB_NAME が表示されます。

次のような問題が考えられます

  • ネットワークが不安定です。
  • TCP keep-alive コマンドに応答しません(クライアントまたはサーバーのいずれかが応答しないか、過負荷の可能性があります)。
  • データベース エンジン接続の存続期間を超過し、サーバーが接続を終了しています。

次の方法をお試しください

アプリケーションはネットワーク障害に対応し、接続プールや再試行などのベスト プラクティスに沿っている必要があります。通常、可能な場合は、接続プーラーによりこれらのエラーが検出されます。エラーが検出されない場合、アプリケーションは、再試行を行うか安全に失敗する必要があります。

接続の再試行には、次の方法をおすすめします。

  1. 指数バックオフ。再試行の間隔を指数関数的に増やします。
  2. ランダム化されたバックオフも追加します。
これらの方法を組み合わせると、スロットリングが減ります。


接続失敗

エラー メッセージ Unauthorized to connect が表示されます。

次のような問題が考えられます

承認はさまざまなレベルで行われるため、多くの原因が考えられます。

  • データベース レベルでは、データベース ユーザーが存在し、パスワードが一致する必要があります。
  • プロジェクト レベルでは、ユーザーに適切な IAM 権限がない可能性があります。
  • Cloud SQL レベルでは、根本原因はインスタンスへの接続方法によって異なります。パブリック IP を介してインスタンスに直接接続する場合、接続のソース IP がインスタンスの承認済みネットワーク内に存在している必要があります。

    デフォルトでは、RFC 1918 以外のアドレスから接続する場合を除き、プライベート IP 接続が許可されています。RFC 1918 以外のクライアント アドレスは、承認済みネットワークとして構成する必要があります。

    Cloud SQL は、デフォルトでは VPC から RFC 1918 以外のサブネット ルートを学習しません。RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要があります。例:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    Cloud SQL Auth Proxy を介して接続する場合は、IAM 権限が正しく設定されていることを確認してください。

  • ネットワーク レベルでは、Cloud SQL インスタンスでパブリック IP を使用している場合、接続のソース IP が承認済みネットワーク内に存在している必要があります。

次の方法をお試しください

  • ユーザー名とパスワードを確認します。
  • ユーザーの IAM のロールと権限を確認します。
  • パブリック IP を使用する場合は、ソースが承認済みネットワーク内に存在していることを確認します。

ネットワークの関連付けに失敗した

エラー メッセージ Error: Network association failed due to the following error が表示されます。サービス ネットワーキングのサービス アカウントをユーザープロジェクトの servicenetworking.serviceAgent ロールとして設定します。

次のような問題が考えられます

プロジェクトで Service Networking API が有効になっていません。

次の方法をお試しください

プロジェクトで Service Networking API を有効にします。Cloud SQL インスタンスにプライベート IP アドレスの割り当てを試行中で、共有 VPC を使用しているときにこのエラーが表示される場合は、ホスト プロジェクトに対して Service Networking API を有効にする必要もあります。


残りの接続スロットが予約済み

エラー メッセージ FATAL: remaining connection slots are reserved for non-replication superuser connections が表示されます。

次のような問題が考えられます

最大接続数に達しました。

次の方法をお試しください

max_connections フラグの値を編集します。


サービス ネットワーキングのサービス アカウントをユーザー プロジェクトの servicenetworking.serviceAgent ロールとして設定する

エラー メッセージ set Service Networking service account as servicenetworking.serviceAgent role on consumer project. が表示されます。

次のような問題が考えられます

サービス ネットワーキングのサービス アカウントが、servicenetworking.serviceAgent ロールにバインドされていません。

次の方法をお試しください

この問題を回避するには、次の gcloud コマンドを使用して、サービス ネットワーキングのサービス アカウントを servicenetworking.serviceAgent ロールにバインドしてください。

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=PROJECT_ID
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

エラー x509: いずれの名前に対しても証明書が無効です

エラー メッセージ error x509: certificate is not valid for any names, but wanted to match project-name:db-name が表示されます。

次のような問題が考えられます...

既知の問題: 現時点では、Cloud SQL Proxy Dialer は Go 1.15 と互換性がありません。

次の方法をお試しください

バグが修正されるまで、回避策が記載されている GitHub のディスカッションをご覧ください。


一部のオペレーティング システムで証明書を解析できない

macOS 11.0(Big Sur)の x509 ライブラリを使用すると、mysql インスタンスの証明書の解析に失敗する場合があります。「cancelled」などの一般的なエラーとして表示される場合があります。

次の方法をお試しください

バグは修正されました。新しいインスタンスでこの問題が発生することはありません。古いインスタンスでこの問題が発生した場合は、サーバー証明書をローテーションして、クライアント証明書を再作成します。


CreateConnection で割り振り範囲を変更することはできません。UpdateConnection を使用してください

エラー メッセージ Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection または The operation "operations/1234" resulted in a failure "Allocated IP range 'xyz' not found in network が表示されます。

次のような問題が考えられます...

別の予約範囲を使用して再接続を試みると、最初のエラーが発生します。

割り振り範囲が変更されても、vpc-peerings が更新されなかった場合は、2 番目のエラーが表示されます。

次の方法をお試しください

プライベート接続を変更する必要があります。次のコマンドを使用します。--force 引数を必ず使用してください。

gcloud services vpc-peerings update --network=VPC_NETWORK --ranges=ALLOCATED_RANGES --service=servicenetworking.googleapis.com --force

次のステップ