2020/9/18に行われたオンライン勉強会 https://lancersrecruit.connpass.com/event/187989/ で発表した資料です。
開発環境へのDocker採用から本番環境への適用の歴史と、ECSを選択した理由について冒頭で話しました。
※具体的な本番環境の事例はこちら https://speakerdeck.com/rvirus0817/fargatefalsehuo-yong-shi-li-ruby-on-railsbian
2020/9/18 オンライン勉強会https://www.lancers.jp/Yuki Kanazawa本番環境のECS/Fargate採用
View Slide
2020/9/18 オンライン勉強会自己紹介 2氏名:金澤 裕毅出身:宮城県仙台市Lancers, Inc. / Site Reliability Engineer (2013/11 -)趣味: 将棋(ウォーズ初段、将棋倶楽部24で1000点くらい)Github:yKanazawaTwitter: @yakitori009Language: C++, Java, PHP, Go
2020/9/18 オンライン勉強会About Lancershttps://www.lancers.jp/Genre: CrowdsourcingStart: 2008/4PHP5.2 → 5.3 → 5.6 → 7.3CakePHP1.2 → 1.3 → 2.8 → 2.102017年時点 現在
2020/9/18 オンライン勉強会4ランサーズのサーバー構成EC2instanceCloudSearchCloudFront Route 53 CloudFrontALB ALB API GatewayLambdaAutoScaling AppS3AuroraReaderAuroraReaderAuroraWriterApiElastiCacheRedisAI系APIサムネイル表示仕事検索ランサー検索ランサーズBatchPHP7CakePHP2.10Python3MySQL5.7
2020/9/18 オンライン勉強会開発環境Docker化の経緯
2020/9/18 オンライン勉強会6VMをDockerに置き換え192.168.33.15HDD 50GBメモリ 1GB認証システム192.168.33.11HDD 50GBメモリ 2GBApp(ランサーズ本体)Apache 2.2 (80)PHP 5.3MySQL 5.6 (3306)Memcached(11211)192.168.33.13HDD 50GBメモリ 1GBWordPress(コーポレート、ブログ等)Apache 2.4(80)PHP 5.5MySQL 5.6(3306)192.168.33.12HDD 50GBメモリ 1GBメッセージ(チャット)Nginx(3443)node.js(3001)Redis(6379)HDD 20GBメモリ 2GB172.17.6.11App(ランサーズ本体)Apache 2.2 (80)PHP 5.3172.17.4.51コーポレート、ブログ等)Apache 2.4(80)PHP 5.5172.17.4.152メッセージ(チャット)Nginx(3443)node.js (3001)172.17.106.55認証システム新サービス開発の度にVMを作成1つのVMに各種コンテナを配置
2020/9/18 オンライン勉強会7Docker移行の方針●本番環境と極力同じ構成を再現○AWSのマネージド系のサービス■Dockerfileで作成○AWSのEC2で構築しているサーバー■Dockerfile + Ansibleで作成■Ansibleを実行するコンテナを用意●本番と同じPlaybookで構築AppELBErastiCacheMemcachedErastiCacheRedisAuroraEC2instanceWordpressEC2instance WebSocket AppRedis MySQLELBWordPressMemcachedWebSocketEC2instanceELBRDSELBSSL Terminateリバースプロキシデータ入り
2020/9/18 オンライン勉強会8Docker移行の方針EC2MySQLデータ開発用データAppAnsibleWordPress MySQLWebSocketWordPressApp WebSocketMySQLPlaybookdockerpushdockerpulldockerbuildAmazon ECR●構築に時間をかけない○コンテナをpullするだけで完了コンテナはインフラチームが構築アプリチームはコンテナをpullするだけ
2020/9/18 オンライン勉強会リリース環境について
2020/9/18 オンライン勉強会10リリースの自動化と委譲●Webからリリース可能なシステムを構築○アプリエンジニアやデザイナーでもリリース可能
2020/9/18 オンライン勉強会11リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instanceDeveloper●Githubにpush
2020/9/18 オンライン勉強会12リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instanceDeveloper●Webデプロイシステムからリリース
2020/9/18 オンライン勉強会13リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instanceDeveloper●DeployサーバーがGithubからpull
2020/9/18 オンライン勉強会14リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instancecomposerinstallDeveloper●composer installの実行○開発用Appコンテナを起動
2020/9/18 オンライン勉強会15リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instancersyncDeveloper●カナリア環境にrsync○最終確認
2020/9/18 オンライン勉強会16リリースフローEC2AppDeployEC2instanceEC2Canaria AppEC2instancersyncDeveloper●本番環境にrsync
2020/9/18 オンライン勉強会17リリースシステムEC2AppDeployEC2instanceEC2Canaria AppEC2instanceS3Cloud Frontrsync静的ファイルキャッシュクリアcomposerinstallnodeinstallgobuildWordpressEC2instanceEC2ApiDeveloper●ランサーズ以外のサービスにも拡張○unicornの再起動○S3への配置○CloudFrontのキャッシュクリア
2020/9/18 オンライン勉強会本番環境のDocker化検討
2020/9/18 オンライン勉強会本番環境をDocker化するメリット・デメリット●メリット○リリースの仕組みを作りやすい■CIでコンテナごとリリース■ChatOpsでのリリースも作りやすい○ミドルウェアの変更がリリースで可能■PHPのバージョンアップ等○素早く柔軟なオートスケーリング■起動が早い●デメリット○リリースに時間がかかる■リリースの度にコンテナを再構築■3分以上はかかる○サーバー費用■Fargateでも割高
2020/9/18 オンライン勉強会現サービスをDockerしていない理由●リリースの仕組みが既にできている●リリースにかかる時間○現リリースシステムは30秒でリリースできる●サーバー費用○現状、EC2で運用した方がFargateより安い●新サービスなら採用しても良いかも
2020/9/18 オンライン勉強会新サービスにDockerを採用した理由●リリースの仕組みを作らなくて良いこと○CircleCIでリリース○検証環境にコマンドでリリース■CircleCIのAPIを叩く●オートスケーリングの仕組みを作らなくて良いこと○EC2の場合■AMIから起動時に最新ソースを取得■ミドルウェアの更新時にAMIの更新が必要○Dockerの場合■リリースの都度コンテナを作成■リリースしたコンテナはImmutable●ミドルウェアの更新を開発者に任せられること○EC2の場合■手動で適用してAMIの更新が必要○Dockerの場合■Dockerfileを修正してもらえばOK
2020/9/18 オンライン勉強会EKSを採用しなかった理由
2020/9/18 オンライン勉強会Kubernetesの役割●サービスディスカバリーと負荷分散●ストレージ オーケストレーション●自動化されたロールアウトとロールバック●自動ピンバック●自己修復●機密情報と構成管理
2020/9/18 オンライン勉強会Kubernetesを採用しなかった理由●ECSの方がリリースが早かった○知見を以前より貯めていた●AWSのインフラ運用のノウハウを活用したい○Kubernetesの新しい概念を学習するコスト●頻繁で互換性のないバージョンアップ○新バージョンへの追従が難しい■新しい概念を都度学習して適用する必要性●小規模なモノリスのサービスで採用する意義○簡単な新規サービスで採用する運用コスト
2020/9/18 オンライン勉強会Kubernatesの採用条件●Kubernetes採用のメリットがでそうな条件○マルチクラウドで冗長化するパターン■運用をKubernetesに統一できる○マイクロサービスで構築するパターン■サービス群を統合的に操作したい場合●ECS/Fargateのこれからにも期待●Kubernetesの採用条件○落ち着いたバージョンアップ■追従が難しくなくなる程度に。。○Kubernetesがデファクトスタンダードになった場合■共通ツールとしての地位を確立した場合