Adways Advent Calendar 6日目の記事です。 http://blog.engineer.adways.net/entry/advent_calendar/archive
こんにちは、渡瀬です。
インフラチームに所属しています。
インフラチームは、大きく分けて商用サービスのチームと社内環境のチームに分かれていて、それぞれ10名前後が所属しています。
何やら記事を書いていいらしいので今日は商用サービスのチームで最近やっていた仕事をいくつか紹介します。
インフラチームでここ2,3ヶ月でやっていた主なタスクとして
- うるう秒準備
- iOS ATS必須化対応
- 一部公式サイトの継続的デリバリ化
- ストレージのファームウェア上げ&SSD全交換
- mackerelの導入
- オンプレ用のDocker Repositoryの構築
- SVNで管理されているシステムのgit化
- オンプレ用に使用しているサーバ管理ツールからansibleのdynamic inventoryが引けるようにする
- AWSアカウント間でのサービス移管
- AWSでcapistranoで手動でデプロイしていたサービスのBlue-Greenデプロイ化
- Perl製社内システムのPerl + Catalystのバージョンアップ & Docker化
- mongodbのメンテナンス
- ログの集約と可視化 fluentdとkibanaとelasticsearch
- SSO化の検証
- DNSサーバのリプレース検証
などがあります。
いくつか紹介して行きます。
うるう秒対応
2017年にうるう秒が入りますね。
2015年のうるう秒の時は、うるう秒があっても耐えるようにkernelのアップデートとntpのslewモード化で対応すると判断して動いていたのですが、対応が漏れて再起動してしまったサーバが発生しました。
今回は反省して自社の環境にはうるう秒を持ち込まない方針で動いています。
Leap Smear化してゆるりとうるう秒と向き合う準備をしています。
iOS ATS必須化対応
何かと話題のATS。
暗号化スイートの対応は随分前に完了していました。
負荷の増加想定を行い十分に捌けるという判断をしています。
想定が大きく上振れしたときに、オフロードする準備を進めています。
一部公式サイトの継続的デリバリ化
公式サイトを更新する時に手動でデプロイしていたのですが、どうしてもミスが発生しがちでした。
そこで、デザイナーに git の簡単な使い方を覚えてもらって git での管理と継続的デリバリを進めました。
gitのdevelopに上げれば、ステージングに
masterブランチに上げたら本番に自動的に更新されるようにしました。
継続的デリバリには、オンプレミス環境に置いてある gitlab を利用しています。
gitlabはCI環境とコンテナのレジストリがついてくるので、非常に手軽にCI/CD環境が作れるのが便利です。
ストレージのファームウェア上げ&SSD全交換
オンプレミス環境で使用しているストレージのキャッシュとして利用していたSSDの寿命が近くなったのでSSDの全交換とファームウェアの更新を行いました。
このストレージはVMWare vSphereのストレージとして使用しているのですが、仮想サーバを全てStorage vMotionを利用して他のストレージに移動して実施しました。
Storage vMotionを利用することで、無停止でストレージからの仮想サーバの追い出しが可能でした。ただし、IO負荷は上がるので影響が0ではありません。
電源を落としてのストレージのメンテナンスが、仮想サーバとしては無停止で可能だったのでストレスも少なく非常に楽でした。
時代変わりましたよねぇ。。。
mackerelの導入拡大
mackerelを以前から一部のチームでは利用していたのですが、導入規模を拡大しています。
導入拡大の話をしていた時期に httpstat が流行っていたので、httpstat のメトリクスを取れるプラグインを作成してグラフを見れるようにしています。
使用しているコードはこれです。
GitHub - ywatase/go-mackerel-plugin-httpstat: httpstat for mackarel metrics plugin
とりあえず動いたからいいやレベルの実装なので、もっと良い実装のプラグインがあれば教えていただけると嬉しいです。
オンプレ用に使用しているサーバ管理ツールからansibleのdynamic inventoryが引けるようにする
インフラチーム内では昨年より少しずつ ansibleの利用を進めていて、新規構築するサーバやサービスはansible化を行っていました。
そこで、新卒社員にansibleを少しずつ教えていたのですが、最近になって「mackerelやec2だとdynamic inventory簡単に使えるのに社内のサーバ管理ツールでは対応していないんですか」って煽ってきたので作りました。
1時間くらいで作れたので、2年くらい前にやっておけば無駄なスクリプト生まれなかったなってつくづく思いました。
反省しきりです。
なお、新たにダイナミックインベントリ用のスクリプトを作成する際には、ansibleの公式リポジトリにある serf 用のダイナミックインベントリ取得スクリプトがシンプルだったので、こちらを参考にしました。
AWSでcapistranoで手動でデプロイしていたサービスのBlue-Greenデプロイ化
AMIを更新する、launch configを作成する、autoscalingで使用するlaunch configを登録する。という流れをansibleで出来るようにしたり、
Perl製社内システムの Catalystのバージョンアップ & Docker化
10年くらい前に作成した社内ツールを引退させようとしたら、逆に当面の延命が決まってしまった案件
- Catalystのバージョンアップ(5.6 → 5.9)
- gitlab-ciを利用して自動テスト&docker build
- ついでにテスト環境をdocker化
を行いました。
.gitlab-ci.ymlのlint
.gitlab-ci.ymlをpushして構文エラーを起こす事がしばしばあったため、APIを利用して文法チェックするコマンドを作りました。
GITLAB_API=https://gitlab.example.com/api/v3 lint-gitlab-ci-yml () { ruby -e "require 'yaml'; require 'json'; puts JSON.generate({'content' => JSON.generate(YAML.load(ARGF.read)) })" | \ curl --header "Content-Type: application/json" $GITLAB_API/ci/lint --data @- }
こーいう感じで .bashrcなり .zshrc あたりに登録しておくと、.gitlab-ci.yml を pushして文法エラーだったときの脱力が減らせるかもしれません。
mongodbのメンテナンス
mongodbのメンテナンスが「あとよろ」って飛んできたので、mongodbの勉強からはじめてメンテナンスしてます。
- クラスタのバックアップ
- mongodbのバージョンアップ
- あまり使われていないクラスタの縮退
などを行っていました。
以上、最近のインフラチームのタスクを紹介しました。
次は黒田さんの記事です。