[AWS]ほぼ全自動Redmine構築


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

  • AWS CloudFormation
  • Ansible
  • Docker/Docker-compose

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

前提条件

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

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

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

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

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

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

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

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

AWS 環境構築

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

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

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

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

などが挙げられます。

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

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

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

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

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

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

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

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

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を叩いてみましょう。

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

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

でログインできます。

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

/home/ec2-user/redmine-docker

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

$ sudo docker-compose down

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

AWSCloudFormation 環境の削除方法

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

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

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

終わりに

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

[追記]

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

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