SlideShare a Scribd company logo
No SSH
KMC関東例会 at Cybozu
野島 裕輔 (@nojima)
自己紹介
@nojima (Yusuke Nojima)
blog: nojima.hatenablog.com
github: github.com/nojima
twitter: twitter.com/nojima
Cybozu でインフラエンジニアをやっています。
元競プロ勢。
インフラの自動化について話します
そもそも何で自動化しないといけないのか?
前提:
サービスが成長していく
サービスが成長していくと…
• 使用するメモリ量、ディスクIO、CPU使用量などが
増加していく。
• そして、いつかサーバーの物理的な限界に到達する。
スケーリング
• スケールアップ
• より強いサーバーを投入することで、より多くの計算資源を確保する。
• 一定の性能を超えると、性能あたりの値段が指数関数的に増大する。
• スケールアウト
• サーバーを大量に並べることで、必要な計算資源を確保する。
• 値段は全体の性能に比例する。
• 大量のサーバーを並べることになるので、管理が大変
サーバー管理
• サーバーの投入のために、サーバーの役割に応じて
パッケージのインストールや設定の配置を行う。
• サービスのリリースのために、APサーバーの
ローリングアップデートを行う。
• 脆弱性対応のために、インストールされたパッケージを
更新する。
• などなど
サーバー職人の朝は早い
• 感覚的には、サーバーが10台ぐらいなら手動でも管理できる。
• しかし、サーバーが1000台になると、手動では絶対に無理。
• したがって、スケールアウトには自動化が必須。
どうやって自動化する?
ナイーブなやり方:
1. 手動での手順を確立する。
2. (Optional) 手順を手順書に起こす。
3. 手順をシェルスクリプトやPythonで書く。
DB
例1: AP のローリングアップデート
• アプリケーションの新しいバージョンをリリースしたい。
• アプリケーションは次のような3層構成になっているとする。
nginx
nginx
AP
AP
AP
User
# AP サーバをローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo detach-from-load-balancer ${ap}
done
# APサーバの更新
cat ${ARTIFACT_TGZ} | ssh ${ap} sudo tar -z -x -C /
ssh ${ap} sudo systemctl restart ap-service
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo attach-to-load-balancer ${ap}
done
done
例2: ロードバランサの更新
• 脆弱性対応とかでロードバランサに入っている
パッケージを更新したいとする。
• Ubuntu の場合は apt dist-upgrade した後にサーバーを
再起動する手順になる。
# ロードバランサの更新を行う
# (本当は L4LB からの切り離しを行うべきだけど煩雑なので省略)
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade -y
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
この調子で自動化していけば
いくらでもスケールアウトできる?
残念ながら
No
例: APとLBの並列更新
オペレータAがAPをローリングアップデートしている最中に、
別のオペレータBがロードバランサを更新しようとしたとする。
# AP をローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} ...
done
# APサーバの更新
cat ${ARTIFACT} | ssh ${ap} ...
ssh ${ap} sudo systemctl ...
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} ...
done
done
# ロードバランサの更新を行う
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
単体では問題なく実施できるオペレーションでも
並列に実行すると壊れる場合がある
どうすればいい?
• 同時に実行しないように人が注意する
⇐ チームの規模が大きくなってくると無理
• 2つのスクリプトは「ロードバランサ」という共有リソースを
操作していた。
• 同時に実行してはいけない操作が競合し、問題となった。
• じゃあ排他すればいいじゃん!!
(
flock -x 9
# AP サーバをローリングアップデートする
for ap in ${AP_SERVERS}; do
# ロードバランシング対象から外す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo ...
done
# APサーバの更新
cat ${ARTIFACT_TGZ} | ssh ${ap} ...
ssh ${ap} sudo ...
# ロードバランシング対象に戻す
for nginx in ${NGINX_SERVERS}; do
ssh ${nginx} sudo ...
done
done
) 9> /var/lock/nginx-operation
(
flock -x 9
# ロードバランサの更新を行う
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
) 9> /var/lock/nginx-operation
( flock -x 9 ... ) 9> /var/lock/nginx-operation って何?
( ... )
サブシェル。
別のプロセスを起動して、その中で括弧の中のコマンドを実行する。
9> filename
リダイレクト。
この場合、filename を書き込みモードで open し、9番の FD に割り当てる。
flock -x 9
9番の FD を使って排他ロックを行う。
ロックはファイルが閉じられるまで保持される。
• これで、AP の更新スクリプトとロードバランサの
更新スクリプトが衝突する系を救えた。
• しかし、ロードバランサに対して行う操作は他にもある。
• static コンテンツのアップロード
• nginx 設定ファイルの更新
• SSL証明書の更新
• …
• 全部調停しないといけない
調停による依存関係の爆発
Operation
5
nginx
nginx
Operation
1
Operation
4
Operation
3
Operation
2
どうすればよかったのか?
• 各スクリプト同士を直接調停させようとすると、
依存関係により破綻する。
• よって、サービスを提供する側(この場合は nginx)で
調停すべき。
やりたいことのイメージ
Operation
5
nginx
nginx
Operation
1
Operation
4
Operation
3
Operation
2
nginx
operator
service
ここで調停
しかし、現在のシェルスクリプトには、
調停者を差し込む余地がない。
# ロードバランサの更新を行う
# (本当は L4LB からの切り離しを行うべきだけど煩雑なので省略)
for nginx in ${NGINX_SERVERS}; do
# パッケージの更新
ssh ${nginx} sudo apt update
ssh ${nginx} sudo apt dist-upgrade -y
# 再起動
ssh ${nginx} sudo reboot
(${nginx} が起動するまで待つ)
done
どうしようもない
No SSH
# 再起動
ssh ${nginx} sudo reboot
そもそも、ここがダメなのでは?
ssh はカプセル化を破壊する
• ssh するとリモートサーバー上のあらゆるファイルを読み書きできる。
• ssh するとリモートサーバー上のあらゆるデーモンを起動・停止できる。
• ssh するとリモートサーバー上のあらゆる状態を取得できる。
ssh は OOP において private 変数を直接読み書きしているようなもの!!
ssh を許可すると、
そのサーバーのあらゆる実装上の詳細を
クライアントに露呈させることになる
ssh をやめて、
インターフェイスで会話しよう
• ssh によるオペレーション自動化を禁止。
• 代わりに、サービスを管理するためのエージェントを作る。
• エージェントの API が、そのサービスの公開インターフェイスとなる。
• オペレーションスクリプトは、公開されたインターフェイスを
叩くだけにする。
インターフェイスをどう設計するか
• 実装上の詳細ができるだけ露呈しないようにする。
• そのサービスを構成するサーバーのリスト、
サーバーのファイルシステムのレイアウト、
そのサービスの実装が利用している外部サービスの仕様
などをクライアントが意識しなくてもよいようにする。
• クライアント同士で調停しなくてもいいようにする。
• 共有リソースの操作はサービス側で適切に排他して行う。
nginx の例だと…
• 「APの切り離し」や「ロードバランサの更新」などが
公開 API になる。
• API を提供するエージェントは Virtual IP などを使って
真の IP アドレスを隠蔽しておく。
• オペレーションの並列度を制御するために、queue + worker
方式で nginx に対するオペレーションを行う。
• 並列度の制御方法はいろいろあるので、別の方法でもいい。
こんな感じ
nginx
nginx
Operation
1
Operation
2
nginx
operator
service
公開インターフェイスで
オペレーションを依頼
queue worker
なんかいい感じにやる
Virtual IP でサービスを提供
まとめ
ssh に頼らず
インターフェイスでオペレーションしよう!!

More Related Content

What's hot (20)

PDF
Ansible入門
Daiki Hayakawa
 
PDF
DynamoDBのまえにキャッシュおく奴
Sugawara Genki
 
PPTX
Ansible ではじめるインフラのコード化入門
Sho A
 
PDF
ChefとPuppetの比較
Sugawara Genki
 
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
CLARA, Inc.
 
PDF
Webサーバ構築で心がけるべき二つのこと
TrinityT _
 
PDF
Lambdaによるクラウド型言語の実装
Sugawara Genki
 
PDF
Ansible roleとinventoryの書き方
Kamimura Taichi
 
PDF
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
 
PPTX
OSC Tokyo fall LT~Dockerで分散処理をやってみた
atk1234
 
PDF
Serverspec at Testing Framework Meeting
Gosuke Miyashita
 
PDF
BOSHで始めるImmutable Infrastructure
i_yudai
 
PDF
BOSHでお手軽CFデプロイon AWS
i_yudai
 
PDF
ECS-CLI in Action
Ryo Nakamaru
 
PDF
Ansibleで始めるインフラ構築自動化
dcubeio
 
PDF
Puppet on AWS
Sugawara Genki
 
PDF
Processing LTSV by Apache Pig
Taku Miyakawa
 
PPT
Performance and Scalability of Web Service
Shinji Tanaka
 
PDF
JAWSUG版 PostgreSQL on Amazon EC2の可能性
Serverworks Co.,Ltd.
 
PDF
Ansible tower 構築方法と使い方
Hiroshi Okano
 
Ansible入門
Daiki Hayakawa
 
DynamoDBのまえにキャッシュおく奴
Sugawara Genki
 
Ansible ではじめるインフラのコード化入門
Sho A
 
ChefとPuppetの比較
Sugawara Genki
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
CLARA, Inc.
 
Webサーバ構築で心がけるべき二つのこと
TrinityT _
 
Lambdaによるクラウド型言語の実装
Sugawara Genki
 
Ansible roleとinventoryの書き方
Kamimura Taichi
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
atk1234
 
Serverspec at Testing Framework Meeting
Gosuke Miyashita
 
BOSHで始めるImmutable Infrastructure
i_yudai
 
BOSHでお手軽CFデプロイon AWS
i_yudai
 
ECS-CLI in Action
Ryo Nakamaru
 
Ansibleで始めるインフラ構築自動化
dcubeio
 
Puppet on AWS
Sugawara Genki
 
Processing LTSV by Apache Pig
Taku Miyakawa
 
Performance and Scalability of Web Service
Shinji Tanaka
 
JAWSUG版 PostgreSQL on Amazon EC2の可能性
Serverworks Co.,Ltd.
 
Ansible tower 構築方法と使い方
Hiroshi Okano
 

Similar to No SSH (@nojima; KMC関東例会) (20)

PDF
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
ConoHa, GMO INTERNET
 
PPTX
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
Masato Igeta
 
PPTX
今からでも間に合う!インフラ自動化超入門 @渋谷
Daigou Harada
 
PPTX
作られては消えていく泡のように儚いクラスタの運用話
Tsuyoshi Torii
 
KEY
Fabricでサーバー管理をDRYにしよう
max747
 
PDF
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
Rakuten Group, Inc.
 
PPTX
サーバーレスで運用自動化
Akifumi Niida
 
PDF
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
 
PDF
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
 
PPTX
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
Yukihiko SAWANOBORI
 
PPTX
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
Yosuke Hiraishi
 
PDF
運用に自動化を求めるのは間違っているだろうか
Masahito Zembutsu
 
PDF
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
Hideki Saito
 
PPTX
Idcfクラウドで始める構築自動化
智之 大野
 
PDF
Apacheからnginxにリニューアルしようとしてるお話
Shohei Koyama
 
PPTX
Diskless Compute Nodeを使ったImmutable OpenStack
Yuki Yamashita
 
PDF
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
akira6592
 
PDF
明星和楽2015ハンズオン資料
takaoka susumu
 
PPTX
StackStormを活用した運用自動化の実践
Shu Sugimoto
 
PDF
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
Developers Summit
 
このべん第二回 ~「できない子ほどかわいくしたい!ConoHa補完計画」勉強会
ConoHa, GMO INTERNET
 
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
Masato Igeta
 
今からでも間に合う!インフラ自動化超入門 @渋谷
Daigou Harada
 
作られては消えていく泡のように儚いクラスタの運用話
Tsuyoshi Torii
 
Fabricでサーバー管理をDRYにしよう
max747
 
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
Rakuten Group, Inc.
 
サーバーレスで運用自動化
Akifumi Niida
 
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
 
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
Yukihiko SAWANOBORI
 
インフラ構築とテストについて(ITインフラ業務自動化現状確認会)
Yosuke Hiraishi
 
運用に自動化を求めるのは間違っているだろうか
Masahito Zembutsu
 
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
Hideki Saito
 
Idcfクラウドで始める構築自動化
智之 大野
 
Apacheからnginxにリニューアルしようとしてるお話
Shohei Koyama
 
Diskless Compute Nodeを使ったImmutable OpenStack
Yuki Yamashita
 
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
akira6592
 
明星和楽2015ハンズオン資料
takaoka susumu
 
StackStormを活用した運用自動化の実践
Shu Sugimoto
 
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
Developers Summit
 
Ad

More from 京大 マイコンクラブ (20)

PDF
テキストファイルを読む💪 第1回
京大 マイコンクラブ
 
PDF
かわいくなろうとしたら語彙力が下がった話
京大 マイコンクラブ
 
PDF
Common Lisp入門
京大 マイコンクラブ
 
PDF
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
 
PDF
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
 
PDF
Geometry with Unity
京大 マイコンクラブ
 
PDF
セミコロンレスc++
京大 マイコンクラブ
 
PDF
エンジニアと健康
京大 マイコンクラブ
 
PPTX
女の子になれなかった人のために
京大 マイコンクラブ
 
PDF
Pietで競プロしよう
京大 マイコンクラブ
 
ODP
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
 
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
 
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
 
PPTX
hideya流 テストプレイ観察術
京大 マイコンクラブ
 
PDF
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
 
PDF
C#でゲームを作る2016 第8回
京大 マイコンクラブ
 
PDF
C#でゲームを作る2016 第7回
京大 マイコンクラブ
 
テキストファイルを読む💪 第1回
京大 マイコンクラブ
 
かわいくなろうとしたら語彙力が下がった話
京大 マイコンクラブ
 
Common Lisp入門
京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
 
Geometry with Unity
京大 マイコンクラブ
 
セミコロンレスc++
京大 マイコンクラブ
 
エンジニアと健康
京大 マイコンクラブ
 
女の子になれなかった人のために
京大 マイコンクラブ
 
Pietで競プロしよう
京大 マイコンクラブ
 
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
 
hideya流 テストプレイ観察術
京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
 
C#でゲームを作る2016 第8回
京大 マイコンクラブ
 
C#でゲームを作る2016 第7回
京大 マイコンクラブ
 
Ad

No SSH (@nojima; KMC関東例会)