AWS EC2にオレオレ証明書を用いたSSL対応のGitLabをインストールする

## 0. 環境

AMI:`Amazon Linux 2 AMI 2.0.20191217.0 x86_64 HVM gp2 (ami-011facbea5ec0363b)`
リージョン:`Tokyo(ap-northeast-1)`

EC2を立てるところまでは省略します。ただスペックに関しては

> We also strongly recommend at least 4GB of free RAM to run GitLab.
> https://about.gitlab.com/install/#centos-7

とあるように、RAMが4GB以上必要なので、AWS EC2上にGitLabを構築する場合、`t2.medium`以上のマシンスペックが必要になります。（`t2.micro`でインストールすると、インストール直後にめちゃめちゃ重くなりシステム全体がハングアップします）

## 1. 依存ライブラリをインストール
 
[こちら](https://about.gitlab.com/install/#centos-7)の内容に沿って進めていきます。

```shell-session
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
```

上記ページに書いてありますが、以下のコマンドは不要です。

```shell-session
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
```

AWSの場合、firewallの概念はセキュリティグループとしてマネージドでカバーしているためです。実行してもamazon linuxにはfirewall-cmdが存在しないので、コマンドが見つからないと怒られます。

次にpostfixをインストールします。

```shell-session
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
```

## 2. GitLabの導入

### 2.1. GitLabをインストール

次にGitLabのインストールをします。ここでは、`EXTERNAL_URL`にはEC2のPublic DNS(ipv4)を設定しました。Public DNSは、AWSコンソール画面->EC2->左側サイドパネルのインスタンス->作成したEC2を選択->下側パネルの説明タブの中に書いてあります。具体的には`ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com`のようなドメイン名となっています。これ以降は、EC2のPublic DNSを`ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com`と表すこととします。

```
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-ee
```

数分経つとインストールが完了します。

#### Public DNSが出てこない場合

VPCを自作した場合、Public DNSが初めは表示されてない可能性があります。その場合は[AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法](https://qiita.com/sunadoridotnet/items/4ea689ce9f206e78a523)を参考に、設定を変更するとPublic DNSが表示されるようになります。

### 2.2. オレオレ証明書によるSSL設定

[こちら](https://docs.gitlab.com/omnibus/settings/nginx.html#manually-configuring-https)に沿って進めます。 

```
vim /etc/gitlab/gitlab.rb
```

インストール直後は`external_url`にhttpが設定されているのでこれをhttpsに変更します。

```
< external_url "http://[EC2のPublic DNS名]"
---
> external_url "https://[EC2のPublic DNS名]"
```

次にオレオレ証明書を作ります。[httpsの設定とオレオレ証明書(自己署名証明書)の作成](https://qiita.com/miqpim/items/911aa34e128950ec2d09)を参考にさせていただきました。

```
cd /etc/gitlab/ssl
```

```
openssl genrsa -aes128 1024 | sudo tee -a ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com`.key
Enter pass phrase: -> 好きなパスワードを入力
Verifying - Enter pass phrase: -> パスワード再入力
```

`/etc/gitlab/ssl`のオーナーはrootなので、ファイル書き込みにroot権限を持たせるために`sudo tee`を用いています。リダイレクト`>`だと権限エラーになります。

```
openssl req -new -key ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key | sudo tee -a ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.csr
Enter pass phrase for ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key: -> 先ほどのパスワードを入力
```

```
sudo openssl x509 -in ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.csr -days 36500 -req -signkey ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key | sudo tee -a ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.crt
sudo mv ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key.old
Country Name (2 letter code) []:JP
State or Province Name (full name) [Some-State]: -> スキップ
Locality Name (eg, city) []: -> スキップ
Organization Name (eg, company) [Internet Widgits Pty Ltd]: -> スキップ
Organizational Unit Name (eg, section) []: -> スキップ
Common Name (eg, YOUR name) []: ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
Email Address []: -> スキップ

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: -> スキップ
An optional company name []: -> スキップ
```

```
sudo openssl rsa -in ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key.old -out ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key
Enter pass phrase for ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key: -> 先ほどのパスワードを入力
```

ここまで実行すると、`/etc/gitlab/ssl`配下はこのようなファイル構成になるはず。

```
tree
.
├── ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.crt
├── ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.csr
├── ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key
├── ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.key.old
```

この状態でreconfigureします。

```
sudo gitlab-ctl reconfigure
```

`https://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com`にアクセスすることができたら無事にインストール完了です。問題があったらtailしてエラー原因を確認するといいでしょう。

```
sudo gitlab-ctl tail
```

また、今回はオレオレ証明書を使っている影響で、ローカルからClone/Pushなどの操作を加えたときにエラーとなります。これを解消するには、次のコマンドでSSL Verifyを無効にします。（参考:https://qiita.com/karno/items/5ad5006a4912617d2610）

```
git config --global http.sslVerify false
```