20150523 chatwork continuous delivery
TRANSCRIPT
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 2
-自己紹介 -ChatWork株式会社 藤原 吉規 CTO室 サーバーエンジニア 普段は吹田市の事務所にいます
ビジネスチャットツール「チャットワーク」を展開中
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 3
継続的デリバリとは何か?
端的に言えば、Continuous Deliveryは、Iterative Development(繰り返し型の開発)、Continuous Integration(継続的インテグレーション)、Continuous Delivery(継続的デプロイ)を積み重ねていくことで、価値を創出していく全体の流れである、と言える。
Ryuee.com http://www.ryuzee.com/contents/blog/4241
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 4
アジェンダ• ChatWorkの運用状況
• 現状の継続的デリバリー構成
• これまでの課題と解決策
• 現在構築中の継続的デリバリー構成
• まとめ
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 5
ChatWorkの運用状況• 2011年3月のサービス開始から4年以上経過
• 導入社数70,000社、平日は常にピークアクセス
• 機能追加・改善などで、平日はほぼ毎日デプロイ
• Scala化に向けた改善プロジェクトも同時進行
• その上で、安定稼働させることが求められている
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 10
課題
• 以前はEC2,RDS,S3以外のAWSサービスを使いこなせなかった
• スケールアウトするにはこの仕組だけでは不十分
• SQSやDynamoDBを手元で試せる環境がない
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 11
対策と効果• Vagrantに開発環境を統一、Ansibleでセットアップ
• SQS互換のElasticMQ
• DynamoDB Local
• Vagrantでアプリケーションの動作確認を全て行えるため、インフラの改善も行いやすくなった
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 14
課題• デプロイ時に、UnitTestをオールグリーンに保つ
• UnitTest:約4,000
• 全コードの構文・コーディング規約をチェック
• テスト実行時間の増大
• 複数プロジェクトが同時進行、テストの並行Job増大
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 15
対策と効果
• TravisCI+AnsibleでVagrantと同様の環境を構築
• お金で解決!
• TravisCIに課金して、並行稼動数を増やす
• TravisCIのJobを分割、並行稼動させて時間短縮
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 16
.travis.yml——language: php
php: - 5.5
env: matrix: - TEST_MODE: "fixer" - TEST_MODE: “unittest"…
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 19
課題• レガシーなPHPアプリケーションだけど!
• デプロイプロセスを自動化したい
• composer使いたい(AWS SDK for PHP 2)
• AutoScalingしたい
• 問題発生時に簡単にロールバックしたい
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 20
対策と効果• AutoScalingに対応したデプロイシステムを、Capistranoで作りこむ
• 対応できないレガシーなPHPコードは自ら修正
• サーバープロビジョニング部分は、扱いやすいFabricを利用、全インスタンスを手元でコントロールできるように
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 21
対策と効果• Jenkinsからワンクリックで無停止デプロイ
• AutoScaling用のAMI・Launch Configuration・AutoScalingGroup更新も、Jenkinsで自動化
• 開発担当者だけで、デプロイ作業が実施できるようになった
• サーバープロビジョニングも自動化
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 24
課題
• デプロイ後に問題が発生しやすい
• デプロイ後にサービス負荷状況・エラーの内容ごとの増減をすぐに確認したい
• 障害発生時に、アプリケーションの問題か、インフラの問題か、すばやく切り分けたい
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 25
対策と効果
• NewRelic
• AgentとAPIを利用して、サービス負荷状況・デプロイタイミングを可視化
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 27
対策と効果• BigQuery
• fluent-plugin-bigqueryを利用して、Streaming API経由でBigQueryにログ送信
• GoogleSpreadSheet+GoogleAppsScriptを組合せて、種類ごとにエラーを集計、ChatWorkへ通知
• 開発担当者が手軽に監視を追加できるようになった
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 31
課題
• 300GBを超えるマスタDB、ALTER TABLEに数時間かかってしまう
• 長時間のサービス停止はできない
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 32
対策と効果
• RDSをMySQL5.6に移行
• Readreplicaを一旦切り離してALTER TABLE、完了後に再replicationして追い付かせる
• あらかじめ設定しておいたメンテナンス時間に、Readreplicaをマスタ昇格させて短時間で切替
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 33
# readreplica起動aws rds create-db-instance-read-replica \...# read_only=0を指定したdb-parameter-group-nameに変更aws rds modify-db-instance \--db-parameter-group-name writable-mysql56 \...# readreplicaを一旦切り離して時間がかかるALTER TABLEを実行# 完了後に再replicationして追い付かせるmysql> CALL mysql.rds_stop_replication;mysql> ALTER TABLE ...;mysql> CALL mysql.rds_start_replication;
# アプリケーションをメンテナンスモードへbundle exec cap production chatwork:maintenance_enable# マスタへpromoteaws rds promote-read-replica \...# DB接続先を切替bundle exec cap production deploy# アプリケーションのメンテナンスモードを解除bundle exec cap production chatwork:maintenance_disable
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 34
対策と効果
• RDSを最新に保つために、全RDSのインスタンスEngineバージョンを監視
• RDSのデフォルトEngineバージョンとの差異があれば、メンテナンスウインドウでアップグレード
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 35
# デフォルトEngineバージョン取得aws rds describe-db-engine-versions --engine mysql --engine-version 5.6 --default-only{ "DBEngineVersions": [ { "Engine": "mysql", "DBEngineVersionDescription": "MySQL 5.6.22", "DBParameterGroupFamily": "mysql5.6", "DBEngineDescription": "MySQL Community Edition", "EngineVersion": "5.6.22" } ]}
# インスタンスのEngineバージョン取得aws rds describe-db-instances --max-items 1 | jq ".DBInstances[] | {DBInstanceIdentifier :.DBInstanceIdentifier,EngineVersion:.EngineVersion}"{ "DBInstanceIdentifier": “chatwork-master-db“, "EngineVersion": "5.6.22"}
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 38
• CloudFormationを利用
• EC2,RDS以外のAWSサービスも全て、継続的デリバリーの範囲に含める
• データストレージはDynamoDBへ集約していく
• ElasticBeanstalk+Dockerコンテナ
• Blue-Green Deployment可能な構成へ
• 開発担当者も構成変更可能
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 40
• 常に改善し続ける、停滞しては現状維持も難しい
• 既存の仕組み、外部サービスを積極的に活用する、必要に応じて作りこむ
• アプリケーションの変更は避けられない、インフラエンジニアもコードを改善すべき
• ビジネススピードを上げる仕組みづくり!
ChatWorkの継続的デリバリー、これまでとこれから
2015/05/23 © ChatWork All rights reserved. 41
ChatWorkは 積極採用中です!
インフラエンジニアに興味がある方はぜひ!
http://recruit.chatwork.com/ja/