AWS ECS+EFSでwordpressサイト構築

こんにちは、弥生の林です。
インフラチームで仕事しています。
この記事はMisoca+弥生+ALTOA Advent Calendar 2018 の19日目の記事です。

告知

本日、弊社弥生のユーザー様に向けて、お役立ちコンテンツを配信するWebサイト  弥報Onlineを公開しました。

media.yayoi-kk.co.jp

従来ありました「弥生マルシェ」からのブランドリニューアルになります。
今回こちらのサイトを、AWSのECS+EFS+wordpressで構成しましたのでご紹介させていただきます。

ECSとEFS

ECSはAWSが提供するコンテナ管理サービスです。コンテナの稼働を監視して必要数を保ってくれたり、 コンテナとALBを紐づける等の仕事をしてくれます。
EFSは複数のEC2からNFSを 利用して、並列アクセスが可能な共有ファイルストレージサービスです。

やったことを簡潔に

1.wordpressの設定ファイルやコンテンツはEFSに、DBデータはAuroraに配置します
2.wordpress用のDockerイメージを作ります
3.Dockerイメージをリポジトリ(ECR)に登録します
4.リポジトリのイメージからECSクラスタ上でコンテナを稼働させます

構成は以下のようになりました。 f:id:ym_AdventC:20181217111552p:plain

なぜEFSを使うのか

wordpressの稼働に必要なデータとして、テーマやプラグイン、コンテンツ、設定ファイル(wp-config.php等)があります。設定ファイルにはデータベースへの接続情報等が書いてあります。
本番運用するにあたって、冗長構成を考えます。1台のホスト(EC2)上で動作している時は問題になりませんが、コンテナが稼働しているホストがスケールした時のことを考えると、追加されたホスト上のコンテナからでも該当のファイル群が参照できるようにしないといけません。
コンテナ間でデータを共有したいという人類の普遍的欲求が生まれます。
どうするか。
高可用性の自前共有ストレージ構築?
うっ、、、あたまが、、、あたまがいたい。

しかし頭痛薬として、今年7月のAWSサミットでEFSが東京リージョンで使えるように*1なったので、気軽に上記のような構成を組むことができるようになりました。
f:id:ym_AdventC:20181217162329p:plain

EFSの使い方

コマンドラインから作成します。

$ aws efs create-file-system --creation-token "TestEFS" --performance-mode generalPurpose --throughput-mode bursting --region  ap-northeast-1
$ aws efs create-mount-target --file-system-id "FileSystemId" --subnet-id "subnet-xxxxxxxx" --security-group "sg-xxxxxxxxxx" --region ap-northeast-1

EC2の起動時にユーザーデータで以下を設定しておくと、どのEC2からでもEFSのデータが参照できるようになります。※AmazonLinux

#!/bin/bash
echo ECS_CLUSTER={ECSクラスタ名} >> /etc/ecs/ecs.config
sudo mkdir /efs
sudo yum install -y amazon-efs-utils
sudo echo {EFSのマウントターゲットID}:/ /efs efs tls,_netdev >> /etc/fstab
sudo mount -a -t efs defaults

ちなみにマウントされたLinux上でのEFSの認識サイズは8エクサバイト。全部埋めると月額250億円ぐらいになるようですね。

$ df -h
fs-xxxxxxx.efs.ap-northeast-1.amazonaws.com:/  8.0E  600M  8.0E   1% /efs

今後の期待とか、やりたいこと

EFSのバックアップ

EFStoEFS BackupというソリューションがAWS公式で紹介されていますが、 構成がトゥーマッチなので、とりあえずEFSマウントしたホストからcpで定期的にバックアップしています。
re:Invent2018で発表されたWindowsからもEFSみたいなの使いたいんやでは標準機能でS3にバックアップできるみたいなので、同じような機能が欲しいですね。

ログ周り

awslogsよりfluentdコンテナをたてて何処かに飛ばしたほうが、cloudwatchlogsに出力するよりお財布に良いと思われるのでそのあたりを改善していきたいです。

次回

@ryotaro_kawakamiさんの記事をお送りします。

ではでは、良いお年をお迎えください。

*1: サミットでもう一つ盛り上がっていたAWS Fargateの東京リージョン対応もアナウンスされていますが、 Fargateは現時点でEFSとの連携がサポートされていないようです。