JenkinsサーバーをAWS EC2上で作った

## はじめに

書き主はサーバーエンジニアではないため
サーバーなどの設定が甘い場合などがあります、参考にする際にはご注意ください。
あと、一部そのままのコピペでは動かないようなものもございますのでご注意ください。

## 動機

現在は大阪の拠点の中でローカルのPCの中でjenkinsサーバーを立ており。
そのサーバーからビルドをするPCをjenkinsにて繋ぎ、
自動ビルドや、定期的なコマンドを実行するなどの動作をしていた。

ただ、最近のコロナ禍により、リモートワークなどが多くなったため、
社外からjenkinsにアクセスする必要性などが出てきた。

じゃあ！サーバー側だけEC2に移して社外からアクセスが出来るようにしよう！

というのが動機になります。

今回はjenkinsサーバーの作成の部分だけ記事化してみました。

## jenkinsサーバー作成
### ざっくり仕様
- AWS(EC2)上にjenkinsサーバーを設置し、大阪のローカルマシン(ノード)でビルドを行えるようにする。
- sslを設定

以上！

### EC2の仕様について
- Ami名 : amzn-ami-2018.03.20210915-amazon-ecs-optimized
- インスタンスタイプ : t2.micro
- ボリュームサイズ : 8gb（ビルドマシンではないため最低限のサイズがあれば良い、好みで変更してください)

### yumの更新と必要パッケージのインストール
```bash
$ sudo yum update
$ sudo yum install git java
```

### dockerにユーザー追加
- dockerについてはAmiに入っているので、ユーザーの追加だけをしておく

```bash
$ docker -v
Docker version 20.10.13, build a224086
$ sudo usermod -a -G docker ec2-user
```

### DockerCompose追加
```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
Docker Compose version v2.7.0
```

### docker用のフォルダの作成
```bash
$ cd /
$ sudo mkdir docker
$ cd docker
$ sudo mkdir jenkins
$ sudo chmod 777 jenkins
$ cd jenkins
```

- 今回はここでGitを利用して作成をしたdocker-compese.ymlのbuildファイルなどを引っ張ってきた
- docker-compose.ymlについては仮で以下を使ったという想定（細かくは違うので動作保証はできません）

```docker-compose.yml
version: '3.7'
services:
	nginx:
		image: nginx:1.21.1
		restart: always
		environment:
		TZ: Asia/Tokyo
		depends_on:
			- jenkins
		ports:
			- "80:80"
			- "443:443"
		volumes:
			- /etc/passwd/:/etc/passwd/:ro
			- /etc/group/:/etc/group/:ro
			- ./etc/letsencrypt/:/etc/letsencrypt/:ro # ssl格納場所
			- ./etc/nginx/conf.d/:/etc/nginx/conf.d/:rw
			- ./var/www/html/:/var/www/html/:rw # 初期ルート
			- ./var/log/nginx/:/var/log/nginx/:rw # ログ保存用

	certbot:
		image: certbot/certbot:v1.21.0
		volumes:
			- ./etc/letsencrypt/:/etc/letsencrypt/:rw
			- ./var/log/letsencrypt/:/var/log/letsencrypt/:rw
			- ./var/www/html/:/var/www/html/:rw
		command: [ "--version" ]

	jenkins:
		image: jenkins/jenkins:2.300
		container_name: jenkins
		restart: always
		environment:
			LANGUAGE: ja_JP.UTF-8
			LANG: ja_JP.UTF-8
			LC_ALL: ja_JP.UTF-8
		ports:
			- "8080:8080"
			- "50000:50000" # SlaveからjenkinsにつなぐためのIP
		volumes:
			- /etc/passwd/:/etc/passwd/:ro
			- /etc/group/:/etc/group/:ro
			- ./var/jenkins_home/:/var/jenkins_home/:rw # jenkinsのWebRootみたいなもの
			- ./var/run/docker.sock/:/var/run/docker.sock/:rw
```

- docker-compose buildで初期設定ファイルの作成

```bash
$ cd /docker/jenkins
$ ls
docker-compose.yml 
$ docker-compose build
$ docker-compose up
~ ログが落ち着いてから停止する ~
$ docker-compose down
```

### nginx用の初期confの作成
- nginxのルート設定を行う

```bash
($ cd /docker/jenkins)
$ cd etc/nginx/conf.d/
$ sudo vi default.conf
```

- default.confの作成する。中身的には以下
- `example.com`の部分はRoute53で作ったドメインなどに指定してください。


```default.conf
server {
    server_name  example.com;
    listen 80;
    listen [::]:80;

    root         /var/www/html;
}
```

### sslの証明書の取得
- dockerを立ち上げる

```bash
$ cd /docker/jenkins
$ docker-compose up -d
```

- 初回のsslの取得を行う

```bash
$ docker-compose run --rm certbot certonly --webroot -w /var/www/html -d example.com
```

### sslに対応したnginxのconfへの修正
- 証明書を取得できたらconfを修正し、sslを有効にする

```bash
$ cd /docker/jenkins/etc/nginx/conf.d/
$ sudo vi default.conf
```


```default.conf
server {
	server_name example.com;
	listen 80;
	listen [::]:80;
	location /.well-known/acme-challenge/ {
		root /var/www/html/;
	}
	location / {
		return 301 https://example.com$request_uri;
	}
}

server {
	server_name example.com;
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:10m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.3 TLSv1.2;
	ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256';
	ssl_prefer_server_ciphers off;
	add_header Strict-Transport-Security "max-age=2592000" always;
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	location / {
		proxy_pass    http://jenkins:8080;
	}
}
```

- nginxを再起動する

```bash
$ docker-compose exec nginx nginx -s reload
```

- `https://example.com/` にアクセスし、jenkinsが表示されるのを確認する。

## 作った後で入れといた方が良かったかもっていう設定
- Jenkinsのログインのタイムアウト設定(初期設定のままだと若干短く感じるので伸ばしておくと快適さは上がるかも)
https://ja.stackoverflow.com/questions/35969/jenkins%E3%81%AE%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E6%99%82%E9%96%93%E5%A4%89%E6%9B%B4%E6%96%B9%E6%B3%95

## 参考サイト
- docker-compose
https://docs.docker.com/compose/install/compose-plugin/#installing-compose-on-linux-systems

- dockerでののssl更新
https://paulownia.hatenablog.com/entry/2020/09/12/150658

### 編集履歴
- 2022/11/18 : 内容的におかしい文言の修正