GitLab のメール送信機能を SES を使って実装する

# はじめに
GitLab を利用する際にユーザー作成通知やパスワードリセットなどを行うためのメール送信機能が必要になると思います。
今回はその機能を Amazon SES を使って有効化したいと思います。

# 前提
今回は SES の用意ができている前提で作業を行います。
以下は SES を利用するにあたり必要な内容ですので事前に済ませておいてください。
- 送信用ドメインの登録
![スクリーンショット 2023-10-24 19.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/7f03ad6f-93b2-cb15-fbba-fe18104eb9bc.png)
- 本番アクセス許可設定
![スクリーンショット 2023-10-24 19.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/b5c9d929-3eb6-0be9-a0c7-422409b1b2a3.png)


# 事前準備
まずは事前準備を行います。
## SMTP ユーザーの作成
GitLab が利用する SMTP ユーザーの作成を行います。
![スクリーンショット 2023-10-24 19.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/a9935083-cd51-ecc8-81a0-5382ffadfa72.png)
![スクリーンショット 2023-10-24 19.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/2df0e07b-511d-1a41-8d44-3b09e757cc14.png)

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

# Amazon SES の実装
基本的に GitLab の設定は gitlab.rb で行えます。
```bash:編集
$ sudo vim /etc/gitlab/gitlab.rb
```

```bash:修正差分
$ sudo diff -y --suppress-common-lines /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_yyyymmdd
 gitlab_rails['smtp_enable'] = true			                         |	# gitlab_rails['smtp_enable'] = true
 gitlab_rails['smtp_address'] = "email-smtp.ap-northeast-1.amazonaws |	# gitlab_rails['smtp_address'] = "smtp.server"
 gitlab_rails['smtp_port'] = 587			                         |	# gitlab_rails['smtp_port'] = 465
 gitlab_rails['smtp_user_name'] = "************"                     |	# gitlab_rails['smtp_user_name'] = "smtp user"
 gitlab_rails['smtp_password'] = "******************                 |	# gitlab_rails['smtp_password'] = "smtp password"
 gitlab_rails['smtp_domain'] = "sample.hengjiu.jp"	                 |	# gitlab_rails['smtp_domain'] = "example.com"
 gitlab_rails['smtp_authentication'] = "login"     	                 |	# gitlab_rails['smtp_authentication'] = "login"
 gitlab_rails['smtp_enable_starttls_auto'] = true	                 |	# gitlab_rails['smtp_enable_starttls_auto'] = true
 gitlab_rails['gitlab_email_from'] = 'no-reply@sample.hengjiu        |	# gitlab_rails['gitlab_email_from'] = 'example@example.com'
 gitlab_rails['gitlab_email_display_name'] = 'Hengjiu GitLab Support'|	# gitlab_rails['gitlab_email_display_name'] = 'Example'
 gitlab_rails['gitlab_email_reply_to'] = 'no-reply@sample.hengjiu.com|	# gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.co
```
## パラメータ概要
|パラメータ                                   |内容                   |
|------------------------------------------|-----------------------|
|gitlab_rails['smtp_enable']               |SMTPの有効/無効の設定    |
|gitlab_rails['smtp_address']              |SMTPサーバー情報         |
|gitlab_rails['smtp_port']                 |利用ポート ※推奨は587     |
|gitlab_rails['smtp_user_name']            |SMTPユーザー名          |
|gitlab_rails['smtp_password']             |SMTPパスワード           |
|gitlab_rails['smtp_domain']               |メール送信に利用するドメイン |
|gitlab_rails['smtp_authentication']       |SMTPサーバーへの認証方法  |
|gitlab_rails['smtp_enable_starttls_auto'] |STARTTLSを利用するかどうか|
|gitlab_rails['gitlab_email_from']         |送信元(from)メールアドレス |
|gitlab_rails['gitlab_email_display_name'] |メール受信時の表示名      |
|gitlab_rails['gitlab_email_reply_to']     |メール返信先             |


修正したら、 gitlab-ctl reconfigure します。

```bash:reconfigure
$ sudo gitlab-ctl reconfigure
[xxxx-xx-xxT04:58:08+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-xxT04:59:39+00:00] INFO: Running report handlers
Running handlers complete
[xxxx-xx-xxT04:59:39+00:00] INFO: Report handlers complete
Infra Phase complete, 6/850 resources updated in 01 minutes 30 seconds
gitlab Reconfigured!
```

# 確認
GitLabにログインして新規ユーザーの作成を行います。
![スクリーンショット 2023-10-24 11.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/ede1019d-48ea-8e58-2935-7066f4437143.png)

すると、登録したメールアドレスに以下のように送信されているのが確認できます。
![スクリーンショット 2023-10-24 17.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/4a19e8f8-7823-2ab2-405e-423b9f16141e.png)


# おわりに
EC2 を利用する場合、メール送信機能は postfix を利用するよりも SES を利用するのがおすすめです。
また、SES 以外にも Gmail や SendGrid などを利用することもできます。
メール送信機能はセキュリティや運用負荷を考えるとサーバー内で実装するのは極力避けると良いと思います。


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

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

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

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

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


#### 参考
https://gitlab-docs.creationline.com/omnibus/settings/smtp.html