Slide 1

Slide 1 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ECS Fargate + EFSで WordPressのスケールアウト https://www.lancers.jp/ 「テクノロジーで、個をエンパワーメントする」 ランサーズ株式会社 SRE 金澤 裕毅 [Kanazawa Yuki]

Slide 2

Slide 2 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 自己紹介 2 氏名:金澤 裕毅 出身:宮城県仙台市 Lancers, Inc. / Site Reliability Engineer (2013/11 -) 趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい) Github:yKanazawa Twitter: @yakitori009 Language: C++, Java, PHP, Go

Slide 3

Slide 3 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 3 ランサーズを支える技術

Slide 4

Slide 4 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 4 ランサーズの提供サービス APIシステム コーポレートサイト ランサーズ お知らせ 認証システム 広告システム メールシステム 管理画面 電話確認システム 分析システム クラウドソーシング

Slide 5

Slide 5 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のWordPressサーバー構成 ●Appサーバー ○Amazon Linux 1 ○Nginx ○PHP-FPM ○PHP 7.3 ●DBサーバー ○AWS Aurora ■MySQL5.7 ●ソースコード管理 ○Github ○自前のdeployシステムで更新 Route 53 ALB WordPress deploy S3 Aurora Nginx PHP-FPM WorPress ソース

Slide 6

Slide 6 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup Fargate + EFSのWordPressサーバー構成 ●Appコンテナ ○Alphine Linux ○Nginx ○PHP-FPM ○PHP 7.3 ●DBサーバー ○AWS Aurora ■MySQL5.7 ●ソースコード管理 ○Github ○CodeBuildで更新 ■EFS内でgit pullするだけ WordPress Containar S3 Aurora EFS Fargate Route 53 ALB CodeBuild Nginx PHP-FPM WordPress ソース

Slide 7

Slide 7 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup AWS(EC2)で WordPressのスケールアウト

Slide 8

Slide 8 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 復習 ●※PHPカンファレンス仙台で発表した内容をおさらい ○https://bit.ly/3c9NABR

Slide 9

Slide 9 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup スケールアウトの課題

Slide 10

Slide 10 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup DBの問題 ●DBが2つ以上のサーバーに分散してしまう DB DB ALB

Slide 11

Slide 11 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ファイルアップロード問題 ●ファイルのアップロードができない ○どれか1つのインスタンス内ディレクトリしか格納されない wp-content/uploads/ こちら側にしか 格納されない ALB

Slide 12

Slide 12 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup プラグインのアップデート問題 ●管理画面からプラグインをアップデートできない ○どれか1つのインスタンスしかアップデートされない wp-content/plugins/ こちら側しか アップデートされない ALB

Slide 13

Slide 13 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup wp-cronの問題 ●サーバーの数だけ実行されてしまう wp-cron wp-cron ALB

Slide 14

Slide 14 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup スケールアウトの準備

Slide 15

Slide 15 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2の一台構成 Route 53 WordPress

Slide 16

Slide 16 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup データベースの分離 Route 53 WordPress Aurora ●RDS (Aurora)に分離

Slide 17

Slide 17 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup アップロードディレクトリの分離(S3) Route 53 WordPress S3 Aurora ●Webサイトホスティングを設定したS3バケットを構築 ○wp-contents/uploads 以下のファイルをここに格納 Webサイト ホスティングを設定した S3バケットを構築 wp-contents/uploads

Slide 18

Slide 18 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup プラグインごとコード管理する Route 53 WordPress deploy S3 Aurora ●Githubの場合 ○自前で構築したDeployシステムからAppサーバーにsync 独自の デプロイシステム プラグインごと コード管理

Slide 19

Slide 19 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ALB(Application Load Balancer)の追加 Route 53 ALB WordPress deploy S3 Aurora Sessionは wp_optionsテーブルに 格納される

Slide 20

Slide 20 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 独自のデプロイシステム ●全てのWordPressサーバー(EC2)のソースを更新 ○デプロイ時間は1分以内

Slide 21

Slide 21 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のリリースフロー Route 53 ALB WordPress deploy WordPress Developer 1. ローカルPCでupdate 2.git push ●デプロイサーバーでgit pull ○全WordPressサーバーにrsync 4. git pull 5. rsync 3. デプロイシステム からリリース

Slide 22

Slide 22 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup オートスケーリングの構築

Slide 23

Slide 23 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のオートスケーリング ALB WordPress deploy

Slide 24

Slide 24 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のオートスケーリング ALB WordPress deploy WordPress ●AMIからWordPressサーバーを起動 AMI

Slide 25

Slide 25 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のオートスケーリング ALB WordPress deploy WordPress ●Deployサーバーから最新のソースを取得

Slide 26

Slide 26 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のオートスケーリング ALB WordPress deploy WordPress ●ALBにアタッチ

Slide 27

Slide 27 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2オートスケーリングの課題 ALB WordPress deploy WordPress ●デプロイシステムへの依存 ○デプロイサーバーが単一障害点に ●定期的にAMIの取り直しが必要 ○ソースの差分が多くなると時間がかかる ○サーバー構成変更時にも取り直しが必要 ●スケールアウトに時間がかかる ○1分以上 デプロイシステムのメンテナンスも大変 DockerベースにしてDeployサーバーを廃止したい

Slide 28

Slide 28 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup AWS(ECS Fargate + EFS) でWordPressのスケールアウト

Slide 29

Slide 29 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 一般的なDockerによるリリースフロー WordPress Containar S3 Aurora Fargate Route 53 ALB Nginx PHP-FPM ソース User ECR WordPress Containar Dockerfile WordPress ソース リリース時間:約10分 WordPress Containar

Slide 30

Slide 30 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 一般的なDockerによるリリースフロー WordPress Containar S3 Aurora Fargate Route 53 ALB Nginx PHP-FPM ソース User ECR WordPress Containar Dockerfile WordPress ソース WordPressの リポジトリが 10個以上 (約7.5GB) 全て入れる 必要がある WordPress Containar

Slide 31

Slide 31 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ソースコードをEFS側に配置する WordPress Containar S3 Aurora Fargate Route 53 ALB Nginx PHP-FPM User ECR WordPress Containar EFS WordPress ソース Dockerfile リリース時間:約7分 リリース時間:約1分 CodeBuild ソース WordPress Containar

Slide 32

Slide 32 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup CircleCI → Codebuildを経由する理由 ●GitHub → CodeBuild で直接起動も可能 ○しかし、リポジトリの数だけCodeBuildを作る必要がある EFS CodeBuild

Slide 33

Slide 33 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup CircleCI → Codebuildを経由する理由 ●CircleCI からAWS CLIで CodeBuild を起動 ○引数にリポジトリパスを指定 EFS CodeBuild aws --region ap-northeast-1 codebuild start-build --project-name wordpress_ release --environment-variables-override name=RELEASE_PATH,value=engineerblog name=BRANCH,value=BRANCH_NAME

Slide 34

Slide 34 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EFSの検証

Slide 35

Slide 35 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ECS FargateのEFS対応バージョン ●バージョン1.4.0以上で対応 ○※現在はlatestが1.4.0以上になっている

Slide 36

Slide 36 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup サーバーレスポンス ●EC2サーバー ○平均1秒未満(最大約5秒) ●ECS + Fargate ○平均約5秒(最大約10秒) ●Amazon Elastic File System の読み取りスループットが3倍に ○ https://aws.amazon.com/jp/about-aws/whats-new/2021/01/amazon-elastic-file-system-triples-read-throughput/ ○レスポンスが改善 ■平均約5秒→平均約2秒 ■EC2よりは遅いが、実用上問題ないレベルに

Slide 37

Slide 37 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EFSのバーストクレジットを使い切る。。 ●本番リリース後、約1週間でパフォーマンスが急激に低下

Slide 38

Slide 38 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EFSのバーストクレジットを使い切る。。 ●プロビジョニングIOPSを設定 ○EFSのサイズ:約7.5GB ○100MB/sに設定(実際は300MB/s出る) 費用がバカ高い

Slide 39

Slide 39 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup バッチの実行

Slide 40

Slide 40 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup EC2時代のバッチの実行 ●wp-cronは使わずcrontabで制御 ○管理画面用の小さいインスタンス上で実行していた ALB WordPress WordPress Admin WordPress Auto Scaling Group Aurora ここでバッチを実行

Slide 41

Slide 41 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup Docker移行後のバッチ実行 ●ECS Taskで制御 ○AZ障害の対策にもなる ALB WordPress ECS Task WordPress Auto Scaling Group Aurora EFS ここでバッチを実行

Slide 42

Slide 42 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup まとめと今後の課題

Slide 43

Slide 43 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup まとめ(EC2サーバーとの比較) デプロイ バッチ レスポンス サーバー費用 EC2 自前の デプロイサーバー デプロイ時間:1分 管理画面 サーバーで cron 平均約1秒 t3.medium x 平均2台 + 管理画面 (月額約10000円) Docker CIで処理 デプロイ時間:7分 +リポジトリ数 x 3分 ECS Task 平均約2秒 vCPU:2 メモリ:2048MB x 平均4台 + ECS Task (月額約20000円) Docker + EFS CIで処理 デプロイ時間:1分 (Dockerfileは7分) ECS Task 平均約3秒 vCPU:2 メモリ:2048MB x 平均4台 + ECS Task (月額約20000円) + EFS IOPS(100MB/s) (月額約60000円)

Slide 44

Slide 44 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup 今後の課題(サーバー費用を抑えるために) ●CloudFrontの導入 ○クレジットを使い切らないレベルまでキャッシュさせる ○動的コンテンツ(PHP)をキャッシュさせる ■キャッシュ間隔の設定が課題 ●ランキング等は動的に変更される ■セキュリティ面の配慮が必要 ●例えば管理画面はキャッシュできない ●Fargate Spotの導入

Slide 45

Slide 45 text

2021/3/25 SPACEMARKET x Lancers Engineer Meetup ご清聴ありがとうございました!