
【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)は、インフラストラクチャをコードとして定義するためのツールキットです!😴
従来のCloudFormationやTerraformと比較して、以下のような特徴があります
プログラミング言語のサポート:TypeScript、Python、Java、C#など、一般的なプログラミング言語を使用してインフラを定義できます。これにより、開発者は慣れ親しんだ言語でインフラをコード化でき、再利用性や保守性が向上します。
抽象化と高レベルのコンポーネント:CDKは高レベルのコンポーネント(Construct)を提供しており、複雑なインフラ構成を簡単に管理できます。これにより、コードの量を減らし、理解しやすくすることが可能です。
統合されたデプロイメント:CDKはCloudFormationと統合されており、デプロイメントプロセスがスムーズです。CloudFormationの強力な機能を活用しつつ、より柔軟なコード記述が可能です。
これらの特徴により、AWS CDKは開発者にとって非常に魅力的なツールとなっています。
まずは、Docmostをローカル上で起動してみよう
Docmostの公式リポジトリでは、docker-compose.ymlが提供されています。
Docmostは、ユーザーの招待には、SMTPサーバーを使う方法しか現状サポートされていません…🥹
そのため、SMTPサーバーを自前で用意しないとユーザーの招待ができません。
ローカル上で確認するだけなので、開発用メールサーバーとしてよく使われるMailpitを使って、mailコンテナを追加しました。
基本操作、ユーザーの招待などが問題なく動作することが確認できました!✨





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


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


少し待ちます…🫠🏝️


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もご覧ください🙌