G-gen の山崎です。 当記事では Google マネージド SSL/TLS 証明書、ロードバランサ、Compute Engine 上の Apache HTTP Server という構成のシステムを構築したので、その手順を解説します。
- システム構成
- 前提知識
- Web サーバの構築
- Google マネージド SSL/TLS 証明書の作成
- ロードバランサの構築
- 外部 IP アドレスを予約する
- ヘルスチェックを作成する
- バックエンドサービスを作成する
- インスタンスグループをバックエンドとしてバックエンドサービスに追加する
- 受信リクエストをデフォルトのバックエンドサービスに転送する URL マップを作成する
- ロードバランサと証明書を紐づける Certificate Map を作成する
- ドメイン名と Certificate を紐づける Certificate Map Entry を作成する
- リクエストを URL マップに転送するターゲット HTTPS プロキシを作成する
- 受信リクエストをプロキシに転送するグローバル転送ルールを作成する
- DNS 構成に A レコードを追加する
- アクセス確認
- ロードバランサ構築時の注意事項
システム構成
今回構築したシステムの構成は、以下のとおりです。
Google マネージド SSL/TLS 証明書は、無料かつスピーディに調達することができる、Google Cloud 提供の SSL/TLS 証明書です。この構成では、Google マネージド SSL/TLS 証明書を Cloud Load Balancing に登録することで、HTTPS プロトコルでのアクセスを可能にしています。
今回は、以下の順序で環境を構築しました。
- Web サーバの構築
- Google マネージド SSL/TLS 証明書の構築
- ロードバランサの構築
前提知識
今回使用する Google Cloud サービスの詳細は、以下の記事をご参照ください。
Compute Engine blog.g-gen.co.jp
Cloud Load Balancing blog.g-gen.co.jp
Google マネージド SSL/TLS 証明書 blog.g-gen.co.jp
Web サーバの構築
VM インスタンスの作成
コンソールにて、Compute Engine > VMインスタンス と移動し、「インスタンスを作成」を押下します。
以下の箇所のみ設定を行い、「作成」を押下します。
項目名 | 設定値 |
---|---|
名前 | test-vm |
リージョン | asia-northeast1 |
ゾーン | asia-northeast1-a |
マシンタイプ | e2-micro |
HTTP トラフィックを許可する | オン |
HTTPS トラフィックを許可する | オン |
Apache のインストール
作成した VM に SSH でログインします。
以下のコマンドで Apache HTTP Server をインストールします。
sudo apt update sudo apt install apache2
index.html の更新
Web サーバにアクセスした際に、Hello,world
が表示されるように index.html を更新します。
sudo nano /var/www/html/index.html
index.html の記述
<!DOCTYPE html> <html> <head> <title>My Website</title> </head> <body> <h1>Hello, world!</h1> <p>You are accessing web server.</p> </body> </html>
Web サーバ接続確認
VM インスタンスの外部 IP アドレスを確認します。
ブラウザを起動し、http://{IPアドレス}
で接続します。
先ほど更新した index.html の内容で画面が表示されていることを確認します。
http でのアクセスとなるため、保護されていない通信と表示される可能性があります。
インスタンスグループの構築
前の手順で作成した VM を選択し、「このVMに基づいてグループを作成」を押下します。
以下の箇所のみ設定を行い、「グループを作成」を押下します。
項目名 | 設定値 |
---|---|
インスタンステンプレートの名前 | test-vm-template |
インスタンスグループの名前 | test-vm-instance-group |
インスタンス数 | 2 |
ポートマッピングのポート名 | http |
ポートマッピングのポート番号 | 80 |
Google マネージド SSL/TLS 証明書の作成
DNS 認証を作成する
当記事では、DNS 認証を用いて、Google マネージド SSL/TLS 証明書を作成します。 まずは、DNS 認証を作成します。
gcloud certificate-manager dns-authorizations create test-dns-auth --domain="{使用するドメイン}"
CNAME レコードを登録する
先ほどのコマンドで作成した CNAME レコードを確認します。
gcloud certificate-manager dns-authorizations describe test-dns-auth
出力結果の CNAME レコードの data
の値は、以降の処理で使用するため、控えておきます。
DNS 構成に CNAME レコードを追加する
CNAME レコードを、ドメインを管理している DNS ゾーンに追加します。
# トランザクションの開始 gcloud dns record-sets transaction start --zone="{DNS ゾーン名}" # CNAME レコードをターゲット DNS ゾーンに追加 gcloud dns record-sets transaction add {CNAME レコードの data の値} \ --name="_acme-challenge.{使用するドメイン}." \ --ttl="30" \ --type="CNAME" \ --zone="{DNS ゾーン名}" # トランザクションの終了 gcloud dns record-sets transaction execute --zone="{DNS ゾーン名}"
DNS 認証を参照する Google マネージド証明書を作成する
前の手順で作成した DNS 認証を参照する Google マネージド証明書を作成します。
gcloud certificate-manager certificates create test-cert --domains="{使用するドメイン}" --dns-authorizations=test-dns-auth
証明書の有効性を確認する
証明書自体が有効であることを確認します。以下のコマンドを実行し、STATUS が ACTIVE
となっていることを確認します。
証明書の作成には、10分以上時間がかかるのでご留意ください。
gcloud certificate-manager certificates describe test-cert
ロードバランサの構築
外部 IP アドレスを予約する
ロードバランサにユーザが接続する際に使用するグローバル静的外部 IP アドレスを設定します。
gcloud compute addresses create lb-ipv4 \ --ip-version=IPV4 \ --network-tier=PREMIUM \ --global
作成した IP アドレスは、以下のコマンドで確認できます。
gcloud compute addresses describe lb-ipv4 \ --format="get(address)" \ --global
ヘルスチェックを作成する
サービスの正常性を確認するために、ヘルスチェックを作成します。
gcloud compute health-checks create http http-basic-check \ --port 80
バックエンドサービスを作成する
バックエンドとのつなぎ役を担うバックエンドサービスを作成します。
gcloud beta compute backend-services create web-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
インスタンスグループをバックエンドとしてバックエンドサービスに追加する
前の手順で作成したインスタンスグループをバックエンドとして、バックエンドサービスに追加します。
gcloud beta compute backend-services add-backend web-backend-service \ --instance-group=test-vm-instance-group \ --instance-group-zone=asia-northeast1-a \ --global
受信リクエストをデフォルトのバックエンドサービスに転送する URL マップを作成する
受信リクエストをデフォルトのバックエンドサービスに転送するための URL マップを作成します。
gcloud beta compute url-maps create web-map-https \ --default-service web-backend-service
ロードバランサと証明書を紐づける Certificate Map を作成する
ロードバランサと証明書を紐づけるための Certificate Map を作成します。
gcloud certificate-manager maps create test-cert-map
ドメイン名と Certificate を紐づける Certificate Map Entry を作成する
ドメイン名と Certificate を紐づけるための Certificate Map Entry を作成します。
gcloud certificate-manager maps entries create test-cert-map-entry \ --map="test-cert-map" \ --certificates="test-cert" \ --hostname="{使用するドメイン}"
リクエストを URL マップに転送するターゲット HTTPS プロキシを作成する
リクエストを URL マップに転送するためのターゲット HTTPS プロキシを作成します。
gcloud compute target-https-proxies create https-lb-target-proxy \ --url-map="web-map-https" \ --certificate-map="test-cert-map"
受信リクエストをプロキシに転送するグローバル転送ルールを作成する
受信リクエストをプロキシに転送するためのグローバル転送ルールを作成します。
gcloud beta compute forwarding-rules create https-content-rule \ --load-balancing-scheme=EXTERNAL_MANAGED \ --network-tier=PREMIUM \ --address=lb-ipv4 \ --global \ --target-https-proxy="https-lb-target-proxy" \ --ports=443
DNS 構成に A レコードを追加する
ロードバランサに関連付けられた IP アドレスを元に A レコードを作成し、ドメインがロードバランサを参照するようにします。
# トランザクションの開始 gcloud dns record-sets transaction start --zone="{DNS ゾーン名}" # A レコードを作成 gcloud dns record-sets transaction add {作成した外部 IP アドレス} \ --name="{使用するドメイン}" \ --ttl=300 \ --type=A \ --zone="{DNS ゾーン名}" # トランザクションの終了 gcloud dns record-sets transaction execute --zone="{DNS ゾーン名}"
アクセス確認
ブラウザを起動し、https://{DNS ゾーン名}
で接続します。
前の手順でアクセスした時と同様に、更新した index.html の内容で画面が表示されていることを確認できます。また、https でアクセスしているため、保護されていない通信と表示されることもありません。
ロードバランサ構築時の注意事項
ロードバランサの構築は、Google Cloud コンソールや gcloud コマンドラインで実施することができます。しかし、コンソールで実施する場合、DNS 認証で作成した Google マネージド証明書をロードバランサに登録することはできません。プルダウンメニューに表示されるのは、ロードバランサ認証で作成した Google マネージド証明書のみです。
これは2024年10月現在の Google Cloud コンソールの仕様によるもので、今後の改善が期待されます。
ロードバランサ認証は、証明書のドメイン名でロードバランサに外部から HTTP(TCP 80番ポート)でアクセス可能であることをもって認証するという特性上、ロードバランサを構築完了しなければ Google マネージド証明書が作成されません。
これはセキュリティ上望ましくないほか、既存の Web サイトや Web アプリケーションを Google Cloud 移行する際には許容できないことが多いといえます。このような場合は、当記事のような手順で、gcloud コマンドラインを使って DNS 認証のマネージド証明書を作成してください。
- 参考 : ロードバランサ認証
山崎 曜(記事一覧)
クラウドソリューション部
元は日系大手SIerにて金融の決済領域のお客様に対して、PM/APエンジニアとして、要件定義〜保守運用まで全工程に従事。
Google Cloud 全 11 資格保有。
フルスタックな人材を目指し、日々邁進。