概要
このラボでは、SQL Proxy 経由で Cloud SQL に接続された WordPress の Kubernetes Deployment を設定します。SQL Proxy を使用すると、Cloud SQL インスタンスをローカル(localhost:3306)にインストールされているかのように操作できます。ローカルのポートがセキュリティで保護されていなくても、Cloud SQL インスタンスへのネットワーク接続は保護されます。
このラボを実行するには、いくつかのコンポーネントを作成します。まず GKE クラスタを作成し、次に接続先の Cloud SQL インスタンスを作成します。さらに Pod に Cloud SQL インスタンスへのアクセス権限を付与するサービス アカウントを作成します。これは Workload Identity を使用して認証されます。最後に、サイドカーとして SQL Proxy を使用し、Cloud SQL インスタンスに接続される WordPress を GKE クラスタにデプロイします。
目標
このラボでは、次のタスクを行う方法について学びます。
- WordPress 用に Cloud SQL インスタンスとデータベースを作成する。
- アプリケーション認証用に認証情報と Kubernetes Secret を作成する。
- Workload Identity を構成する。
- SQL プロキシを使用するように WordPress イメージで Deployment を構成する。
- サイドカー コンテナとして SQL Proxy をインストールし、それを使用して、GKE クラスタの外部にある Cloud SQL インスタンスに SSL アクセスできるようにする。
ラボの設定
Qwiklabs にアクセスする
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
最初のログイン手順を完了すると、プロジェクト ダッシュボードが表示されます。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。
-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。
gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. ラボの GKE クラスタに接続する
- Cloud Shell で次のコマンドを入力して、Google Cloud のゾーンとクラスタ名の環境変数を設定します。
export my_cluster=autopilot-cluster-1
export my_project=$(gcloud config get-value project)
export my_region={{{ project_0.default_region | "Region" }}}
-
kubectl
コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
- kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --region $my_region
タスク 2. Cloud SQL API を有効にする
-
Google Cloud コンソールのナビゲーション メニュー()で、[API とサービス] をクリックします。
-
[+ API とサービスを有効にする] をクリックします。
-
[API とサービスを検索] に「SQL」と入力してから [Cloud SQL] API タイルをクリックします。
-
[有効にする] をクリックして、Cloud SQL API を有効にします。
API がすでに有効になっている場合は、代わりに [管理] ボタンが表示され、[API が有効です] のメッセージが表示されます。その場合は特に操作は必要ありません。
- 上記の手順を繰り返して、sqladmin API を有効にします。
タスク 3. Cloud SQL インスタンスを作成する
- Cloud Shell で次のコマンドを実行してインスタンスを作成します。
gcloud sql instances create sql-instance --tier=db-n1-standard-2 --region=$my_region
- Google Cloud コンソールで [SQL] に移動します。
- 一覧に表示されている
sql-instance
の名前をクリックしてから、[ユーザー] メニューをクリックします。
注: Cloud SQL インスタンスがプロビジョニングされるまで、数分待つ必要があります。
既存の root
ユーザーが一覧に表示されたら、次の手順に進みます。
-
[ユーザー] に移動して [ユーザー アカウントを追加] をクリックし、ユーザー名に「sqluser
」、パスワードに「sqlpassword
」を指定してアカウントを作成します。
-
[ホスト名] オプションを [すべてのホストを許可する(%)] に設定したまま、[追加] をクリックします。
-
インスタンス(sql-instance
)の [概要] メニューに戻り、インスタンス接続名をコピーします。
インスタンス接続名を表示するには、必要に応じて少し下にスクロールしてください。
- Cloud SQL インスタンス名を保持するための環境変数を次のように作成します。プレースホルダは、前の手順でコピーした名前に置き換えます。
export SQL_NAME=[Cloud SQL インスタンス名]
- 実際のコマンドは次のようになります。
$ export SQL_NAME=qwiklabs-gcp-d03ee58ad9ad507e:us-central1:sql-instance
- 次のように Cloud SQL インスタンスに接続します。
gcloud sql connect sql-instance
- root パスワードの入力を求められたら、Enter キーを押します。root SQL ユーザーのパスワードはデフォルトでは空白です。
mysql>
プロンプトが表示され、MySQL クライアントを使用して Cloud SQL インスタンスに接続していることがわかります。
- WordPress に必要なデータベースを作成します。これは、デフォルトでは「
wordpress
」という名前です。
create database wordpress;
- WordPress データベースを選択します。
use wordpress;
- WordPress データベースを選択します。
show tables;
まだテーブルを作成していないので、空のセットが報告されます。
- MySQL クライアントを終了します。
exit;
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud SQL インスタンスを作成する
タスク 4. Cloud SQL へのアクセス権を持つサービス アカウントを準備する
- サービス アカウントを作成するには、Google Cloud コンソールで [IAM と管理] > [サービス アカウント] に移動します。
- [+ サービス アカウントを作成] をクリックします。
- [サービス アカウント名] に「
sql-access
」と入力した後、[作成して続行] をクリックします。
- [ロールを選択] をクリックします。
- 「Cloud SQL」を検索し、[Cloud SQL クライアント] を選択して [続行] をクリックします。
- [完了] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
サービス アカウントを作成する
タスク 5. Kubernetes サービス アカウントを作成して Workload Identity を構成する
- Cloud Shell で次のコマンドを実行して、Kubernetes サービス アカウントを作成します。
kubectl create serviceaccount gkesqlsa
- Cloud Shell で次のコマンドを実行して、Google Cloud サービス アカウントを上記で作成した Kubernetes サービス アカウントにバインドします。
gcloud iam service-accounts add-iam-policy-binding \
--role="roles/iam.workloadIdentityUser" \
--member="serviceAccount:$my_project.svc.id.goog[default/gkesqlsa]" \
sql-access@$my_project.iam.gserviceaccount.com
- Cloud Shell で次のコマンドを実行して、Google Cloud サービス アカウントの詳細を Kubernetes サービス アカウントに追加します。
kubectl annotate serviceaccount \
gkesqlsa \
iam.gke.io/gcp-service-account=sql-access@$my_project.iam.gserviceaccount.com
タスク 6. Secret を作成する
Kubernetes の Secret を 2 つ作成します。1 つは MySQL 認証情報用で、もう 1 つは Google 認証情報(サービス アカウント)用です。
- MySQL 認証情報用の Secret を作成するには、Cloud Shell で次のように入力します。
kubectl create secret generic sql-credentials \
--from-literal=username=sqluser\
--from-literal=password=sqlpassword
Cloud SQL ユーザー アカウントを作成する際に別のユーザー名とパスワードを使用した場合は、このコマンドのユーザー名とパスワードをそれらに置き換えます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Secret を作成する
タスク 7. サイドカー コンテナとして SQL Proxy エージェントをデプロイする
sql-proxy.yaml
という Deployment マニフェスト ファイルを作成します。このファイルは、SQL Proxy エージェントをサイドカー コンテナとして使ってデモの WordPress アプリケーション コンテナをデプロイします。
WordPress コンテナの環境設定で、WORDPRESS_DB_HOST は localhost の IP アドレスを使って指定されます。cloudsql-proxy
サイドカー コンテナは、前のタスクで作成した Cloud SQL インスタンスを参照するように構成されています。データベースのユーザー名とパスワードが秘密鍵として WordPress コンテナに渡され、Workload Identity が構成されます。また、インターネットから WordPress インスタンスへの接続を可能にする Service も作成されます。
次のコマンドを使用して、sql-proxy.yaml
というファイルを作成し、nano で開きます。
nano sql-proxy.yaml
- nano が開いたら、以下を
sql-proxy.yaml
ファイルの中に貼り付けます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
serviceAccountName: gkesqlsa
containers:
- name: web
image: gcr.io/cloud-marketplace/google/wordpress:6.1
#image: wordpress:5.9
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: 127.0.0.1:3306
# これらのシークレットは Pod の起動に必要です。
# [START cloudsql_secrets]
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: sql-credentials
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: sql-credentials
key: password
# [END cloudsql_secrets]
# ここの <インスタンス接続名> を変更して、
# Google Cloud プロジェクト、
# Cloud SQL インスタンスのリージョン、および
# Cloud SQL インスタンス名を含めます。形式は次のとおり
# $PROJECT:$REGION:$INSTANCE
# [START proxy_container]
- name: cloudsql-proxy
image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.8.0
args:
- "--structured-logs"
- "--port=3306"
- "<インスタンス接続名>"
securityContext:
runAsNonRoot: true
---
apiVersion: "v1"
kind: "Service"
metadata:
name: "wordpress-service"
namespace: "default"
labels:
app: "wordpress"
spec:
ports:
- protocol: "TCP"
port: 80
selector:
app: "wordpress"
type: "LoadBalancer"
loadBalancerIP: ""
-
Ctrl+O キーに続いて Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
このマニフェストでは、次の重要なセクションに注目してください。
-
spec
セクションで、Kubernetes サービス アカウントが構成されます。
- WordPress の env セクションでは、変数
WORDPRESS_DB_HOST
が 127.0.0.1:3306
に設定されているため、WordPress はポート 3306 でリッスンしている同じ Pod 内のコンテナに接続します。これは、SQL プロキシがデフォルトでリッスンするポートです。
- Wordpress の
env
セクションでは、変数 WORDPRESS_DB_USER
と WORDPRESS_DB_PASSWORD
が、前のタスクで作成した sql-credential
Secret に入っている値を使用して設定されます。
-
cloudsql-proxy
コンテナ セクションでは、SQL 接続名を定義するコマンド スイッチ "-instances=<インスタンス接続名>
に、(ConfigMap や Secret を使って設定されない)プレースホルダ変数が含まれています。したがって、このサンプル マニフェスト内でこの変数を直接更新して Cloud SQL インスタンスを参照させる必要があります。
- 最後の Service セクションでは、外部インターネット アドレスからアプリケーションにアクセスできるようにする「
wordpress-service
」という外部 LoadBalancer を作成します。
-
sed
を使用して、SQL 接続名のプレースホルダ変数を実際の Cloud SQL インスタンスのインスタンス名に更新します。
sed -i 's/<インスタンス接続名>/'"${SQL_NAME}"'/g'\
sql-proxy.yaml
注: UNIX の sed コマンドはストリーム エディタを表し、これを使用すると置換、挿入、削除などのさまざまな操作をファイルに対して実行できます。sed は置換操作で最もよく使われます。sed を使用するとファイルを開かなくても編集できるので、エディタでファイルを開いてから変更する方法に比べて、はるかに短時間でファイル内の情報を見つけて置換できます。
- アプリケーションをデプロイします。
kubectl apply -f sql-proxy.yaml
- Deployment のステータスをクエリで確認します。
kubectl get deployment wordpress
注: インスタンスが利用できる状態であることを確認できるまで、このコマンドを繰り返し実行する必要があります。
出力:
NAME READY UP-TO-DATE AVAILABLE AGE
wordpress 1/1 1 1 45s
- GKE クラスタ内のサービスを一覧表示します。
kubectl get services
wordpress-service の外部の LoadBalancer IP アドレスは、WordPress ブログに接続するために使用するアドレスです。
- 以下に示すような外部アドレスを確認できるまで、このコマンドを繰り返し実行します。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
kubernetes ClusterIP 10.12.0.1 443/TCP
wordpress-service LoadBalancer 10.12.3.17 35.238.218.6 80:31095/TCP
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
サイドカー コンテナとして SQL Proxy エージェントをデプロイする
タスク 8. WordPress のインスタンスに接続する
- 新しいブラウザタブを開き、外部の LoadBalancer IP アドレスを使用して WordPress サイトに接続します。WordPress の初期インストール ウィザードが起動します。
- [日本語] を選択して [続ける] をクリックします。
- [サイトのタイトル] にサンプル名を入力します。
- サイトを管理するための [ユーザー名] と [パスワード] を入力します。
- メールアドレスを入力します。
これらの値のいずれも特に重要ではなく、今後使うことはありません。
- [Install Wordpress] をクリックします。
数秒後に [Success!] 通知が表示されます。WordPress の管理画面をご覧になりたい場合はログインできますが、このラボでは必須ではありません。
初期化プロセスにより、Cloud SQL インスタンスの WordPress データベース内にデータベース テーブルとデータが新たに作成されました。次に、この新しいデータベース テーブルが SQL プロキシ コンテナを使用して作成されていることを検証します。
- Cloud Shell に戻り、Cloud SQL インスタンスに接続します。
gcloud sql connect sql-instance
- root パスワードの入力を求められたら、Enter キーを押します。root SQL ユーザーのパスワードはデフォルトでは空白です。
mysql>
プロンプトが表示され、MySQL クライアントを使用して Cloud SQL インスタンスに接続していることがわかります。
- WordPress データベースを選択します。
use wordpress;
- WordPress データベースを選択します。
show tables;
WordPress の初期化時に作成された新しいデータベース テーブルがいくつか表示されます。これは、サイドカーの SQL Proxy コンテナが正しく構成されたことを示しています。
MySQL [wordpress]> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.19 sec)
- WordPress のユーザー テーブルのレコードをすべて一覧表示します。
select * from wp_users;
WordPress の管理者アカウントのデータベース レコードが一覧表示され、WordPress の初期化時に選択したメールアドレスが表示されます。
- MySQL クライアントを終了します。
exit;
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。