このチュートリアルでは、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 つインスタンスはクライアントです。
目標
- Compute Engine インスタンスを作成して MySQL サーバーをインストールする。
- Compute Engine インスタンスを作成して MySQL クライアントをインストールする。
- リモート アクセス用に MySQL サーバーを構成する。
- MySQL サーバーへの公開アクセス権を削除する。
- MySQL にリモートで接続する。
- VPC Service Controls ファイアウォール ルールを作成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Compute Engine
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine API.
このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
Compute Engine インスタンスの作成
MySQL の 2 つのインスタンスを作成します(1 つはクライアント、もう 1 つはサーバー)。
Compute Engine クライアント インスタンスを作成する
-
Name the instance
my-client
. -
インスタンスを作成するゾーンに
--zone
フラグを設定します。 --image-project
フラグをubuntu-os-cloud
に設定します。--image-family
フラグをubuntu-1804-lts
に設定します。-
--scopes
フラグをhttps://www.googleapis.com/auth/cloud-platform
に設定します。 -
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
に設定します。 my-client
インスタンスに接続するには、ssh
コマンドを使用します。apt-get
パッケージ マネージャーを更新します。sudo apt-get update
- MySQL クライアント パッケージをインストールします。
sudo apt-get -y install mysql-client-5.7
my-server
インスタンスに接続するには、ssh
コマンドを使用します。apt-get
パッケージ マネージャーを更新します。sudo apt-get update
- MySQL サーバー パッケージをインストールします。
sudo apt-get -y install mysql-server-5.7
my-server
インスタンスへの SSH セッションで、次のコマンドを使用して MySQL インストールのセキュリティを強化します。sudo mysql_secure_installation
enter
を押して、VALIDATE PASSWORD
プラグインの設定をスキップします。新しい root パスワードを 2 回入力します。
匿名ユーザーを削除するには、「
Y
」と入力してenter
を押します。リモートからの root ログインを禁止するには、「
Y
」と入力してenter
を押します。テスト データベースを削除するには、「
Y
」と入力してenter
を押します。権限テーブルを再読み込みするには、「
Y
」と入力してenter
を押します。Cloud Shell で、SSH を使用して
my-server
インスタンスを接続します。/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
MySQL サービスを再起動し、実行中のサーバーに変更を適用します。
sudo service mysql restart
ローカルでサーバーが稼働していることを確認します。
[ROOT_PASSWORD]
は、前の手順で設定した MySQL サーバーの root パスワードで置き換えます。sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"
出力は次のようになります。
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
Cloud Shell で、
my-client
内部 IP アドレスの環境変数を作成します。CLIENT_IP=$(gcloud compute instances describe my-client \ --zone=ZONE \ --format='value(networkInterfaces[0].networkIP)')
新しい MySQL ユーザーを作成してパスワードを設定します。
[MY_PASSWORD]
はパスワードに、[ROOT_PASSWORD]
は MySQL の root ユーザーのパスワードに置き換えます。sudo mysql -uroot -p[ROOT_PASSWORD] \ -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"
新しい MySQL ユーザーに、
my-client
の内部 IP アドレスからサーバーにログインするための権限を付与します。sudo mysql -uroot -p[ROOT_PASSWORD] -e \ "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \ IDENTIFIED BY '[MY_PASSWORD]';"
外部 IP アドレスを削除するには、Cloud Shell で構成設定を更新します。
[ZONE]
は、Google Cloud ゾーンに置き換えます。gcloud compute instances delete-access-config my-server \ --access-config-name "external-nat" \ --zone="ZONE"
- Cloud Shell で、SSH を使用して
my-client
インスタンスを接続します。 データベースを一覧表示して、接続をテストします。
sudo mysql --host=my-server --user=TESTUSER \ --password=[MY_PASSWORD] -e "SHOW DATABASES;"
出力は次のようになります。
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
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-server
に外部 IP アドレスを追加します。 - 外部クライアントの送信元 IP アドレスをファイアウォール ルールに追加します。
- 外部クライアントの送信元 IP アドレスにバインドされている
TESTUSER
アカウントを変更するか、このようなユーザー アカウントを作成します。
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 をインストールする方法について説明します。
MySQL サーバーのインストール
次の手順では、Compute Engine インスタンス上で MySQL をインストールする方法について説明します。
MySQL インストールのセキュリティの強化
MySQL の root パスワードを設定し、MySQL サーバー構成の基本的なセキュリティを行う必要があります。詳しくは、MySQL のドキュメントで
mysql_secure_installation
をご覧ください。MySQL サーバーの構成
リモートからの MySQL サーバーへのアクセスを許可するには、このサーバーの内部 IP アドレスをリッスンするように構成する必要があります。次に、サーバーに接続する MySQL クライアントに、root 以外のユーザー アカウントを作成します。
すべての MySQL クライアント コマンドに特定のコマンドライン フラグを使用する必要があります(たとえば、認証を行う場合など)。このセクションで説明する MySQL コマンドでは、ユーザー名に
--user
、パスワードに-p
を使用しています。また、特定のステーメントを実行し、すぐに終了する場合には-e
を使用します。詳しくは、MySQL 5.7 コマンド オプションのリファレンスをご覧ください。MySQL ユーザーを作成する
上記の
mysql_secure_installation
コマンドにより、root ユーザーとしてのリモート接続は無効になっています。リモート接続を許可するために必要な権限を持つ新しいユーザーを作成する必要があります。my-server
の外部 IP アドレスを削除するクライアントは内部 IP アドレスを使用して
my-server
にアクセスできるため、my-server
インスタンスは外部 IP アドレスを必要としません。クライアントからサーバー インスタンスへのリモート アクセスを確認する
以下では、
my-client
インスタンスからmy-server
上の MySQL サーバーに接続する方法について説明します。この手順では、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
で通信できるように新しいファイアウォール ルールを作成する方法を説明します。これで、
my-client
から MySQL に接続できるようになりました。外部クライアントからのアクセスに関する考慮事項
このチュートリアルでは、MySQL クライアントから Compute Engine で実行されている MySQL サーバーへのアクセスについて説明しています。Compute Engine で実行されていないクライアントからのアクセスを許可する方法については、このチュートリアルでは取り上げません。Compute Engine 以外のアクセスを許可する必要がある場合は、次のように変更します。
-
Name the instance
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 サーバー インスタンスを作成する
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、プロジェクトを削除するか、インスタンスを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
インスタンスの削除
Compute Engine インスタンスを削除するには:
- In the Google Cloud console, go to the VM instances page.
-
Select the checkbox for
your
my-server
instance. - To delete the instance, click More actions, click Delete, and then follow the instructions.
次のステップ
- MySQL の高可用性に関する記事を読む。
- Compute Engine で MySQL を設定する方法を確認する。
- Cloud Logging for MySQL ログを構成する。
Cloud SQL について詳しく確認する。
Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。