AWS環境にDocker(dokku)でJenkins構築  -masterインスタンス編-

## はじめに
Jenkins環境をAWS上で新規セットアップする機会があり、その時の手順をまとめました。

## 構築概要
AWSの[VPC推奨構成シナリオ２](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Appendix_NACLs.html#VPC_Appendix_NACLs_Scenario_2)に従ってVPCを設定し、ALBを外部公開し、JenkinsアプリサーバはVPCのinternal環境に配置する構築をします。
Jenkinsアプリサーバ内部は、Dockerのラッパーとしてdokkuを利用してJenkinsイメージを起動します。
※ 構成図にあるスポットインスタンスによるSlave起動については、後日別の記事にする予定です。書きました：[AWS環境にJenkins構築 -スポットインスタンススレーブ編-](https://qiita.com/gutio/items/7372005bb7e39c21b93c)

![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/32726/a2b80fc9-400b-5084-53f1-22e0b3f35454.png)


### ソフトウェアバージョン
EC2 : Ubuntu16.04 (ami-bec974d8)
dokku : v0.10.5
 - https://github.com/dokku/dokku 
 - dokku自体はDockerfileで設定するプライベートherokuのようなものですが、セットアップが簡単でコマンドのラッパーとして便利なので今回はdokkuを利用しています。
jenkinsイメージ : jenkins/jenkins (2.92-alpine) 
 - https://hub.docker.com/r/jenkins/jenkins/

## 構築手順

### 1. Jenkins用IAM作成
- セットアップだけでは特に必要ではありません。ですが、JenkinsからのS3アクセスなどでIAMによる権限設定をしたほうが便利です。今後記事作成予定ですが、スポットインスタンスのEC2 slave作成時には、一部のアクセス権限付与が必要になるためJenkins専用のIAMを作成することをおおすすめします。

### 2. セキュリティグループ作成
ALBに付与するものとJenkinsインスタンスに付与するものを作成します。

- ALBに付与するもの
 - 外部のネットワーク(0.0.0.0/0:80, 0.0.0.0/0:443)からwebアクセスを受け入れるよう設定。必要に応じて受け入れ範囲を会社のIPなどに変更してください。
- Jenkinsインスタンスに付与するもの
 - ALBに付与するセキュリティグループから8080ポート(Jenkinsポート)にアクセスを受け入れる

### 3. EC2でJenkinsホスト用のUbuntuのインスタンスを作成
- Ubuntu16.04のイメージでEC2インスタンスを作成します。

### 4. dokkuのインストール
- 3で作成したEC2インスタンスにログインし、Dockerのラッパーコマンドとしてdokkuをインストールします。

```shell-session
$ wget https://raw.githubusercontent.com/dokku/dokku/v0.10.5/bootstrap.sh
$ sudo DOKKU_TAG=v0.10.5 bash bootstrap.sh
```

### 5. Jenkinsイメージ起動
- dokkuにjenkinsを登録し、Docker Hub で公開されているJenkinsイメージを起動します

```shell-session
$ dokku apps:create jenkins
$ docker pull jenkins/jenkins:2.92-alpine
$ docker tag jenkins/jenkins:2.92-alpine dokku/jenkins:2.92-alpine
$ dokku tags:deploy jenkins 2.92-alpine
```

- Dockerコンテナをデプロイして、Jenkinsイメージでそのまま起動することも出来ます。ですが、そのままだとJenkins自体のバージョンアップなどでコンテナを作り直した際に、workspaceやpluginのインストールなどの設定も全て消えてしまいます。その為、それらデータをホストマシンに保存するためホストマシンのディスクをjenkins側の保存領域へマウントし再起動します。

```shell-session
$ mkdir /var/jenkins_home
$ chmod 755 /var/jenkins_home
$ dokku storage:mount jenkins /var/jenkins_home:/var/jenkins_home
```

### 6. Jenkinsの初期パスワード取得
- jenkinsは初回起動時の設定用パスワードをログ出力しています。そのパスワードを取得します

```shell-session
$ dokku logs jenkins
略
*************************************************************
*************************************************************
************************************************************* 
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

ここにパス文字列

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
```

### 7. 外部からアクセスするためのALB設定
※ 一部インスタンスIDなどが表示されている箇所は消してあります。
１. ALBで設定するため80番ポートで受信するターゲットグループを作成します。
<img width="616" alt="スクリーンショット 2017-12-05 19.52.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/32726/8f239abe-3f59-7702-f3ee-44076eb3b080.png">

２. 1.で作成したターゲットグループにJenkinsインスタンスの8080ポートへのルーティングを追加します。
<img width="1389" alt="スクリーンショット 2017-12-05 19.54.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/32726/8fc575cd-0c65-4c59-ee1d-46a4e9e39dfe.png">

３. ALBを作成し、2.で編集したターゲットグループをリスナーに追加します
<img width="899" alt="スクリーンショット 2017-12-05 19.56.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/32726/e2e5c8f4-e5d5-b461-e9f3-36a817a619e8.png">


- ALBに証明書をセットし、Route53などで独自ドメインの設定をすることでセキュアな構築も可能です。

### 8. Jenkinsへアクセス
ALBのURLへアクセスしてJenkinsの画面が表示されれば完了です。
6で取得したパスを入力して、基本的なプラグインを選択したり、初期アカウントを作成してください。

## 終わりに

今回の記事ではEC2上にdokkuを用いてJenkinsイメージをデプロイする手順を紹介しました。
今後はEC2のスポットインスタンスを用いてslaveを追加する方法の記事を別途記載する予定です。
書きました：[AWS環境にJenkins構築 -スポットインスタンススレーブ編-](https://qiita.com/gutio/items/7372005bb7e39c21b93c)


最後までお読みいただきありがとうございます。
初めてのQiita執筆で拙い点もあると思いますが今後ともよろしくお願いします。