なぜMattermostを構築したのか?
エグゼクション社内では、メインで使用しているチャットツールの他に、メインが障害等で使えなくなったときに使用するサブツール(グループウェアのメッセージ機能)が用意されていました。
が、そのサブツールが使いづらい・・・という意見が多く出たため、”この際、社内のエンジニアの手でAWS上にMattermostを構築してみようか!”ということで、この社内プロジェクトが走り始めました。
初めてのコンテナ技術だったので、紆余曲折しましたが、なんとか動作したので、そのノウハウ共有にこの記事を書きました。
一からの構築方法というよりポイントとなる点を書いていきます。
間違っている!なんだそれ!など、ツッコミどころもあるかと思いますが、大目に見ていただけると嬉しいです。
システム構成
画像やテキストファイルなどの保存場所としてEFSを使用し、その他データはAuroraを使用しています。
Secrets Managerで管理用のEC2に接続し、そこからECS Execでコンテナ内部に入ったり、5432ポートでDBを触りに行ったりします。(ECS ExecはMattermostのチーム削除など、システムコンソールからではできない操作に使用します。)
ECRにMattermostのイメージを置いて、そこからECSを起動しています。(MattermostのイメージはDockerhubから)
構築全体の流れ
S3(.envファイル置き場)→EFS→ECR(リポジトリ作成、イメージのプッシュなど)→RDS(Aurora)→ECS→ALB→EC2(管理用)
今回は、存在するだけでお金のかかるサービスを後回しにして作成しているので、違和感があるかもしれません。
なお、IAMやVPCなどNW周り、CloudWatchやログなどの運用管理サービスは省略します。
構築のポイント
・Mattermostの設定値を変更する
Mattermostのシステムコンソールの[環境]タブの設定値については、GUI上から設定を変更しても、コンテナ再起動時に設定内容が反映されず消えてしまいます。
そのため、変更したい設定はタスク定義にECSの環境変数に設定するか、envファイルとして引き渡す必要があります。
設定値に対してどの変数を設定する必要があるのかは以下のドキュメントを参照してください。
・参照先DBをAuroraに向かせる
参照先のDBは環境変数で設定します。
コンテナに環境変数を設定するには、タスク定義から環境変数を設定するか、S3に.envファイルを配置し、タスク定義作成時に「ファイルから追加」でS3の.envファイルのパスを指定し、環境変数を設定するかの2つ手段があります。
今回は、タスク定義から直接環境変数を設定しました。
<設定した環境変数>
キー:MM_SQLSETTINGS_DATASOURCE
値:postgres://{DBユーザ名}:{DBパスワード}@{エンドポイント}/{DB名}
なお、実際にこの方法で構築する場合は、この変数にはDBの認証情報が含まれているため、Secrets Managerを使用することを推奨します。
Secrets Managerを使用する方法は以下を参照してください。
・EFSに画像やテキストファイルを保存する
MattermostにアップロードされたファイルはEFSなどのコンテナ外のストレージに保存しないと、再起動時に消えてしまうので、EFSにファイルを保存するように設定します。
これをしないとテキストや画像ファイルの共有やアイコンの画像設定ができません。
Mattermostのデフォルトは、mattermost/data/配下にファイルが保存されます。
なので、コンテナマウントポイントのソースボリュームにEFSを指定し、コンテナパスにmattermost/data/を指定することで、EFSにファイルが保存されるようにします。
・ECSサービスのコンピューティングオプション
「キャパシティプロバイダー戦略」を選択すると、ECS Execを行うことができないため、ECS Execを行いたい場合には、「起動タイプ」を選択する必要があります。
※ECS Execは現在(2023年9月6日)、Auto Scaling グループのキャパシティープロバイダーを使用して起動されたタスクに対応していません。
まとめ
今回は社内サブチャットツールということで、あまり使用しない見込みだったため、Fargateを採用しました。
中に入っていじれるから、とりあえずはEC2か~と思われるかもしれませんが、AWS FargateでもECS Execで中に入れますし、余計なコストや管理面での手間がかかりません。落ちたら自動で上がってくる設定も簡単です。
Mattermostも無料で使用可能で、使ってみるとSlackみたいで使いやすく、モバイルアプリでも使用できるので、今回の構成はサブシステムにはもってこいだと感じました。
ただ、FreeプランのMattermostだと、AD認証ができません。サーバーに招待するにはリンクを共有するか、メールを送る必要があります。
特定の人に限定したアクセスにするためにはAWSかMattermostの設定に工夫が必要かもしれません。
AWSとコンテナの知識が多少あればすぐに構築できると思うので、勉強ついでにやってみてはいかがでしょうか。