[AWS]ほぼ全自動Redmine構築

タイトルの通り、AWS環境にほぼ全自動でRedmineを構築したいと思います。
使用する技術は以下の通りです。

* AWS CloudFormation
* Ansible
* Docker/Docker-compose

GitHubにコードを載せているので参照してください

https://github.com/hirotoagu/redmine

## 前提条件

前提条件は以下の通りです。

* AWSアカウントを所持し、キーペアを既に取得していること

AWSアカウントは無料で作成できます。これを機に作成してみてください。

https://aws.amazon.com/jp/register-flow/

キーペアは以前に作成したものを流用しているため、作成方法などは割愛します。

* 構築を行う作業者のPCがMacOSであること

投稿主はMacを使用し構築を行なっています。
ローカルで実行するものはAnsibleしかありませんが、WindowsPCの場合実行手順に差異がある可能性があるため、適宜読み替えてください。

* 作業者PCにAnsibleがインストール済みであること

Ansibleの概要は以下の記事に書いています。
Macの方は`brew`でインストールできます。

https://qiita.com/Hiro-AGU/items/c6e1c86193f23d7cf026

## AWS 環境構築

CloudFormationを使用し、Redmineを構築するための環境を作成します。
CloudFormationとは、AWSサービスを自動で構築することができるサービスです。
詳細は以下を参照してください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html 

CloudFormationを使用する理由として、

* 手動作業を削減できる
* インフラ環境をコード化することができる
* 構築した環境の流用が可能

などが挙げられます。

作成する環境は以下の通りです。 
VPC内にPublicSubnetを配置し、その中にT2.microタイプのインスタンスを一つ立ち上げるのみです。

![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/7f6df03f-0eb1-600b-492a-2556bb5fcddb.png)

ここでは、`create_redmine_env.yml`を使用します。

AWSコンソールから`CloudFormation`のサービス画面に行き、`スタックの作成`を押下してください。

![スクリーンショット 2019-10-22 21.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/cf0cd517-77ca-eb2f-1879-46861c8e9639.png)

`テンプレートファイルのアップロード`を押下し、先ほど作成したymlファイルアップロードします。
完了後、次へを押下してください。

![スクリーンショット 2019-10-22 21.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/77ab1a2e-1508-ec10-e46e-82ad2aebccfc.png)

次に、スタックの名前とキーの指定を行います。
スタックの名前に指定はありませんが、作成した内容がわかる名前にしましょう。
キーの指定では、ご自身が所持する秘密鍵を指定してください。この秘密鍵を使用し、インスタンスにSSH接続します。
入力後、`次へ`を押下してください。

![スクリーンショット 2019-10-22 21.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/4d33eae5-a2f6-5792-0d1e-4998631ccc2a.png)

`スタックオプション設定`はここでは特に設定しません。`次へ`を押下してください。

最後のレビュー画面も問題なければ`スタックの作成`を押下してください。

![スクリーンショット 2019-10-22 21.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/bb5920ec-f297-d7ac-bf77-e47ad1330a03.png)

環境が無事作成されると、`CREATE_COMPRETE`となります。

![スクリーンショット 2019-10-22 21.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/7f7332f9-298d-cd81-915f-6213688f924b.png)

VPCやインスタンスが正常に構築されているかAWSコンソールから確認してみてください。
試しに作業用PCからインスタンスにSSH接続を行います。
PublicIPは`インスタンス`サービスにある`RedmineEnv`インスタンスに紐づいている`IPv4パブリックIP`です。

```
$ ssh -i ~/.ssh/AWS秘密鍵.pem ec2-user@IP
```

ログインできればインスタンスの作成に成功しています。
以上で、CloudFormationを使用した環境の作成は完了です。

## Ansible ファイル準備

次に、Ansibleのファイル準備を行います。
今回はAnsibleを使用し、docker/docker-compose のインストールからRedmineコンテナの立ち上げまで全てを行います。

リポジトリの以下ファイルを、各自の環境に合わせ編集してください。

* hostsファイル

```
[ec2Instance]
xxx.xxx.xxx.xxx <- インスタンスのパブリックIPを記述してください。
```

```roles/redmine/template/docker-compose.yml
version: '3'
services:
  redmine:
    image: redmine:4.0.5
    restart: always
    container_name: redmine_container
    environment:
      - REDMINE_DB_POSTGRES=db
      - REDMINE_DB_USERNAME=postgres
      - REDMINE_DB_PASSWORD=postgres
      - VIRTUAL_HOST=xxx.xxx.xxx.xxx  <- インスタンスのパブリックIPを記述してください。
    expose:
      - 3000
    volumes:
      - ./redmine/files:/usr/src/redmine/files
    links:
      - db
  db:
    image: postgres:10.3
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
  nginx-proxy:
    image: nginx:latest
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
```

```roles/redmine/template/nginx.conf
server{

  server_name xxx.xxx.xxx.xxx;  <- インスタンスのパブリックIPを記述してください。

  location / {
    proxy_pass http://redmine_container:3000;
  }
}
```

以上でファイルの編集は完了です。
hosts,docker-compose.yml, nginx.confをそれぞれご自身のインスタンスのパブリックIPに変更しているか再度確認してください。

## Ansible実行とRedmineの確認

ファイル編集完了後、Ansibleの実行を行います。
playbook.ymlがあるディレクトリへ移動し、以下コマンドを実行してください。

```
$ ansible-playbook -i hosts playbook.yml --private-key=~/.ssh/AWS秘密鍵.pem -u ec2-user

xxx.xxx.xxx.xxx               : ok=13   changed=12   unreachable=0    failed=0
```

上記のように、`ok=13, failed=0` となっていれば正常に完了しています。

ブラウザからインスタンスのパブリックIPを叩いてみましょう。

![スクリーンショット 2019-10-22 22.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/1b02d4f1-22c4-288f-2584-db7e1f64a2fe.png)

正常に起動していることを確認できました。

ログインID: admin
パスワード: admin

でログインできます。

実際にアプリケーションが稼働しているパスは以下になります。
SSH接続し、確認してみてください。

```
/home/ec2-user/redmine-docker
```

ここではDockerの詳細は割愛させて頂きます。
アプリケーションをダウンしたい場合、以下コマンドを実行してください。

```
$ sudo docker-compose down
```

以上で、AWS Redmineの構築は完了です。

## AWSCloudFormation 環境の削除方法

AWS CloudFormationで作成した環境はスタックの削除を行うことで一括削除することが可能です。
AWSコンソールの `CloudFormation`を押下してください。 

今回使用したスタックを押下すると、削除ボタンが現れるので押下します。

![スクリーンショット 2019-10-22 22.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/0602f69a-6cf5-3644-c3b5-c855d0f5fcf9.png)

AWSコンソールから今回作成した環境が全て削除されているか確認を行なってください。

## 終わりに

今回作成した環境はセキュリティが甘いので、本番運用することは推奨しません。

[追記]

ドメインの取得方法について記載しました。
https://qiita.com/Hiro-AGU/items/dd214af790d9d9a7fafe

HTTPS対応方法を記載しました。
https://qiita.com/Hiro-AGU/items/49f34ed259a38193c6be