プライベート 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. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Compute Engine API を有効にします。

    API を有効にする

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

Compute Engine インスタンスの作成

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

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

  • Compute Engine インスタンスを作成します。インスタンスを次のように構成します。
    • インスタンスに 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 サーバー インスタンスを作成する

  • Compute Engine インスタンスを作成します。インスタンスを次のように構成します。
    • インスタンスに 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. Cloud Console で、[VM インスタンス] ページに移動します。

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

    2. 仮想マシン インスタンスのリストで、接続するインスタンスの行にある [SSH] をクリックします。

      インスタンス名の横にある SSH ボタン。

    3. apt-get パッケージ マネージャーを更新します。
      sudo apt-get update
      
    4. MySQL クライアント パッケージをインストールします。
      sudo apt-get -y install mysql-client-5.7

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

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

    1. Cloud Console で、[VM インスタンス] ページに移動します。

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

    2. 仮想マシン インスタンスのリストで、接続するインスタンスの行にある [SSH] をクリックします。

      インスタンス名の横にある SSH ボタン。

    3. apt-get パッケージ マネージャーを更新します。
      sudo apt-get update
      
    4. MySQL サーバー パッケージをインストールします。
      sudo apt-get -y install mysql-server-5.7

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

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

    1. Cloud Shell で、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 インスタンスと通信できるようにファイアウォール ルールを作成する必要があります。

    ファイアウォール ルールが 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. Cloud Console で [リソースの管理] ページに移動します。

      [リソースの管理] ページに移動

    2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
    3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

    インスタンスの削除

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

    1. Cloud Console で、[VM インスタンス] ページに移動します。

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

    2. my-server インスタンスのチェックボックスをクリックします。
    3. [削除] をクリックしてインスタンスを削除します。

    次のステップ