見出し画像

【12/25】AWS CDKで簡単デプロイ!DocmostをECS Fargate上に構築する方法

メリークリスマス!🎄🎅🏼
最近、寒くて運動サボり気味になっています、Marvelの椎名です!🫠

2023年のアドベントカレンダーでは、VPSを使って簡単なサイトを公開してみたという記事を書きました。
2024年は、もっと面白いことをしたい!ということで、今回はAWS CDKを使って、DocmostをECS Fargate上に構築する方法をご紹介します!✨
技術的な内容も含まれますが、できるだけわかりやすく解説していきますので、ぜひ最後までお付き合いください!


Docmostとは?

今年、椎名は社内でAWSサークルを設立しました!✨
サークル内での情報共有を円滑に行うために、ナレッジの共有場所が必要でした。
現在はSlackのCanvasにまとめていますが、使いづらく限界を感じていました…😢
そこで、Notionっぽい無料で使えるサービスを探していたところ、Docmostというソフトウェアを見つけました!🤩

Docmostは、共同編集ができるWikiやドキュメントを残すためのソフトウェアです。
特徴的なのは、セルフホスティング用のオープンソース(OSS)であることです!
自前でサーバーを用意する必要はありますが、工夫すれば最低限のコストで運用可能ですし、オープンソース(OSS)なので、独自にカスタマイズすることも可能です!😆
これらの特徴により、私のニーズにピッタリだと感じました!

Docmost:https://docmost.com/


AWS CDKとは?CloudFormationやTerraformとの違い

AWS CDK(Cloud Development Kit)は、インフラストラクチャをコードとして定義するためのツールキットです!😴
従来のCloudFormationTerraformと比較して、以下のような特徴があります

  • プログラミング言語のサポート:TypeScript、Python、Java、C#など、一般的なプログラミング言語を使用してインフラを定義できます。これにより、開発者は慣れ親しんだ言語でインフラをコード化でき、再利用性や保守性が向上します。

  • 抽象化と高レベルのコンポーネント:CDKは高レベルのコンポーネント(Construct)を提供しており、複雑なインフラ構成を簡単に管理できます。これにより、コードの量を減らし、理解しやすくすることが可能です。

  • 統合されたデプロイメント:CDKはCloudFormationと統合されており、デプロイメントプロセスがスムーズです。CloudFormationの強力な機能を活用しつつ、より柔軟なコード記述が可能です。

これらの特徴により、AWS CDKは開発者にとって非常に魅力的なツールとなっています。

まずは、Docmostをローカル上で起動してみよう

Docmostの公式リポジトリでは、docker-compose.ymlが提供されています。
Docmostは、ユーザーの招待には、SMTPサーバーを使う方法しか現状サポートされていません…🥹
そのため、SMTPサーバーを自前で用意しないとユーザーの招待ができません。
ローカル上で確認するだけなので、開発用メールサーバーとしてよく使われるMailpitを使って、mailコンテナを追加しました。
基本操作、ユーザーの招待などが問題なく動作することが確認できました!✨

初回アクセス時、ワークスペースの作成と管理者ユーザーの作成
試しにページを作成
ユーザーの招待
招待メールが届いていることを確認
Accept Inviteをクリックするとユーザー登録画面が表示されました

AWS CDKでスタックを作成してみよう

構成

  • ドメイン:お名前.comで取得し、Amazon Route 53へドメイン移管

  • Route53:ホスティングゾーンの作成

  • ACM (AWS Certificate Manager):SSL/TLS証明書を管理

  • VPC (Virtual Private Cloud):ネットワークの設定

  • Security Groups:各サービス間のアクセス設定

  • ALB (Application Load Balancer):トラフィックの分散とルーティング

  • Redis:キャッシュとして使用し、アプリケーションのパフォーマンスを向上

  • RDS (Relational Database Service):PostgreSQLデータベースを使用

  • ECS (Elastic Container Service) Fargate:コンテナ化されたアプリケーションのデプロイと管理

  • Secrets Manager:データベースの認証情報など、機密情報を管理

AWS CDKを使用して、先ほど定義したスタックを作成します。
細かく説明したいところですが、長くなってしまうため省略します🙇🏻‍♂️
ソースコードは、リポジトリを公開しているのでこちらをご確認ください!
(2024/12/25:まだ完全に完成していないので、今後さらにアップデートしていきます🔥)

デプロイしてみよう

前提条件

  • AWSアカウントを持っている

  • AWSをCLIから操作可能な状態になっている

  • ドメイン取得済み

  • AWS CLI, AWS CDK(v2), Docker Engineがインストール済み

1. パッケージのインストール

npm ci

2. .envファイルの作成、環境変数の設定

cp .env.example .env

3. lib/docmost-stack.tsのSecrets Manager以下をコメントアウト

RDSのSecret ManagerのARNが動的に取得する実装がまだできていないので、Secret ManagerのARNは後から設定します😭
そのため、Secret Manager以下は、2回目のデプロイで作成します
(今後、デプロイが1回で完了するようにアップデートします)

4. cdk bootstrap

作業するAWSアカウントでCDKを初めて使う場合は、CDKToolKitのスタックを作成するために、このコマンドの実行が必要になります。
※プロファイルを設定している場合は、--profile xxxを追加してください

npx cdk bootstrap

5. cdk deploy

デプロイします
※--rolebackは、デプロイ失敗時にロールバックさせます
※プロファイルを設定している場合は、--profile xxxを追加してください

npx cdk deploy --rollback
作成されるリソース
CloudFormationでリソース作成が進行している

6. Route53のホストゾーンに作成されたネームサーバーをお名前.comで設定

HTTPS通信をするために、SSL証明書が必要になります。
AWS ACMで作成されるようにしていますが、Route53のホストゾーンに作成されたネームサーバーをお名前.comで設定しないとドメイン移管がされずSSL証明書の検証が出来ず、cdk deployが終わらなくなってしまいます。
スタックを削除しない限りは、設定されるNSレコードの値は変動しません。

ネームサーバーを追加
ステータスが、保留中の検証になっている

少し待ちます…🫠🏝️

ステータスが、発行済みに変わってる!
2389秒かかりました…

7. ECRにプッシュ

Docmostの公式のDockerイメージを使えればよかったのですが、ECSとRDS間の通信でSSL認証が必須になっており、SSL認証を無効化する修正をソースコードに行ったので、ECRのプッシュが必要となります。
無効化した理由は、ECSとRDSはプライベートサブネットに配置しているので、SSL認証が無効化されていても問題ないと思ったためです。
※ただし、本番環境をたてる場合は、SSL証明書をAWSからダウンロードしてECS内で使用するように設定した方が良いと思います。

8. Secrets Manager ARNを.envに追加後、Secrets Manager以降のコメントアウトを外して、デプロイ

npx cdk deploy --rollback

9. デプロイ完了

ローカルで試した時と同様に初回アクセス時、ワークスペースの作成と管理者ユーザーの作成がされることが確認できました🥳

まとめ

AWS CDKを活用することで、DocmostをECS Fargate上に簡単にデプロイすることができました。
コストが余分にかかってしまっているところを改善したり、CI/CDを組むなどしてさらに効率化を図ろうと思っています。
ご不明な点や追加の質問がありましたら、ぜひコメントでお知らせください!



Marvelでは今年も『Marvelアドベントカレンダー2024』をやります🎄🎅Marvelのエンジニアがクリスマスまで記事のバトンを繋ぎます🦌🛷
是非毎日のお楽しみとしてご覧ください🎁

★Marvelのアドベントカレンダーはこちら
https://note.com/marvel_engineer/m/ma7e8d8ae4288

Marvelが少しでも気になった方は是非Wantedlyもご覧ください🙌


いいなと思ったら応援しよう!