プライベート IP アドレスを使用してクライアントから Compute Engine 上の MySQL にアクセスできるように設定する


このチュートリアルでは、Google Cloud のプライベート ネットワーク上で MySQL データベースを実行し、Compute Engine を使用してデータベースにリモートから安全にアクセスできるようにする方法を説明します。

このチュートリアルは、Compute Engine に独自の MySQL データベースをインストールし、そのデータベースへのアクセスを同じ Compute Engine で実行されている承認済みの MySQL クライアントに限定したい場合に使用してください。マネージド サービスを使用する代わりに自分で MySQL インスタンスを管理することが必要になる場合もあります。たとえば、クロスリージョン インスタンス、高度なパラメータの使い方、またはパフォーマンスに関する特定のニーズがある場合です。

このチュートリアルでは、同じプライベート ネットワーク上の Compute Engine インスタンスにインストールされている MySQL クライアントからのリモート トラフィックを受け入れるように MySQL サーバーアプリを構成する方法について説明します。

適切な MySQL デプロイ オプションを選択する方法については、Compute Engine に MySQL をインストールする方法をご覧ください。

このチュートリアルでは、次の知識があることを前提としています。

  • 基本的な Linux コマンド
  • Ubuntu-server 18.04
  • MySQL 5.7
  • Compute Engine

アーキテクチャ

このチュートリアルでは、2 つの Compute Engine インスタンスをデプロイします。次の図に示すように、1 つのインスタンスはサーバー、もう 1 つインスタンスはクライアントです。

2 つのインスタンスがデプロイされたアーキテクチャ

目標

  • Compute Engine インスタンスを作成して MySQL サーバーをインストールする。
  • Compute Engine インスタンスを作成して MySQL クライアントをインストールする。
  • リモート アクセス用に MySQL サーバーを構成する。
  • MySQL サーバーへの公開アクセス権を削除する。
  • MySQL にリモートで接続する。
  • VPC Service Controls ファイアウォール ルールを作成する。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • Compute Engine
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine API.

    Enable the API

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

Compute Engine インスタンスの作成

MySQL の 2 つのインスタンスを作成します(1 つはクライアント、もう 1 つはサーバー)。

Compute Engine クライアント インスタンスを作成する

  • Create a Compute Engine instance. Configure the instance as follows:
    • Name the instance my-client.
    • インスタンスを作成するゾーン--zone フラグを設定します。
    • --image-project フラグを ubuntu-os-cloud に設定します。
    • --image-family フラグを ubuntu-1804-lts に設定します。
    • --scopes フラグを https://www.googleapis.com/auth/cloud-platform に設定します。
    • gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform

      Compute Engine サーバー インスタンスを作成する

    • Create a Compute Engine instance. Configure the instance as follows:
      • Name the instance my-server.
      • インスタンスを作成するゾーン--zone フラグを設定します。
      • --image-project フラグを ubuntu-os-cloud に設定します。
      • --image-family フラグを ubuntu-1804-lts に設定します。
      • --scopes フラグを https://www.googleapis.com/auth/cloud-platform に設定します。
      • gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform

        MySQL クライアントのインストール

        次の手順では、Compute Engine インスタンス上で MySQL をインストールする方法について説明します。

        1. my-client インスタンスに接続するには、ssh コマンドを使用します。
        2. apt-get パッケージ マネージャーを更新します。
          sudo apt-get update
          
        3. MySQL クライアント パッケージをインストールします。
          sudo apt-get -y install mysql-client-5.7

        MySQL サーバーのインストール

        次の手順では、Compute Engine インスタンス上で MySQL をインストールする方法について説明します。

        1. my-server インスタンスに接続するには、ssh コマンドを使用します。
        2. apt-get パッケージ マネージャーを更新します。
          sudo apt-get update
          
        3. MySQL サーバー パッケージをインストールします。
          sudo apt-get -y install mysql-server-5.7

        MySQL インストールのセキュリティの強化

        MySQL の root パスワードを設定し、MySQL サーバー構成の基本的なセキュリティを行う必要があります。詳しくは、MySQL のドキュメントで mysql_secure_installation をご覧ください。

        1. my-server インスタンスへの SSH セッションで、次のコマンドを使用して MySQL インストールのセキュリティを強化します。

          sudo mysql_secure_installation
          
        2. enter を押して、VALIDATE PASSWORD プラグインの設定をスキップします。

        3. 新しい root パスワードを 2 回入力します。

        4. 匿名ユーザーを削除するには、「Y」と入力して enter を押します。

        5. リモートからの root ログインを禁止するには、「Y」と入力して enter を押します。

        6. テスト データベースを削除するには、「Y」と入力して enter を押します。

        7. 権限テーブルを再読み込みするには、「Y」と入力して enter を押します。

        MySQL サーバーの構成

        リモートからの MySQL サーバーへのアクセスを許可するには、このサーバーの内部 IP アドレスをリッスンするように構成する必要があります。次に、サーバーに接続する MySQL クライアントに、root 以外のユーザー アカウントを作成します。

        すべての MySQL クライアント コマンドに特定のコマンドライン フラグを使用する必要があります(たとえば、認証を行う場合など)。このセクションで説明する MySQL コマンドでは、ユーザー名に --user、パスワードに -p を使用しています。また、特定のステーメントを実行し、すぐに終了する場合には -e を使用します。詳しくは、MySQL 5.7 コマンド オプションのリファレンスをご覧ください。

        1. Cloud Shell で、SSH を使用して my-server インスタンスを接続します。

        2. /etc/mysql/mysql.conf.d/mysqld.cnf 構成ファイルを次の情報で更新します。

          LOCAL_IP=$(curl  http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
              -H "Metadata-Flavor: Google")
          sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnf
          
        3. MySQL サービスを再起動し、実行中のサーバーに変更を適用します。

          sudo service mysql restart
          
        4. ローカルでサーバーが稼働していることを確認します。[ROOT_PASSWORD] は、前の手順で設定した MySQL サーバーの root パスワードで置き換えます。

          sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
          

          出力は次のようになります。

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        MySQL ユーザーを作成する

        上記の mysql_secure_installation コマンドにより、root ユーザーとしてのリモート接続は無効になっています。リモート接続を許可するために必要な権限を持つ新しいユーザーを作成する必要があります。

        1. Cloud Shell で、my-client 内部 IP アドレスの環境変数を作成します。

          CLIENT_IP=$(gcloud compute instances describe my-client \
              --zone=ZONE \
              --format='value(networkInterfaces[0].networkIP)')
          
        2. 新しい MySQL ユーザーを作成してパスワードを設定します。[MY_PASSWORD] はパスワードに、[ROOT_PASSWORD] は MySQL の root ユーザーのパスワードに置き換えます。

          sudo mysql -uroot -p[ROOT_PASSWORD] \
              -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
          
        3. 新しい MySQL ユーザーに、my-client の内部 IP アドレスからサーバーにログインするための権限を付与します。

          sudo mysql -uroot -p[ROOT_PASSWORD] -e \
              "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \
              IDENTIFIED BY '[MY_PASSWORD]';"
          

        my-server の外部 IP アドレスを削除する

        クライアントは内部 IP アドレスを使用して my-server にアクセスできるため、my-server インスタンスは外部 IP アドレスを必要としません。

        • 外部 IP アドレスを削除するには、Cloud Shell で構成設定を更新します。[ZONE] は、Google Cloud ゾーンに置き換えます。

          gcloud compute instances delete-access-config my-server \
              --access-config-name "external-nat" \
              --zone="ZONE"
          

        クライアントからサーバー インスタンスへのリモート アクセスを確認する

        以下では、my-client インスタンスから my-server 上の MySQL サーバーに接続する方法について説明します。

        1. Cloud Shell で、SSH を使用して my-client インスタンスを接続します。
        2. データベースを一覧表示して、接続をテストします。

          sudo mysql --host=my-server --user=TESTUSER \
              --password=[MY_PASSWORD] -e "SHOW DATABASES;"
          

          出力は次のようになります。

          +--------------------+
          | Database           |
          +--------------------+
          | information_schema |
          | mysql              |
          | performance_schema |
          | sys                |
          +--------------------+
          

        この手順では、MySQL クライアントが内部 IP アドレスを使用して MySQL サーバーに正常に接続できることを確認します。

        本番環境でのファイアウォールに関する考慮事項

        Google Cloud のデフォルトのネットワーク構成には、ファイアウォール ルール default-allow-internal が含まれています。このルールでは、MySQL ポートやポート 3306 を含む、幅広い範囲のポート上で Compute Engine インスタンス間の内部トラフィックを許可します。セキュリティ フットプリントが確立しているデフォルト以外の環境では、my-client インスタンスがネットワーク経由で my-server インスタンスと通信できるようにファイアウォール ルールを作成する必要があります。そうしないと 2 つのインスタンスは相互に通信できません。

        ファイアウォール ルールが IP アドレスの範囲またはタグに基づくように設定できます。幅広い範囲の内部 IP アドレスへのアクセス権を付与する場合は、IP アドレスの範囲が便利です。または、ネットワーク上の特定のインスタンスへのアクセス権を付与する場合は、タグによって柔軟なソリューションが提供されます。タグは、幅広い範囲の IP アドレスへのアクセス権を付与せずに、新しいクライアントの追加を容易にします。新しい MySQL クライアント インスタンスに適切なタグを割り当てるだけで済みます。たとえば、mysql-client でタグ付けされたすべてのクライアント インスタンスからのトラフィックを許可する新しいファイアウォール ルールを作成できます。

        タグを使用するファイアウォール ルールをサポートするには、Cloud Shell で my-client VM と my-server VM に適切なタグを割り当てます。

        gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE
        
        gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONE
        

        新しいファイアウォール ルールの追加

        以下では、my-client タグを持つインスタンスが my-server タグを持つインスタンスとポート 3306 で通信できるように新しいファイアウォール ルールを作成する方法を説明します。

        • Cloud Shell で、mysql-client から mysql-server への通信を許可するファイアウォール ルールを作成します。

          gcloud compute firewall-rules create "mysql-remote-access" \
              --allow tcp:3306 --source-tags "mysql-client" \
              --target-tags "mysql-server"
          

        これで、my-client から MySQL に接続できるようになりました。

        外部クライアントからのアクセスに関する考慮事項

        このチュートリアルでは、MySQL クライアントから Compute Engine で実行されている MySQL サーバーへのアクセスについて説明しています。Compute Engine で実行されていないクライアントからのアクセスを許可する方法については、このチュートリアルでは取り上げません。Compute Engine 以外のアクセスを許可する必要がある場合は、次のように変更します。

        • 外部接続を許可するには、my-server に外部 IP アドレスを追加します。
        • 外部クライアントの送信元 IP アドレスをファイアウォール ルールに追加します。
        • 外部クライアントの送信元 IP アドレスにバインドされている TESTUSER アカウントを変更するか、このようなユーザー アカウントを作成します。
  • クリーンアップ

    このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、プロジェクトを削除するか、インスタンスを削除します。

    プロジェクトを削除する

    課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

    プロジェクトを削除するには:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    インスタンスの削除

    Compute Engine インスタンスを削除するには:

    1. In the Google Cloud console, go to the VM instances page.

      Go to VM instances

    2. Select the checkbox for your my-server instance.
    3. To delete the instance, click More actions, click Delete, and then follow the instructions.

    次のステップ