Wiki.js を AWS ECS on Fargate + RDS で動かすハンズオン

Wiki.js は無料で利用できる OSS の Wiki です。高速な Node.js エンジンで実行され、多機能でデザインもモダンな次世代の Wiki です。

Wiki.js の概要・特徴についてはこの記事にまとめています。

https://qiita.com/Michinosuke/items/e84e0cf00b0a28f0e0f7

そんな Wiki.js を AWS Fargate 上にデプロイしてみます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/1a7c8c43-117c-465b-af60-fe0d719a1e44.png)


## データベース

Wiki.js はデータベースがないと起動できません。まずはデータベースを作成しましょう。

AWS コンソールの RDS のページから、「データベースの作成」を押下します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/787750b2-f089-023c-487e-90245c1f4e7a.png)

:::note warn
リージョンが `アジアパシフィック (東京) ap-northeast-1` になっていることを確認してください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/4101aefc-90ed-0b60-21a0-052e02cbe69f.png)
:::


- データベースの作成方法を選択 : `標準作成`
- エンジンのオプション : `MySQL`
- エンジンバージョン : `Mysql-8.0.35`
- テンプレート : `無料利用枠`
- DBインスタンス識別子 : `wiki-js-mysql`
- 認証情報の設定
  - マスターユーザ名 : `admin`
  - マスターパスワード : `wikis-secret`
- インスタンス : `db.t3.micro`
- ストレージ
  - ストレージタイプ : `汎用 SSD (gp2)`
  - ストレージ割り当て : `20 GiB`
  - 自動スケーリング : `無効`
- 接続
  - `EC2 コンピューティングリソースに接続しない`
  - ネットワークタイプ : `IPv4`
  - VPC : `Default VPC`
  - DB サブネットグループ : `default-vpc`
  - パブリックアクセス : `なし`
  - VPC セキュリティグループ : `default`
  - アベイラビリティーゾーン : `ap-northeast-1a`
  - データベースポート : `3306`
- データベース認証 : `パスワード認証`
- モニタリング : `オフ`
- 追加設定
  - 最初のデータベース名 : `wiki_js`
  - パラメータグループ : `default.mysql8.0`
  - 自動バックアップ : `無効`
  - 暗号化 : `オフ`


> **月額の概算は以下の通りです**
>
> - DB インスタンス: `18.98 USD`
> - ストレージ: `2.76 USD`
> - 合計: `21.74 USD`

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/49ede29f-8e65-d01b-cca6-2b0b973cba54.png)

:::note warn
RDSを使用していないときは、停止するとインスタンスにかかるコストを抑えることができます。
ただし、RDS は停止しても **１週間後に自動で起動される** ことに注意してください。
:::


## ECS タスク定義の作成

Fargate サービスを作成するために、タスク定義を作成しましょう。

AWS コンソールから Fargate のページに行き、「新しいタスク定義の作成」を押下します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/839bbfd0-1bd4-5e6e-90a4-0b0115d24fb9.png)


以下を入力して、タスク定義を作成します。

- タスク定義ファミリー : `wiki-js-task`
- 起動タイプ : `AWS Fargate`
- OS、アーキテクチャ、ネットワークモード : `Linux/X86_64`
- タスクサイズ
    - CPU : `.5 vCPU`
    - メモリ : `1 GB`
- タスクロール : `ecsTaskExecutionRole`
- タスク実行ロール : `ecsTaskExecutionRole`
- コンテナ - 1
    - 名前: `wiki-js-01`
    - イメージ URI: `ghcr.io/requarks/wiki:latest`
    - 必須コンテナ: `はい`
    - プライベートレジストリ: `オフ`
    - ポートマッピング
        - コンテナポート: `3000`
        - プロトコル: `TCP`
        - ポート名: `wiki-js-01-80-tcp`
        - アプリケーションプロトコル: `HTTP`
- 環境変数
    - DB_TYPE : `mysql`
    - DB_HOST : `wiki-js-mysql.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com` （AWS コンソールの RDS ページで確認してください。）
    - DB_PORT : `3306`
    - DB_USER : `admin`
    - DB_PASS : `wikijs-secret`
    - DB_NAME : `wiki_js`

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/2b9cab3f-a790-7774-9be7-02c34094236d.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/a139db9c-0e71-2a77-4db3-4e182a438186.png)




## ECS クラスターの作成

サービスを作成する前に、クラスターを作成しておきます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/221bc16d-b882-c72b-ff33-9804d32b1f0e.png)

- クラスター名: `wiki-js-cluster`
- インフラストラクチャ: `AWS Fargate`

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/9f0667e5-88bc-dd9a-cd34-a562a5516b19.png)



## ECS サービスの作成

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3232373739312f63653561353036622d396136312d373738632d376263302d3131336132333133646666372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/de75cfd1-fca3-11e2-ed15-5a2a18f7e56e.png)

- 既存のクラスター: `wiki-js-cluster`
- アプリケーションタイプ: `サービス`
- サービス名: `wiki-js-service`
- サービスタイプ: `レプリカ`
- 必要なタスク: `1`
- ネットワーキング
    - VPC: `default-vpc`
    - サブネット: `default-subnet-01`, `default-subnet-02`, `default-subnet-03`
    - セキュリティグループ: `default`
    - パブリックIP: `オン`
- ロードバランシング
    - ロードバランサーの種類: `Application Load Balancer`
    - `新しいロードバランサーの作成`
    - ロードバランサー名: `wiki-js-alb`
    - ヘルスチェックの猶予期間: 30s
    - コンテナ
        - ロードバランス用のコンテナの選択: `wiki-js-01`
        - リスナー: `新しいリスナーを作成`
            - ポート: `80`
            - プロトコル: `HTTP`
        - ターゲットグループ: `新しいターゲットグループの作成`
            - ターゲットグループ名: `wiki-js-tg`
            - プロトコル: `HTTP`
            - ヘルスチェックプロトコル: `HTTP`
            - ヘルスチェックパス: `/`

## アクセスしてみる

しばらくして、AWS コンソールでロードバランサーのページにいくと、ALB が作成されています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/63ddc747-0ec5-55cd-3653-43981e4b4881.png)

押下して詳細に進むと、「DNS名」という項目があります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/98070ee5-bddb-21f5-f6ad-0047691c57df.png)

これをコピーしてブラウザに貼り付けてアクセスしてみましょう。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/3e10b8ab-5b01-329a-b215-fb532dae5e13.png)

こんな感じで表示されたら成功です！！ :clap: :clap:


## 感想

Wiki.js は公式がコンテナを配布してくれているので、ビルドやコーディングなしで AWS 上にデプロイできてしまうことがわかりました！


## 参考

- [AWS ECS - Wiki.js](https://docs.requarks.io/install/awsecs)