GitLab に Network Load Balancer を導入

# はじめに
前回、[GitLab に Let's Encrypt で SSL を設定。](https://qiita.com/kooohei/items/f7b7829243f766b6b0c1) で GitLabサーバーにSSLを導入しました。
ここでは ロードバランサー(NLB) を導入したいと思います。
また、今回は SSL もロードバランサーへ移すため、[AmazonLinux2023 に GitLab をインストール](https://qiita.com/kooohei/items/c7431d6546cdbf41a58f) からこちらの作業を行っても大丈夫です。


# 事前作業
今回の作業を行う前に以下の準備をしておきます。

## セキュリティグループ の作成
NLB用に以下の設定で作成しておきます。

- gitlab-nlb

|タイプ|プロトコル|ポート|ソース|
|-----|---|---|---------|
|HTTPS|TCP|443|0.0.0.0/0|

## ACM による SSL証明書 の作成
NLB で利用する SSL証明書 を ACM を使って用意しておきます。

## バックアップ
現在の状態にいつでも戻せるようにバックアップを取っておきましょう。
```bash:バックアップ
$ sudo cp -pi /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_yyyymmdd
```


# 構成
今回は以下のような構成になります。
![スクリーンショット 2023-10-11 17.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/99704083-af38-7fcf-d35c-e8c8e6e94adc.png)


# ロードバランサーの作成
今回作成するロードバランサーはNLBになります。

## ターゲットグループの作成
- EC2 > ターゲットグループ > ターゲットグループの作成

|項目             |値                      |
|----------------|------------------------|
|ターゲットタイプの選択|インスタンス               |
|ターゲットグループ名 |gitlab-nlb              |
|プロトコル         |TCP, ポート：80            |
|IP アドレスタイプ   |IPv4                    |
|VPC             |GitLabのインスタンスと同じVPC|


## ヘルスチェック

|項目               |値            |
|------------------|--------------|
|ヘルスチェックプロトコル |HTTP          |
|ヘルスチェックパス     |/users/sign_in|

![スクリーンショット 2023-10-06 14.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/2ec22829-bed7-3668-2ebd-ee966ea99163.png)

## ターゲットの登録
- GitLabインスタンスをチェックして 保留中として以下を含める をクリック
![スクリーンショット 2023-10-06 14.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/6e7366d6-fd6f-5f49-cbb5-834e821ed6fb.png)
- ターゲットを確認 で指定したインスタンスが追加されていること確認
![スクリーンショット 2023-10-06 14.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/28d47904-3af0-67b8-f016-47b6a2cc6dcf.png)
- ターゲットグループの作成 をクリック

## ロードバランサーの作成
- EC2 > ロードバランサー > ロードバランサーの作成
- ロードバランサータイプ で Network Load Balancer を作成

### 基本的な設定
|項目               |値            |
|------------------|--------------|
|ロードバランサー名     |gitlab-nlb    |
|スキーム            |インターネット向け |
|IP アドレスタイプ      |Ipv4         |

![スクリーンショット 2023-10-06 14.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/47736063-1af6-6532-5d30-c9d042e9ab83.png)

### ネットワークマッピング
|項目               |値                                                 |
|------------------|---------------------------------------------------|
|VPC               | GitLabのインスタンスと同じVPC                          |
|マッピング           |ap-northeast-1a, ap-northeast-1c, ap-northeast-1d  |
| - サブネット           |パブリックサブネットを選択(デフォルトVPCの場合は全てチェックでOK) |
|- IPv4 アドレス       |AWS によって割り当て済み                                |

![スクリーンショット 2023-10-06 14.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/e5829eb1-64d7-d8de-68cd-c8d11e6b4114.png)

### セキュリティグループ
事前に作成した gitlab-nlb を指定
![スクリーンショット 2023-10-06 14.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/d436945d-082c-503c-fe98-f2dd4953958f.png)

### リスナーとルーティング
|項目               |値            |
|------------------|--------------|
|プロトコル           |TLS           |
|ポート              |443           |
|デフォルトアクション    |gitlab-nlb    |

![スクリーンショット 2023-10-06 14.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/ac22aaeb-b5f9-4458-68c3-d281d69ff41f.png)

### セキュアリスナーの設定
|項目                    |値                                       |
|-----------------------|-----------------------------------------|
|セキュリティポリシー情報      |ELBSecurityPolicy-TLS13-1-2-2021-06(推奨) |
|デフォルトの SSL/TLS 証明書 |ACMで用意したSSL証明書を指定                 |
|ALPN ポリシー             |None                                     |

![スクリーンショット 2023-10-06 14.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/18cd06b4-db2b-a97c-57e7-0cf9a3382bfc.png)


# セキュリティグループの変更
GitLabに付与しているセキュリティグループの設定を以下に変更します。

|タイプ |プロトコル|ポート|ソース     |
|-----|-------|-----|---------|
|SSH  |TCP    |22   |接続元IP  |
|HTTP |TCP    |80   |gitlab-nlbのSecurityGroup|


# Elastic Load Balancer 経由へ切り替え
現在、EC2へアクセスができる状態になっていたと思いますが、これをELB経由にしたいと思います。

```bash:編集
$ sudo vim /etc/gitlab/gitlab.rb
```
[GitLab に Let's Encrypt で SSL を設定](https://qiita.com/kooohei/items/f7b7829243f766b6b0c1#%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E8%A8%AD%E5%AE%9A) を行った後の場合、以下のような差分が出ると思います。

```bash:修正差分（GitLab に Let's Encrypt で SSL を設定）
$ sudo diff -y --suppress-common-lines /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_yyyymmdd
 nginx['listen_port'] = 80				      |	# nginx['listen_port'] = nil
 nginx['listen_https'] = false				      |	# nginx['listen_https'] = nil
# letsencrypt['auto_renew'] = true			      |	 letsencrypt['auto_renew'] = true
# letsencrypt['auto_renew_hour'] = 21			      |	 letsencrypt['auto_renew_hour'] = 21
# letsencrypt['auto_renew_minute'] = 30 # Should be a number  |	 letsencrypt['auto_renew_minute'] = 30 # Should be a number o
# letsencrypt['auto_renew_day_of_month'] = "*/7"	      |	 letsencrypt['auto_renew_day_of_month'] = "*/7"
```
ここでは、インスタンス側で有効にしていた Let's Encrypt を無効にしています。
また、nginx[] のところは NLB では HTTPS で受けて、 EC2 側では ポート80 で受けるための設定になります。

もし、[AmazonLinux2023 に GitLab をインストール](https://qiita.com/kooohei/items/c7431d6546cdbf41a58f) からこちらを実施した場合は以下のような差分が出ると思います。
```bash:修正差分（AmazonLinux2023 に GitLab をインストール）
$ sudo diff -y --suppress-common-lines /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_org 
external_url 'https://sample.hengjiu.jp'		      |	external_url 'http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.
 nginx['listen_port'] = 80				      |	# nginx['listen_port'] = nil
 nginx['listen_https'] = false				      |	# nginx['listen_https'] = nil
```
ELBでSSLを利用するため外部URLに `https://<独自ドメイン>` を設定します。
また、nginx[] のところは NLB では HTTPS で受けて、 EC2 側では ポート80 で受けるための設定になります。

修正したら、 `gitlab-ctl reconfigure` します。
```bash:reconfigure
$ sudo gitlab-ctl reconfigure
[xxxx-xx-xxT14:40:27+00:00] INFO: Started Cinc Zero at chefzero://localhost:1 with repository at /opt/gitlab/embedded (One version per cookbook)
Cinc Client, version 17.10.0
Patents: https://www.chef.io/patents
Infra Phase starting
~~~
Running handlers:
[xxxx-xx-xxT01:52:15+00:00] INFO: Running report handlers
Running handlers complete
[xxxx-xx-xxT01:52:15+00:00] INFO: Report handlers complete
Infra Phase complete, 20/851 resources updated in 01 minutes 53 seconds
gitlab Reconfigured!
```
`gitlab Reconfigured!` が確認できれば更新完了です。


# DNS の設定
ドメイン(sample.hengjiu.jp) を NLB と紐付けます。
今回は Route53 でドメイン管理しているので Alias 設定を行います。

# 確認
ブラウザからアクセスできれば完了です。

# おわりに
今回は過去の記事の続きとして作業しましたが、この構成にする場合は EC2 インスタンスはプライベートネットワークに配置した方が良いと思います。
![スクリーンショット 2023-10-11 17.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/5c769f49-57d3-b562-c549-33a9fca05987.png)
その場合、SSHが直接できないためセッションマネージャ経由などで作業するなどして構築してください。


# その他の GitLab に関する投稿
GitLab に関する記事は他にも投稿しているのでよければ読んでもらえたら嬉しいです。

https://qiita.com/kooohei/items/c7431d6546cdbf41a58f

https://qiita.com/kooohei/items/f7b7829243f766b6b0c1

https://qiita.com/kooohei/items/ff235f7857c8593801dc

https://qiita.com/kooohei/items/5fd8f81e5f099544e61d


### 参考

https://docs.gitlab.com/omnibus/settings/ssl/#configure-a-reverse-proxy-or-load-balancer-ssl-termination