GCPで無料HTTPS化｛Compute Engine編｝

2018年10月頃、AWSでいうところの Certificate Manager と同様の機能を持つGoogle-managed SSL certificate が Google Cloud Load Balancing に対応するBETA版としてリリースされました！

Google-managed SSL certificate（以降、マネージドSSL） を利用する一番のメリットとして、ロードバランサーに設定したSSL証明書の更新期限を気にする必要がなくなります。

注意点としては、使用されるSSL証明書の発行元が「Let’s Encrypt」ですので企業ポリシーによっては採用が難しい可能性もあることをお伝えしておきます。

BETA版自体は2019年の後半まで続くとGoogle Documentに記載がありますので、まずは開発環境などでお手軽に試されるのもよいのではないでしょうか。
また、本稿の後半には 忙しい方向けコマンドラインまとめ を掲載していますのでそちらもご覧ください。

それでは早速設定手順をご紹介したいと思います！


1. はじめに

本稿の手順が正しいことを最終的に確認するには 「お名前.com」や「Google Domains」などのドメインレジストラで、管理している独自ドメインのレコードを編集できることが必須 となります。
企業や個人で編集できる独自ドメインを保有していない方は、「freenom」という無料でドメイン取得できる外部サービスをご利用ください。
また、「freenom」に関しては本稿執筆時点では触れませんので、インターネットで検索してみてください。

＜注記＞
・freenomについては後日、別記事にてご紹介する予定です。
・前提として、ご自身のGCPConsoleへログインしていることが条件となります。まだGCPプロジェクトをお持ちでない方は弊ブログの 初心者のためのGCPプロジェクト始め方入門 を参照してください。https://www.apps-gcp.com/gcp-startup/
・手っ取り早く本記事を検証したい方は後述しました 忙しい方向けコマンドラインまとめ（構築編） を参照してください。


2． GCPコンソールから各リソースを作成する手順
＜VPCネットワーク・サブネットの作成＞
・左上のナビゲーションメニューから「VPCネットワーク」を開く
・「VPCネットワークを作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/2c4ac437-9192-3ed9-b607-b7344c20b1e2.png)


・「VPCネットワーク名」を入力する（例：managedssl-vpc）
・「サブネット名」を入力する（例：tokyo-subnet ）
・リージョンを「asia-northeast1」で選択する
・「IPアドレス範囲」を入力する（例：192.168.0.0/24）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/214f45fb-5879-d8b2-02e9-73ba5e878ad5.png)

・その他の設定は変更せず「作成」ボタンを押下する


＜インスタンステンプレートの作成＞
・左上のナビゲーションメニューから「Compute Engine」→「インスタンステンプレート」を開く
・「インスタンステンプレートを作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/e8c80a0b-b6d3-b4b5-da8f-aca4e6af314b.png)


・「インスタンステンプレート名」を入力する（例：managedssl-default-osimage-debian9）
・「ファイアウォール」欄で「HTTPトラフィックを許可する」をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/964f1eed-afb1-7625-1eac-4940cbbef490.png)


・「管理、セキュリティ、ディスク、ネットワーク、単一テナンシー」を押下する
・「自動化」欄にある「起動スクリプト」に下記bashコマンドをコピペする

――――――――――――――――――――――――――――
#! /bin/bash
#Installs apache and a custom homepage
sudo su -
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>
――――――――――――――――――――――――――――
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/9faac2b5-820a-357e-e176-ee308fade199.png)


・「ネットワーキング」タブを押下する
・「ファイアウォール」欄で「HTTPトラフィックを許可する」をチェックする
・「ネットワーク」欄で先ほど作成したVPCネットワークを選択する
・「サブネット」欄で先ほど作成したサブネットを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/a8875292-9932-4f2c-a8dd-474e34386636.png)

・「作成」ボタンを押下する


＜マネージドインスタンスグループの作成＞
・左上のナビゲーションメニューから「Compute Engine」→「インスタンスグループ」を開く
・「インスタンスグループを作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/794d8013-326c-cb21-10f2-8dc98bfe3de0.png)

・「インスタンスグループ名」を入力する（例：managedssl-mig）
・「ロケーション」欄で「複数のゾーン」を選択する
・「リージョン」欄で「asia-northeast1」を選択する
・「インスタンステンプレート」欄で先ほど作成したインスタンステンプレートを選択する
・「インスタンスの最小数」欄で「2」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/6f150b75-3010-1bf2-1eca-ec54d2cdb6b4.png)

・「作成」ボタンを押下する


＜ロードバランサー(URL map)の作成＞
・左上のナビゲーションメニューから「ネットワークサービス」→「負荷分散」を開く
・「ロードバランサを作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/70d75484-ef7b-fffb-a6e8-e51be0e81f73.png)

・「HTTP(S)負荷分散」欄の「設定を開始」ボタンを押下する
・「ロードバランサー名」を入力する（例：managedssl-global-lb）
・「バックエンドの設定」を押下する
・「バックエンドサービスとバックエンドバケット」欄で「バックエンドサービス」→「バックエンドサービスを作成」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/5d7ece32-2fa7-eac7-8c1b-6bd11aae5cbe.png)

・「バックエンドサービス名」を入力する（例：managedssl-bes）
・「新しいバックエンド」の項目にある「インスタンスグループ」欄に先ほど作成したインスタンスグループを選択する
・「ヘルスチェック」欄で「ヘルスチェックを作成」を押下する
・「ヘルスチェック名」を入力する（例：managedssl-http-healthcheck）
・「保存して次へ」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/a7fb9909-5634-cdbc-3f7d-bd6344b78738.png)

・「作成」ボタンを押下する
・「フロントエンドの設定」を押下する
・「フロントエンド名」を入力する（例：managedssl-https-proxy）
・「プロトコル」欄で「HTTPS(HTTP/2を含む)」を選択する
・「証明書」欄で「新しい証明書の作成」を押下する
・「証明書名」を入力する（例：managedssl-sslcert）
・「作成モード」欄で「Google管理の証明書を作成する」を選択する
・「ドメイン欄」で自身が管理しているドメインを入力する（例：managedssl-example.tk）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/bdfafc0f-992b-7217-abf1-23498bb51e18.png)

・「作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/5624f541-efb6-c76d-2cf4-b83bb9bf9218.png)


・「完了」ボタンを押下する
・「作成」ボタンを押下する


＜ロードバランサーのIPv4アドレスを取得＞
・注記
　・ロードバランサーの作成には5分ほどかかるのでグリーンのチェックマークが表示されるまでお待ちください

・左上のナビゲーションメニューから「ネットワークサービス」→「負荷分散」を開く
・先ほど作成したロードバランサーの下部にある「詳細設定メニュー」リンクを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/9b2db61d-54bc-fe23-f4ac-e7a3b7fd8d45.png)

・「転送ルール」タブを表示すると先ほど作成したフロントエンドの転送ルールにIPv4アドレスが表示されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/7e5af410-ecaf-3cd0-5cf5-b1d2a3b298b6.png)

＜管理しているドメインレジストラやDNSサービスにDNSレコードをセット＞
・注記
　・下記はCloud DNSでの設定方法です

・左上のナビゲーションメニューから「ネットワークサービス」→「Cloud DNS」を開く
・「ゾーンを作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/8d6c0ca3-728e-6355-8c58-885f64832c7a.png)

・「ゾーン名」を入力する（例：managedssl-example-tk）
・「DNS名」を入力する（例：managedssl-example.tk）
・「作成」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/58eb588e-e5b5-5bc9-dd7c-8879b20b7c9e.png)

・作成したゾーンに自動で割り当てられたネームサーバーをドメインレジストラに登録する（例：freenomのネームサーバー設定画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/12657333-63a3-7425-e570-c672894adac6.png)

・「レコードセットを追加」ボタンを押下する
・「IPv4アドレス」欄に ロードバランサーのIPv4アドレスを取得 にて取得したIPv4アドレスをAレコードにセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/908f1c72-4e8a-ed70-dbe7-06495b7fac53.png)

・「作成」ボタンを押下する
・5分ほど待ってブラウザからHTTPS接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/4511ae4f-03bd-f56b-5416-2179de4d17e5.png)

＜まとめ＞
おつかれさまでした。
今回はユーザーが管理する必要の無いSSL証明書をHTTP(S)ロードバランサーに紐づけて、ドメインでアクセスすることを中心にご説明しました。

ですので、今回の手順では「ロードバランサーへHTTPでアクセスするにはどうすればいいのか」や「GKEで同じことができるのか」といった疑問にはあえて触れない内容になっています。

冒頭でご紹介した「freenom」や「GKEで同じことができるのか」といった内容はまた改めて投稿しますので引き続き弊ブログを注視いただければ幸いです。


＜忙しい方向けコマンドラインまとめ（構築編）＞
・注記
　・コマンドを実行後、GCPConsole上で対象のリソースが作成されたことを確認してから次のコマンドを実行すると次のコマンドが失敗しづらくなります
　・また、コマンドの実行環境はCloud Shellがおすすめです。詳しくはCloud Shell の起動をご覧ください。

＜VPCネットワーク・サブネットの作成＞
――――――――――――――――――――――――――――
$ gcloud compute networks create managedssl-vpc \
    --subnet-mode=custom
$ gcloud compute networks subnets create tokyo-subnet \
    --network=managedssl-vpc \
    --range=192.168.0.0/24 \
    --region=asia-northeast1
――――――――――――――――――――――――――――

＜インスタンステンプレートの作成＞
――――――――――――――――――――――――――――
$ gcloud compute instance-templates create managedssl-default-osimage-debian9 \
    --network=managedssl-vpc \
    --region=asia-northeast1 \
    --subnet tokyo-subnet \
    --image-project=debian-9 \
    --tags=http-server \
    --metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
sudo su -
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>'
――――――――――――――――――――――――――――

＜マネージドインスタンスグループの作成＞
――――――――――――――――――――――――――――
$ gcloud compute instance-groups managed create managedssl-mig \
    --region=asia-northeast1 \
    --template=managedssl-default-osimage-debian9 \
    --size=2
―――――――――――――――――――――――――――

＜マネージドSSL証明書の作成＞
――――――――――――――――――――――――――――
$ gcloud beta compute ssl-certificates create managedssl-sslcert \
    --domains=managedssl-example.tk
――――――――――――――――――――――――――――

＜バックエンドサービス・ヘルスチェックの作成＞
――――――――――――――――――――――――――――
$ gcloud compute http-health-checks create managedssl-http-healthcheck
$ gcloud compute backend-services create managedssl-bes \
    --protocol=HTTP \
    --http-health-checks=managedssl-http-healthcheck \
    --global
{1}
――――――――――――――――――――――――――――

＜バックエンドサービスにマネージドSSL証明書を適用＞
――――――――――――――――――――――――――――
$ gcloud compute backend-services add-backend managedssl-bes \
    --instance-group=managedssl-mig \
    --global \
    --instance-group-region=asia-northeast1
――――――――――――――――――――――――――――

＜ロードバランサー(URL map)の作成＞
――――――――――――――――――――――――――――
$ gcloud compute url-maps create managedssl-global-lb \
    --default-service=managedssl-bes
―――――――――――――――――――――――――――

＜HTTPSプロキシ・転送ルールの作成＞
――――――――――――――――――――――――――――
$ gcloud compute target-https-proxies create managedssl-https-proxy \
    --ssl-certificates=managedssl-sslcert \
    --url-map=managedssl-global-lb
 
$ gcloud compute forwarding-rules create managedssl-fw-rules \
    --target-https-proxy=managedssl-https-proxy \
    --ports=443 \
    --global
――――――――――――――――――――――――――――

＜ロードバランサーのIPv4アドレスを取得＞
――――――――――――――――――――――――――――
$ gcloud compute forwarding-rules describe managedssl-fw-rules \
    --global | grep "IPAddress"
 
IPAddress: 34.95.94.230
――――――――――――――――――――――――――――


＜忙しい方向けコマンドラインまとめ（削除編）＞
・注記
　・コマンドを実行後、GCPConsole上で対象のリソースが削除されたことを確認してから次のコマンドを実行すると次のコマンドが失敗しづらくなります
　・また、コマンドの実行環境はCloud Shellがおすすめです。詳しくはCloud Shell の起動をご覧ください。

＜HTTPSプロキシ・転送ルールの削除＞
――――――――――――――――――――――――――――
$ gcloud compute forwarding-rules delete managedssl-fw-rules \
    --global \
    --quiet
 
$ gcloud compute target-https-proxies delete managedssl-https-proxy \
    --quiet
――――――――――――――――――――――――――――

＜ロードバランサー(URL map)の削除＞
――――――――――――――――――――――――――――
$ gcloud compute url-maps delete managedssl-global-lb \
    --quiet
――――――――――――――――――――――――――――

＜バックエンドサービスの削除＞
――――――――――――――――――――――――――――
$ gcloud compute backend-services delete managedssl-bes \
    --global \
    --quiet
――――――――――――――――――――――――――――

＜バックエンドサービス・ヘルスチェックの削除＞
――――――――――――――――――――――――――――
$ gcloud compute http-health-checks delete managedssl-http-healthcheck \
    --quiet
――――――――――――――――――――――――――――

＜マネージドSSL証明書の削除＞
――――――――――――――――――――――――――――
$ gcloud beta compute ssl-certificates delete managedssl-sslcert \
    --quiet
――――――――――――――――――――――――――――

＜マネージドインスタンスグループの削除＞
――――――――――――――――――――――――――――
$ gcloud compute instance-groups managed delete managedssl-mig \
    --region=asia-northeast1 \
    --quiet
――――――――――――――――――――――――――――

＜インスタンステンプレートの削除＞
――――――――――――――――――――――――――――
$ gcloud compute instance-templates delete managedssl-default-osimage-debian9 \
    --quiet
――――――――――――――――――――――――――――

＜自動生成されたファイアウォールルールの削除＞
――――――――――――――――――――――――――――
$ gcloud compute firewall-rules delete managedssl-vpc-allow-http \
    --quiet
――――――――――――――――――――――――――――

＜VPCネットワーク・サブネットの削除＞
――――――――――――――――――――――――――――
$ gcloud compute networks subnets delete tokyo-subnet --region=asia-northeast1 \
    --quiet
$ gcloud compute networks delete managedssl-vpc \
    --quiet
――――――――――――――――――――――――――――