タイトルの通り、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サービスを自動で構築することができるサービスです。
詳細は以下を参照してください。
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を記述してください。
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
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