[作業記録][GCP] Jenkins Certified by BitnamiをHTTPSロードバランサの後ろに置く

# これはなんですか

- [Jenkins Certified by Bitnami](https://console.cloud.google.com/marketplace/details/bitnami-launchpad/jenkins) をHTTPS化するためにCloud Load Balancingを使った時の作業内容メモです。

# 作ったもの

図を書く気力がないので超簡単ですが、以下の構成を組みました。

```
[client] ---(HTTPS:443)--- [LB] ---(HTTP:80)--- [Jenkins VM Instance]
```

# 必要なもの

- GCPプロジェクト
    - 当然必要です。
    - 操作権限は [ドキュメント](https://cloud.google.com/load-balancing/docs/https/https-load-balancer-example?hl=ja#permissions) 参照
- 何かしらのドメイン
    - HTTPS化にあたって証明書を設定するので、対応するドメインが必要になります。

# 作業内容

罠になりやすいところを中心に書いておきます。

## ネットワーク設定

### ネットワークの作成

カスタムネットワーク `mynetwork` を作成した。

### ファイアウォール設定

https://cloud.google.com/load-balancing/docs/https?hl=ja#firewall_rules

> 130.211.0.0/22 や 35.191.0.0/16 からのトラフィックがインスタンスに到達することを許可するファイアウォール ルールを作成する必要があります。これらは、ロードバランサがバックエンド インスタンスへの接続に使用する IP アドレス範囲です。このルールは、ロードバランサとヘルス チェッカーの両方からのトラフィックを許可します。このルールでは、グローバル転送ルールで使用するよう構成されているポート上のトラフィックを許可する必要があります。また、ヘルス チェッカーでも同じポートを使用するように構成することを推奨します。ヘルス チェッカーが異なるポートを使用している場合には、このポート用に別のファイアウォール ルールを作成する必要があります。

`130.211.0.0/22`, `35.191.0.0/16` からのTCP80, 443ポートへのアクセスを許可するファイアウォール ルールを作成し、後で作成するJenkinsインスタンスに適用できるように設定した。

### 外部IPアドレスの予約

[コンソール](https://console.cloud.google.com/networking/addresses/list?hl=ja)

外部IPを固定するために予約しておいた。

### ドメインの準備

HTTPS設定をするため、あらかじめドメインを取得し、DNSレコードが設定できる状態にしておく。今回は[ムームードメイン](https://muumuu-domain.com/)で適当なドメインを取得した。

## バックエンド(Jenkinsインスタンス) の準備

### インスタンスの起動

[Jenkins Certified by Bitnami](https://console.cloud.google.com/marketplace/details/bitnami-launchpad/jenkins) から作成した。以下のリソースが作成される。

- VMインスタンス
- TCP80, 443ポートを全開放にするファイアウォールルール
    - 今回はチェックを外しておく

Deployment Manager でアクセス情報がみられる。

### インスタンスグループへの追加

適当なインスタンスグループを作成し、Jenkinsインスタンスを含めておく。

## ロードバランサー設定

HTTP(S)ロードバランサーを作成する。コンソールでガイドに従い、以下を設定する。

### ロードバランサーの選択

- `HTTP(S) 負荷分散` を選ぶ
- `インターネットから自分の VM へ` を選ぶ
- 適当な名前 (`jenkins-web`とした) を設定する

### バックエンド設定

新たにバックエンドサービスを作成する。ダイアログの中でヘルスチェックの項目があるので、ヘルスチェックもその中で新規作成する。ヘルスチェックのパスには `/jenkins/login` を指定する。

### ホストとパスのルール設定

パスベースのルーティングは不要なので、コンソールのデフォルトでよい。

### フロントエンド設定

以下要領で設定する

- プロトコル: HTTPS
- 名前: 適当に設定する
- IPアドレス: 作成した外部IPアドレス
- 証明書: 新たに作成する
    - Google 管理の証明書を作成する
    - ドメインを指定する。

その他はデフォルトで設定した

### 確認と完了

確認と完了の項目で設定を再度確認し、「作成」を選択する。

### DNS設定

DNSで予約した外部IPアドレスのAレコードを設定する。

## 動作確認

### 証明書の設定を確認する

[ドキュメント](https://cloud.google.com/load-balancing/docs/ssl-certificates?hl=ja#certificate-resource-status)
以下コマンドを実行し、作成した証明書の状態が `ACTIVE` であることを確認する。

```shell
$ gcloud beta compute ssl-certificates list
```

PROVISIONINGである場合は、以下を確認する。([ドキュメント](https://cloud.google.com/load-balancing/docs/ssl-certificates?hl=ja#certificate-resource-status) から抜粋)

> - ドメインの DNS レコードがロードバランサのターゲット プロキシの IP アドレスを参照している。
> - ターゲット プロキシが Google マネージド証明書リソースを参照している。
> - ロードバランサの構成（転送ルールの作成など）が完了している。

ターゲットプロキシは先の設定でいうところのフロントエンド設定に含まれている。

### 接続してみる

`https://<YOUR DOMAIN>/jenkins/login` に接続し、Jenkinsへのログイン画面が現れることを確認する。

## 不具合的な

CURL で `https://<YOUR DOMAIN>/jenkins` を叩くと403になる。ブラウザでつなぎに行くと `/jenkins/login` にリダイレクトされる。

## クリーンアップ

[ドキュメント](https://cloud.google.com/load-balancing/docs/https/https-load-balancer-example?hl=ja#cleaning_up) を参考に削除する。


# まとめ

- Marketplace の Jenkins をロードバランサーの背後に置いてHTTPS化した。
- Cloud Load Balancing のハンズオン的な感じでやってみたので商用には耐えられない構成。。。

# ドキュメント

https://cloud.google.com/solutions/using-jenkins-for-distributed-builds-on-compute-engine?hl=ja
https://cloud.google.com/load-balancing/docs/https?hl=ja
https://cloud.google.com/load-balancing/docs/https/https-load-balancer-example?hl=ja
https://cloud.google.com/load-balancing/docs/ssl-certificates?hl=ja#certificate-resource-status