最強のWiki「GROWI」を Terraform を使って超絶簡易的に EC2 にデプロイして個人利用する【GROWI】【AWS】

[2021/07/17 18:00] ~~今日か明日Dockerfile, Terraform fileを修正しますのでそれまで動かないです。~~

[2021/07/17 22:26] Dockerfile, Terraform fileを更新しました。

* Dockerfile
  * growi:4.3 がubuntuベースのイメージになったためapt-getに変更
* Terraform file
  * terraform ブロック内で変数を使用していたため定数値に変更

# この記事の目的
GROWI をインターネット上で使いたい人が使えるようにすることのみです。
技術的な解説などは全て省きたいと思います。手順と手順の目的と概要のみを記します。
ただ、超簡易的な方法になるので念のため自己責任でお願いします。

# 注意事項
* 本当に簡易的です。
* Elastic Searchは使いません。
* httpsでの接続はしません。
* アクセス数によっては費用が発生する可能性があります。
* この記事はクオリティ的には未完成ですのでフィードバックをいただけると嬉しいです。すぐに改善します。

# 前提知識
手順通りやればできるようになっています。基本的な知識があればできます。ググれば誰でもできます。

# デプロイに必要なもの
* AWS アカウント
* Docker がインストールされているPC

# 今回のデプロイの方針
今回は、とにかく個人利用でセキュリティも何もいらなく、とにかく GROWI が使えればいいと言う方針でやっていきます。

さらに、ほぼ無料で使いたいと言う欲望から、Elastic Searchは使わないことにします。これがあるだけでハイスペックinstanceが必要になり、月々数千円と言うお金がかかってしまうからです。他にも様々な問題が出るかもしれませんが、それは今後改善していきましょう。

# GROWI
一言で言うと、「最強のWiki OSS」です。
強力なマークダウンと、URLベースのページ作成、Elastic Search による全文検索(今回は使わない)、Slack 統合などなど ...

# Terraform
Infrastructure as Code を可能にするツールです。便利なので使っていきます。
コマンド一つでインフラを構築し、コマンド一つでインフラを削除できる、僕が好きなツールです。

# EC2
AWS で最も有名なサービスの一つ。無料枠を使えばお金がほぼかからないので、GROWI の個人利用にはこれを使っていきたいと思っています。

# S3, DynamoDB
Terraform のバージョン管理に使います。

## aws-vault
[aws-vaultの使いかた](https://qiita.com/montanha_masu536/items/e066604d0acaba679069)

# AWS構成
```js
VPC {
  Public Subnet + IGW {
    EC2 { ssh, httpを通す
      Docker { GROWI, MongoDB ... }
    }
  }
}
```
最もシンプルな方法の一つでいきます。

# デプロイ手順
バージョンを固定してデプロイするので、ほぼ100％再現できるはずです。

## AWSアカウントを作成し、結構権限多めの IAMユーザー を用意する
ここは調べてください。最悪ルートユーザーでもいいです。IAM の権限を絞る作業は超憂鬱なので。
個人の趣味での利用なら AdministratorAccess で構いません。

## 作ったIAMのAccess Keyを発行し、aws-vaultに登録する
[aws-vaultの使いかた](https://qiita.com/montanha_masu536/items/e066604d0acaba679069) に沿ってやればできるはずです。

## Terraform 用の S3 Bucket を作る
S3のダッシュボードに行って、
Create Bucket を押して、
好きな名前入力して、
Block All Public Access にチェックが入ってることを確認して、
Bucket Versioning を Enable にして、
Create。

Terraform の State を管理するファイルの保存場所になります。

## DynamoDBで terraform state lock 用のテーブルを作成する
DynamoDB のダッシュボードに行って、
Create Table を押して、
Table name を適当に入力して、
Primary Key を "LockID" にして(好きな名前でいいが、結構これが使われてる気がする)、
Create。

先ほどの State のバージョンを一意に固定するためのものです。(２つ以上存在したらどっちが本物かわからなくなる)

## Git clone
今回作ったTerraformの環境をクローンします。

```sh
$ mkdir 好きな名前
$ cd 好きな名前
$ git clone https://github.com/hakumizuki/grw-easy-infra.git
$ ls
 > ちゃんとできているか確認。 grw-easy-infra と表示されるはず
```

## ファイルを編集
grw-easy-infra の中にある、change.tf の指示通りに編集してください。

## Terraform の初期化
grw-easy-infraに移動して、初期化。
aws-vault の行は、[aws-vaultの使いかた](https://qiita.com/montanha_masu536/items/e066604d0acaba679069) をもう一度見てください。

```sh
$ cd grw-easy-infra
$ aws-vault exec iamのusername --duration=12h
$ docker-compose -f infra/docker-compose.yml run --rm terraform init
```

## ※ここからお金が発生する可能性がある作業です(少額のはず)※
## EC2インスタンスを起動する

```sh
$ docker-compose -f infra/docker-compose.yml run --rm terraform apply
 > yes と入力し、Enter
```

## ちょっとまってからGROWIに接続
ec2 instanceは今回 t2.microを使っているので dockerなどのインストールや、docker-compose up時のimageの取得に多少時間がかかるので3分ほど待ちます。コーラを飲んで、ラムネを食べましょう。プリンは [治一郎のプリン](https://jiichiro.com/products/179/) がお勧めです。

## 接続して使ってみよう
terraform apply コマンドの出力結果に "growi_url" というものがあるはずなので、それをそのままコピペして接続してみましょう。(http://XXX.XXX.XXX.XXX:3000)
Install 画面が表示されたら成功です。
※ SSL化されていないので普段使っているパスワードやemailなどは念のため入力しない方がいいです。
![Screenshot 2021-07-18 at 0.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481253/dc383419-28e5-9d15-043c-b07ed757111e.png)

## GROWI の使い方はこちらを参考に
[GROWI Docs](https://docs.growi.org/ja/)

## 今回作った物を全て抹消する方法
目的によって作業の開始箇所を変えてください。

### もうGROWIを使わない場合はここから
aws のコンソールにログインして 今回作った ~~IAM~~, S3 Bucket, DynamoDB Tableを全て削除します。ただし、もう一度やりたくなった場合は再度作ってください。

(7/16 9:35追記)
**IAMは消さないでください！次のステップができなくなります！**

### Terraformのコマンドでエラーが出ていて一旦やり直したい場合はここから
grw-easy-infra に移動し、

```sh
$ docker-compose -f infra/docker-compose.yml run --rm terraform destroy
 > yes と入力し、Enter
```

これでEC2 インスタンス, VPC, Subnet, Elastic IP が削除されます。
もう一度立ち上げたい場合はdestroyの部分をapplyにすればOKです。

# どんな質問でも受け付けています
コメントで質問していただければお答えします。
誤字などの指摘もとてもありがたいです。

# 余談(超初学者の方へ)
今回、Docker, TerraformなどのツールやAWSを使ってきました。もしかしたら読者の方の中には、これらの知識がまだそんなにないような方もいるかもしれません。もし興味を持っていただけたら幸いです。ですが、DockerやTerraformなどのツールだけを勉強することはお勧めしません。TCP/IPとはなにか？サブネットはなんのためにあるのか？ルーターとは？など、基礎がわかっていると、そういったツールの勉強の効率は跳ね上がります。もし行き詰まった時はネットワークの本などを読んでみてください。(初学者からのアドバイスです)