ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

SREに関する雑談 bosyu#3 キャリアの幅の広げ方とインフラを"ちゃんとする"までの道筋

こういう bosyu をやっています!

bosyu.me

今回は Web Engineer の方に対して、キャリアの進め方に関する話と、インフラの信頼性をどうちゃんとしていくかという話をしました。

Web Engineer がインフラ領域に幅を広げるためには

逆に僕は Production で動く Application コードを書いた経験は乏しく、かつフロントエンドに関してはほぼ未経験みたいなもんなので、すごいなあと思いつつ。

相談された方はバックエンドとフロントエンドを両方やるエンジニアで、現在はスタートアップで少人数で働いているとのこと。

技術的な賞味期限を考えると低レイヤーを学んだ方が賞味期限が長いのでやりたいと思うが、その広げ方、深掘りのしかたを悩んでいる、とのことでした。

  • スタートアップにいるということなので、すぐバリューを出せるところ(得意なところ)をやりがち
    • 例えば現在の状況でインフラ領域をやる、となると生産性はどうしても落ちてしまう
    • 少人数であればそれをサポートする組織体制を期待するのもきっと難しい
  • chaspy はどうしているか
    • ごもっともだと思うが、自分はいい意味で(?)低レイヤーとか、アルゴリズム、高度なプログラミングなどは諦めている
    • というより、現実にぶつかる問題ベースで、それに関連することを都度学ぶしかないと思っている
    • もちろん先取りしてそれらの知識をつけておけば、その解決速度が早くなることは承知しているものの、いつ役に立つかわからないのも事実
    • 現在は投資対象を英語と直近で役立つクラウド、SRE、チームリーディングなどにしているため、現実時間でその先回りの投資的な勉強は正直できてない
    • ただ、その課題感はすごい分かるし、長期的には自分もどうにかしないといけないと思っている。。。
  • 最近 chaspy が業務で Golang を書いている事例
    • Go は SRE にとって必須教養だと考えている。
      • 使う OSS も Go で書かれているものが多い。upstream のコードを読んだり、パッチを送ったり、プラグインを書いたりできたほうが絶対良い
      • ある程度大きいプログラムは bash で書くといろんな面でつらい点が増えてくるので、そういう点でも bash 以外のプログラミング言語のほうが良い
    • チームメンバーに Golang が得意なメンバーがいるので、彼らに活躍してもらうために、チーム内の標準を Golang にしようと合意をとった
    • その結果、自分もその機会に恵まれた
    • 実際の問題解決と学習対象を結びつけた 事例だったと思う。こういうことが増やしていけるといいよね
  • とはいえ、現在の状況で、実業務を通じて学習していく機会を作っていくのはきっと難しい
    • 自分がとけそうな課題を発見するのが難しい。それが1日でできるのか、1週間かかるのかの判断がある程度経験ないとできない。
    • 適した課題が見つかったとしても、それを独力でやりきる胆力も必要
  • 課題意識の解像度をもう少し高めたほうがいいのでは
    • 「低レイヤー」と見ている、呼んでいるものの中で、何を獲得したいのかを言語化する
    • 今だと「フロントエンドやりたい」と同じ状態になっている
    • 学習内容の詳細化、言語化なら chaspy も壁打ち相手で役立てると思うのでまた

みたいな話をしました。すごい難しいですよね。

自分も今は「わけのわからない焦り」みたいなのはなくなって落ち着いている一方で、長期的なキャリアを考えた時に、深い・低いレベルでの技術の理解、だったり、フロントエンドを含めたアプリケーションコードを書いた経験の薄さみたいなところは課題に思っているので、すごいわかります。

まとめると、

  • 今の領域と違う分野を業務外で学習し続けるのは時間的にもモチベーション的にも厳しい(できるひともたまにいるが、すごすぎると思う)
  • 業務での実際の課題を、自分の学習と結びつけるような環境にいろんな方法でやっていけると良さそう
    • そのためにはもう少し学びたいことの解像度をあげたり
    • メンバーにこの問題意識を共有して知ってもらったりするのが良さそう

という感じでした。いい話ですね。

インフラを「ちゃんとする」ための道筋

  • 背景
    • スタートアップということで、最低限のインフラで動くものをスピード感を持って作るということが非常に重要
    • インフラはまだプロダクションに出していないということもありまだ後回しになっている
    • VPS に docker-compose で up しているだけ
    • 課題感だけ漠然とあるが、どの順番でどこから手をつければいいか?

ということで、これ実際に面接とかで使うと面白いんじゃない?ってぐらい面白い課題でしたw

コンポーネントトラフィックフローが描かれた図を見せてもらいながら、以下のような候補をあげました。

  • データをなくさないこと
    • データなくなったら困りますよね(それはそう)
    • データの定期バックアップをする
  • データベースの管理
    • 運用にコスト避けないならなおさら外部に持って Managed にしたほうがいい
    • スケールアップ、スケールアウトが容易なものにしておいたほうがいい
  • リリースエンジニアリング(CD)
    • 今は少人数だから ssh してコードを pull するでもいいけど、遠くない将来コミュニケーションコストがしんどくなってくる
    • あとそんなに難しくないので、投資対効果が高いので早くやるのがよさそう
  • メッセージング基盤
    • これもセルフホストは結構しんどいんじゃないか
    • Managed を検討したほうがいいと思う
    • データベースと同じぐらい自分で面倒みたくない
  • Logging
    • 障害対応時に調査できるかどうか
    • これも Papertrail / Stackdriver Logging とかの SaaS がある
    • fluentd から投げるだけならそこまで難しくないと思う
  • 可用性
    • 少なくともフロントの Reverse Proxy が落ちるとすべてサービス死ぬと思うので、そこの可用性確保が最優先
    • これを考えると同時に現在の状況からどのクラウドで、どういうアーキテクチャを採用するかを考えないといけないと思う
    • 現状の人数なら Kubernetes は too much かも 詳しいひと、モチベーションがあるひとがいればいいけど
    • PaaS でできるならそれが楽 heroku は最高
    • AWS, GCP などのクラウドを使うならまたそれだけで大きなトピックになる

というわけで、まずはデータ。次にデプロイの自動化。そして可用性のあるアーキテクチャを考えるためにどのクラウドを使うのか、というのをマネージドサービスと合わせて考えていく、という感じですね。今もコンテナで動いているのでコンテナが動く Platform のどれかを使うとは思いますが。

あとの優先順位はチームメンバー、組織の状態、お財布事情などによるので、ひとまずこのような項目を、現実の状態に即して提示できただけでも収穫はあったようです。

おわりに

引き続き bosyu やっています。

今回やったようなキャリアのお悩み相談から、アーキテクチャのレビューといったことも対応できそうです。内容はなんでも大丈夫なのでお気軽にご応募ください!

bosyu.me

#srefm Production Readiness 会まとめ

はい。こちらのイベントのまとめをしていきます!

t.co

今回はゲストに @koudaiii さんと _a0i さんをお招きして、Application や Infrastructure / Platform の Production Readiness について語りました!

お二人を選んだ理由としては、坂部さんの場合は Production Ready に関するアウトプットがすでにあったということで、すぐに打診しました。aoi さんのほうはサイボウズさんとかどうだろうねということで思いついて声かけました!お二人とも快諾していただき感謝です。

期待とか chaspy の所感とか

hackmd のほうにざーっと書いたやつ。


chaspy の所感

  • Production Readiness Checklist
    • とても良いもので、やってよかった。
    • SRE の負担を最小限にしつつ、Developer も学ぶことが多い様子
    • SRE とサービスチームとの目線の違いをすり合わせないといけない
    • やることが「大変」にならないようにしないといけない
  • Review を SRE がどうやるのか、今後まだまだ洗練させられると思う
    • 実際これまで chaspy メインでみてたので他のメンバーがレビューできる状態かというとそうでもなかったりする
  • 開発者からの Feedback を毎回もらうのが大事
    • 終わってイシュークローズするときにプチ反省会をしてテンプレを更新したりしている。大事
  • Progressive Delivery に適応できるように進化させていく必要があると感じている
    • 今のチェックリストはある一点の時間に、いっきにバーンと公開することを前提としている
    • そのため、試験的に・実験的に・段階的に本番サービスを公開していくような良い取り組みをやったときにいろいろぶつかった
      • Readiness Checklist の項目が終わってないのに出しちゃってアラート飛ぶとか
    • 今後は今の Production Readiness Checklist の項目は残しつつ、プロダクションへのサービスの段階的導入をいくつかモデル化して、それを Design Doc Review 時点で決定し、方向性を合意したのち、Readiness Checklist をいつどこまでどうやって進めていくか、みたいな話をする必要があると考えている

chaspy のこの会への期待

  • Production Ready って何をもって言えるのか、漏れてたりする観点があれば話をする中で見つかるといい
  • 特に一番難しいのはこの Checklist, Template の改善や運用方法。うまくいってる点いってない点あるので共有したい
  • サービス・プラットフォームそれぞれある中で、Production Ready の要素をうまく抽象化できれば便利な気がする

最初の15分ほどもらって、chaspy がやってきた Production Readiness Checklist や Design Doc の内容や運用についてざっと説明しました。

Session1 @koudaiii

事前に素晴らしいアウトプットを用意いただきました。

paper.dropbox.com

Wantedly さんでも導入当初から改善を繰り返しての今で、他のみんなと同様にまだまだ進化の途中ということでした。

驚いたのはこのリストの量ですね。過去のポストモーテムの原因から追記したりしていて、再発防止をしっかりしようとしていることがわかります。

そしてもう1つが、結構ほとんどの項目がやったかやってないかのチェックというよりは、「これは考慮されているか?」という"問い"のチェックリストだということでした。

アプリケーション開発者側では1.5h 想定ですが、インフラチームが見る分量としてはかなり多く、この問診票を持ってヒアリングするのはなかなか大変そうな印象を受けました。アプリケーション開発チームでもこれに自信満々に答えるのはきっと難しいでしょうし、だんだんと洗練されてくるんだろうなあとは思いました。

Session2 aoi さん

事前にいくつか話したいこと、質問したいことを書いてもらったのでそれベースで答えました。

そもそもProduction Readinessをどう始めるのが良いか?

  • chaspyさんのブログを読ませていただいたのですが、あそこに書いてあるよりももう一つ前段階の「はじめかた」を知りたい。
    • SREが必要と思って始めるのだとは思うけれど、そこから開発者の巻き込み方や、チェックリストの制定方法など。

はじめかたのはじめかたですね。

Wantedly の場合だともともと大きなアプリケーションの信頼性が高くないという問題から発信しはじめたということでした。

僕が話したことでいうと、Developer が集まるミーティングで一応広報はしたものの、Readiness Checklist 第1号となるサービス開発チームをつかまえて、これやってみてーといきなりはじめた感じでした。最初は結構つきっきりでやったので、大事なのはこうやって前例を1つ作ること、結構最初はきっちりついて一緒にやること、テンプレートを常に改善し続けること、という当たり前なことをちゃんとやるしかないのかなぁと思っています。

また、今回最初の項目を見直したんですが、めちゃくちゃ薄かったし、全然洗練されてなくて笑いました。以下、公開しますね。



name: Production Readiness Checklist about: Checklist of whether new service works correctly in the production environment.


Production Readiness CheckList for {NEW SERVICE}

Stakeholder

  • [ ] StakeHolder?
    • [ ] Service Owner:
    • [ ] Product Owner:
    • [ ] User:
    • [ ] Reliability: @quipper/sre

System / Architecture

  • [ ] Architecture review with SRE
  • [ ] Create architecture diagram
    • Please include following
      • Traffic pattern: Where does it call from?
      • Dependency
  • [ ] Update <service name>/microservices/service.yaml for dependency
    • [ ] app1
    • [ ] app2

Resources / Load

  • [ ] Access load is predicted: yes / no
    • [ ] comment:
  • [ ] Set Resource(Memory/CPU) limit/request of pods
  • [ ] Set applopriate database connection

Monitoring / Logging

  • [ ] Application: Notify an application error(NewRelic / Sentry?)
    • url:
  • [ ] Synthetic: Notify a synthetics error(Pingdom)
    • url:
  • [ ] Create datadog dashboard
    • url:

Incident / Failure

  • [ ] Circuit breaker is implemented on the caller side: yes / no
  • [ ] Escalation flow
    • flow:

途中でも話しましたが、まぁこんなリストなくてもまずやってるよね、みたいな最小限の項目からはじめて、それをアップデートしていくことが大事なんだとあらためて思いました。1年と少しで70コミットありました。

みんなダッシュボードってどうしてる?乱立しない?

  • 開発者によって何が使いやすいとか、データによってもダッシュボードどれがいいとかあると思うけれど、どうしてます?
  • チェックリストみると統一されているように見えるけれど、他を使いたい・使わざるを得ないみたいなケースはないのか

乱立してるし、秩序もないけど、トラフィックパターンによってインターネットフェイシングかインターナルか、ぐらいは分けられるので、Datadog Dashboard Template を作ってやってもらっています、という回答をしました。

「チェックリストのチェック一個足りないけれどリリースしちゃいたいから後回しにしよう」みたいなケースってないですか?

  • チェックリストが浸透したり、ブラッシュアップされていればそんなことはないと思いますが、最初のうちはそういうことがありそうだなと
  • あとはリリースするサービスの大きさや関わる人数によって変わってきそう

そうならないように、余裕をもってはじめるようにしているし、Readiness 警察を最初の方は結構していた、みたいな話をした気がします。

あとはチェックリスト自体にも問いのものが多いので、「わかっていればいい」「サービスチームがそのリスクを飲めるならいい」みたいな感じで、最終判断はサービスチームに任せる形にしています。

Session3 質問回答

slido によせられた質問に回答していきました!

app.sli.do

リリースしてから長い期間がたったサービスはドキュメントが腐ってしまったり、Production Readinessな状態でなくなることもあると思いますが、再度PRRを実施したりしますか?またそのきっかけはどのようなものですか?

sakabe さんは障害発生時に見直す、ということを言っていたと思います。私はその後見直すことはしませんし、ドキュメントもそのときのスナップショットと割り切っているので、腐ることを許容しています。

Productrion Readiness Checklist はどのように更新、改善されていますか?

Productrion Readiness Checklistの管理はどのようにやってますか?

sakabe さんは google docs, chaspy は GitHub の Issue Template Production に出て行ったあとにフィードバックを開発者からもらう時間を最近はとっています。

非機能要件の整理

今回話している Production Readiness Checklist 自体が非機能要件とか、障害発生時のトリアージができるかどうか、みたいなところにフォーカスしていて、機能要件に関してはサービスチームにお任せしています。

ビジネスサイドとのSLI, SLOの握り方 (どうしてもdevだけで決めて動くことになりがち)

sakabe さんは経営層含めて話して合意したということ。とれるならそのほうが良いですね。 chaspy の場合はあくまで Product Team が自分たちで信頼性をキープするためのツールという位置付け&ボトムアップではじめたので、プロダクトチームだけで完結しています。Developer と Product Manager と話して決めてもらうようにしています。

Production Readiness Checklistの記載に関して、Yes/Noだと幅が広すぎるため、どの程度達成できているのかぶれる気がしているのですが、その辺り(ぶれる部分)の把握はどのように行っていますか?

これはいずれも"問い"の質問は分かっていれば良い、という感じで、曖昧さを許容している感じだったと思います。

SLIの設計方法やロードテスト時の試験観点、Kubernetesに対する設定項目など専門知識が必要な項目は開発者だけで実施(もしくは実施判断)が難しい気がしますが、どのようなサポートを行っていますか?

Good Question. 結構難しいし、難しいことを強いている自覚はありますが、感謝と尊敬を持っておまかせしています。その代わり密にコミュニケーションをとったり、ギャップが大きそうなことは勉強会をやったり、ドキュメントにちゃんと書く、とかの努力はしています。

プロダクトライフサイクルはどの様な線引きでプロダクトごとにあてはめていますか?

sakabe さん向け、これは線を引くのは難しいよね、って回答だった気がします。

@koudaiiiさんに質問なのですが、これだけのチェックリストを全部に当てていくとインフラ業務のほとんどがこのチェックリストを埋めるので終わったりしませんか?このチェックリストを埋めているのと他の業務の比率はどのくらい取ってますか?

大変なときは大変だよね、楽にしていきたいよね、、、みたいな感じだった気がします。

プレモテームを知らなかったのですが、どんな流れで実施されているのでしょうか?リスク箇所の洗い出しなんかはどの様にやられるのでしょうか?

re:Work が参考になるとのこと。

PRRをスケジュールベースで実施することはありますか?半期/年ごとに1回など。サービス個別に大きな変更はないが、小さい変更が頻繁に行われている場合にはその様な実施方法もありえそう。

現状やってない。やれるならやるのがいいとは思う。が、チェックの自動化とかがもう少しないと厳しい気がする。

リリース前にすべてのチェックが必要でない場合、リリースした後に開発者は自律的に実施していますか?

リスク許容してあとでやりますっていう項目があった場合は、やっていると信じているけど、そこを見届けるまではしてないです。

PoCレベルのサービスに対するProduction Readiness活動は行っていますか? 行っている場合、どのレベルで行っていますか? (他のSLAが決まっているようなStable, GAなサービスと同じレベルですか?)

うちはそれは SLO によって差をつけるとか、Experimental なサービスだからそれをスキップするとちゃんと説明されていれば ok としています。

メルカリさんなんかは松竹梅ランクわけしていて、一時期これを真似しようとしたのですが、うまくワークしませんでした。アーキテクチャが均一じゃないと SLI が同じにならないので難しいと思う。

この Level のやつですね。

Checklistが通らなかった場合、QCDの判断はSRE側でやるのでしょうか?

サービスチーム側で判断してもらう、が回答かな。こちらはあくまで問いとか、やったほうがいいよ、なリストを提供しつつ協力して進めていくというスタンス。

Production Readinessチェックリストを作成するというのは、従来QAが行っていたような受入試験の設計を、SREチームが主導で行うという認識であってますか?

おそらく QA も非機能要件のテストはしていたはずで、その一部を担っていると考えることはできそうです。あってます!

おわりに

個人的にも経験できていろいろ話せるところで、他社の事例を聞けてめちゃくちゃ勉強になりました。特にプラットフォーム側のチェックリストなのかデザインドキュメントなのかについてはまだできてないところで、課題感も一致していることがわかったので、また1年後とかにどうなってる?って話をしたいなーと思いました。

sre.fm 毎月月末にやっていましたが、7月はおやすみです。(飽きたわけではない)

今リクエストもらってるトピックだと

  • CapacityPlanning
  • Monitoring
  • Performance Tuning
  • Kubernetes, Container Orchestration

あたりを事前アンケートでもらいました。

ゲストあってのことなので、僕自身の知識、経験量と、誰を呼べるか、話せるかと、僕自身のモチベーションによってやれたらやれることをやっていきたいと思います。こういうのこのひと呼んでやってよーみたいなのあったら声かけてください!

出演いただいた sakabe さん、aoi さん、ありがとうございました!sakabe さんは昨年の JTF ではじめてお会いして、ずっとファンとして追いかけてるので今回共演できてうれしかったです!終わった後もいろいろな資料、情報共有いただいたので、言語化の力負けないように頑張ります。 aoi さんともなんだかんだイベント共演は初!でできてよかったです。おとうふ君のファンなのでTシャツ間に合ってよかった。プラットフォームの Checklist これからできたら教えてください。これからも情報共有しましょう。あとビール飲みいきましょう。

おしまい!

SREに関する雑談 bosyu#2 SRE へのキャリアについて

はじめに

こういう bosyu をやってみています。2回目です!

bosyu.me

1回目はこちら。

blog.chaspy.me

事前の google docs での質疑

今回も、いきなり話はじめるわけではなく、話したいことを事前にピックアップしてもらい、それを非同期で返信していくやりとりを行いました。

今回はWebEngineer をやっていて、今はミドルやインフラに興味が出てきていろいろ触っているところであり、今後 SRE にキャリアを進めたいが具体的にどうすれば良いのか、という感じの相談内容でした。

事前に話したこととしては、

  • SRE になるための具体的なステップ
  • SRE になるにあたり理解しておいたほうがいいこと
    • Site Reliability Engineering が何かということ。100% を目指さない、とか、信頼性をコントロールする、とか。
  • SRE をやりたいという動機に対する深掘り
  • 今やるべきことは何か
    • 職務経歴書の作成
    • なければブログや登壇といったアウトプット
    • カジュアル面談や自分で調べたりしてどんな会社があるかを知る
  • 現状ご自身で"足りない"と感じているスキルの深掘り
    • 認証、ネットワークの基盤部分は専任チームがやっているので、理解が浅い
    • Read 権限があるのなら、まず自分でいろいろ見てみて、理解を何かに書いてそのチームにレビューしてもらうのはどうか
  • これまでご自身で工夫して DevOps のアプローチを組織に導入しようと試みたが、うまくいかなかった話の深掘り
    • デプロイの自動化、テスト自動化、ポストモーテムの導入など
    • うまくいかなかった点は良い経験として、「どうすればうまくいったか?」の思考実験をするのが良さそう

結構濃度高くこの時点で話せて、この時点で次にすべきアクションはある程度見えてきた状態ではありました。

当日話したこと

docs でのやりとりを通じて、

  • 三者からの意見をもらって、俯瞰できるようになった
    • 今の状況がよくなさそうってこともわかった
  • 転職していくなかでどういうアクションしていくかを今回いろいろ選択肢がある中で考えていく
  • 自分のやりたいこと、やれてないことわかったのでよかった

ということでした。追加での質問が以下2点。

コミュニティへの参加、打ち解けかた、仲間を作る方法

社内に技術のことを話せる仲間がいないということで、どうやってコミュニティに入っていけばいいのか?という質問で、自分の経験から以下を列挙しました

  • Twitter で、書籍、登壇、ブログなどアウトプットしてるひとをフォローする
    • 学んでいるひとのアウトプット、考え、みている情報が流れてきて便利
  • Community で質問する
    • 質問をするのも能力
    • やさしい世界なので、きっと誰か答えてくれる
  • Community スタッフやる
    • その分時間は使うけれど、関係は増える
  • Blog や LT で発表する
    • 何かをわかった、と言うには、言葉にすることがどうしても大事
    • 実際に仕事をする上でも、なぜするのか、何が重要なのか、何が起きたのか、そういったことを説明するためにも重要なスキル

最低限おさえておいたほうがいいこと

  • Docker
    • git なみに必須教養になっているので、コンテナの深い理解までは必須ではないが、最低限 docker コマンドを動かせる、docker-compose で local で web application を動かすぐらいはできたほうが良い
  • 12 factor apps https://12factor.net/ja/
  • Pull Request での開発
  • 何かしら1つのクラウドの理解
  • IaC / Ansible Terraform https://techtarget.itmedia.co.jp/tt/news/1912/18/news06.html
  • 他社の Job Description みる
    • ここに書いてある必須項目がまさに"最低限おさえておいたほうがいいこと"
    • Casual 面談いって直接きくのもいいかも
    • Twitter や Slack community とかでつながりつくって雑談するのも良い

こういったことをお話しして、30分で終了しました。

Feedback でいただいたこと

さて、今後もよりよくしていきたいということで、フィードバックをいただきました。いずれもポジティブな内容で良かったです。


聞けてよかったこと、話せてよかったこと、印象に残っていることががあれば教えてください

どのようにしてコミュニティへ関わっていくのかについて、chaspyさん自身の経験を交えたアドバイスが聞けてよかったです。

話しきれなかったこと、聞ききれなかったこと、もう少し詳しく聴きたかったこと、期待を満たさなかったことがあれば教えてください

現時点ではなかったと思います。

本日の時間がみなさんの次のアクションにつながりそうでしょうか?そうであればアクションの内容を教えてください

コミュニティへの参加 (声を上げていく)、ブログ等のアウトプット、転職準備(志望動機作り、必須知識の学習、カジュアル面談等)

実際に会話に至るまでの流れに不備はありませんでしたか?改善できる点があれば教えてください

特にありません。むしろ事前にたくさんやり取りをさせていただいて感謝しかないです。

会話を行う上で気になった点、不快に思った点はありませんでしたか?改善できる点があれば教えてください

特にありません。

その他自由に感想を教えてください

自分のキャリア選択における、明確な指針を得ることができました。今後この機会を活かしていきたいと思います。本当にありがとうございました。


おわりに

bosyu 引き続きやってます!


SRE あるいはそれ以外を雑談したいひとを bosyu

SRE やそれ以外について雑談・相談を受けます。コミュニティ活動の一環で、自分に役立てることがあれば貢献したいのと、自分自身も多様なひとと話すことで学びになればいいと思っています。

  • SRE に関すること. SLI/SLO, Production Readiness, Monitoring
  • AWS, Terraform, Kubernetes, Nginx, Ansible etc.
  • Team Building, Culture Making, OnBoarding
  • コミュニティ活動(SRE Lounge, Terraform-jp)
  • その他質問なんでも

特定の深い技術的な解決よりは相談することで次のアクションの手助けになればいいなと思っています。 30分以内無料、30分以上1時間未満はお酒を何か送ってください。

経歴は https://chaspy.me へどうぞ


お酒は amazon の欲しいものリストから選べます。安いのは1000円からあるので、(事前の docs でのやりとりは含まず、当日の会話で30分以上を選ばれる場合のみ、)実際に体験したあとのお気持ちで送っていただけると幸いです。

www.amazon.jp

(今回30分以下にも関わらず、事前にやりとりで時間を使ったからとお気持ちをいただきました。。。本当はタダなんですよ、ありがとうございます)

今回やってみて、キャリア相談、職務経歴書のレビュー、面接練習なんかもお役に立てるかなと思いました。

おわりに

貴重な機会をいただいた、相談していただいた方に心からお礼申し上げます。ありがとうございました!

SREに関する雑談 bosyu#1 SRE チームの立ち上げについて

はじめに

こういう bosyu をやってみています。

bosyu.me

ありがたいことに、応募いただいて、実際に対応したので、個人情報、特定可能な情報は伏せつつ、どういう話をしたのかをまとめていきたいと思います。

実際の雑談までの流れ

「SRE 組織の立ち上げ」という点で、最初のメッセージでざっくりと話したいことの概要は聞いているものの、まったく共通点もない他人同士がいきなり話して30分や1時間で問題解決に至るのは難しいでしょう。事前に Google Docs に話したいこと、質問したいことを書いて共有してもらい、現状で回答できるものは事前に非同期で回答してしまいました。

ここでやりとりする分と、当日の30分までは無料でず。だいたい2、3往復しました。

その上で、当日はこういう流れでいきましょう、ということをシミュレーションしたり、当日この部分を最初に話してもらえませんか?みたいなことを伝えて、当日を迎えました。

ちなみに今回は応募者の方のチームから4名参加されました。特に想定してたわけでもないんですが、断る理由もないので、何人こられても構いません。

当日話したこと

背景の理解

背景を5分、10分ほどで説明してもらいたい気がしました! 何が問題で、どう解決したいのか、なぜ SRE チームを立ち上げる必要があるのか、など 1時間終わったあと Next Action が決まる、あるいはもともとしようと思っていたものよりよいものになればいいなと思っています

ということを事前のメモ上で伝えていたので、まず相談者のチーム・会社が持たれているもともとの課題をお聞きしました。

  • 手作業が多く、信頼性を損なう問題があったため、工程やプロセスを見直し、手堅いものにした
  • 一方で、安定性は担保できた一方、アジリティが失われてしまった
  • より信頼性を担保した形で、高速にサイクルを回せようにしたい

ということが背景であることがわかりました。

計画のレビュー

話している途中で、実際に今書いている資料を見せていただき、上記課題をどのようなアプローチで解決するのかを説明する資料を見せていただき、そのレビューを行いました。

結論としては、「解決しようとしている問題も、その解決のために向かう方向も正しいけど、そのやり方に注意したほうがよさそう」という旨のコメントをしました。具体的には

  • リリースエンジニアリング、インフラのセルフサービス化、マイクロサービス化、モニタリングとアラート対応、ログ基盤の構築、SLI/SLO... など、トピックがたくさんあり、これら1つ1つとっても深いテーマなので、一気にやろうとするのは難しいかもしれないので優先順位をつけたほうがいいのでは?特にリリースエンジニアリングに関する自動化が最優先というコメントをしたり
  • SRE っぽいことを進める上では、ツールや技術はもちろんのこと、それを各チームでリードしてくれるひとを作らないと絶対広まらないということを自身の経験あるいは群衆の英知もしくは狂気 を使って説明しました。各サービスチームごとに Embeded SRE のような形で進めていくとのことで、現状興味があるひとがいるということだったので、その点はそういうひとにリードしてもらえればいいなと思いつつ
    • それぞれの要素、プラクティス1つ1つが難しいので、各担当がバーンアウトしないかが心配という懸念をお伝えしました
  • マイクロサービス化に関しては、境界を決めることが難しいため、サービス境界をどう見極めるか、あるいは途中で方向転換できる自信がないなら、あと回してもいいのでは、とお伝えしました
    • 直近では"明らかに切れる"サービスが1つあるということだったので、そのサービスを実験として、Site Reliability Enginering のプラクティスもまわしていくという方向性だったということがわかったので、それは非常に良い選択だというコメントをしました
  • 自分自身の経験から、考え方やプラクティスを組織単位で推し進めるための方法として、まず最初にそれなりのひとが見ている場所に文章を書く、という話をして、そういう場所が今ないので作った方がいいかもしれない、という課題感を持っていただきました
    • 問題と解決策、目指す世界を言語化した上で、各チーム単位で話にいく、というアプローチをとった話をしました

1時間と少しの時間で話は終了しました。

Feedback でいただいたこと

さて、今後もよりよくしていきたいということで、フィードバックをいただきました。

以下、回答を差支えなさそうな範囲で紹介させてください。

聞けてよかったこと、話せてよかったこと、印象に残っていることががあれば教えてください

  • 我々のSREのToBeをレビューしてもらえて忌憚のない意見をいただけたのが本当にありがたいです。こういうのはなかなか外のエンジニアに見てもらう機会がないので貴重な体験でした。
    • あと事前の質問シートのchaspyさんの返信濃度半端ない。あのアウトプット力は見習わせていただきます。
  • 自分たちのSREの方針をレビューしていただけたことが非常にありがたかったです。
    • 印象に残っているのは、chaspyさんのアウトプットの量と質に驚きました。自分ももっとアウトプットするぞという刺激になりました。
  • Cultureの浸透・定着(・継続的改善)がミッション、というところが最も感銘を受けました。他のメンバーの思考・行動に良い影響を与える、というのは僕の最も不得意なところなので、もっと真摯に取り組んでいきたいです。
    • Production Readiness Check、大変参考になりました。「開発初期段階からSREが関与しよう」という取り組みを始めたところでしたが、そのためにもこのようなチェックリストは必須ですね。※当然なのかもですが、明文化・周知・啓蒙はいろいろ応用できそうですね。
    • 「MSAは難しい。モノリシック最高!(苦笑)」は、僕も感じてることでした。特に「何でもRDB、何でもJOIN」で永続データ管理をしてるモノリシックサービスには手を出しづらい。。。昨年末ちょっとだけ検討に手を付けてそれっきりになってしまってますが、分割ポイントをまた検討したいなと思いました。
    • monorepoは他のメンバーに押し付けづらいな、、と思ってましたが、CI/CDの統制という優位性はちょっと自信になりました。
  • SREが作った仕組みを、実際に開発に使ってもらう事がいかに大変か、という話題はとても印象に残りました。定常的なサービス運用/運営にはSREは出てこないという形を考えた時、やや不安もあったのですが、お話できてよかったと感じました

自分の経験から、Blog に書いたアウトプットに紹介しながら、なかなか文章に現れない、大変だったという点が"生の声"として聞けてよかったという感想を多くいただき、よかったなと思います。

また、社内でいくら揉んだとしても、それを社外の、利害関係がない立場から意見をもらえるというのは良い機会だったようです。

話しきれなかったこと、聞ききれなかったこと、もう少し詳しく聴きたかったこと、期待を満たさなかったことがあれば教えてください

  • 元々議論したかった議題とは直接的にはずれていたかもしれませんが、結果的に聞きたかったことは聞けたので満足しています。
  • リポジトリ管理、ブランチ戦略、CICD周りはもうもう少し聞ければよかったかなと思っています。
  • 苦労話が聞きたかったな、とあとで思いました。
  • SRE無職説を説いた時の周りの反応等も聞けばよかったなと思いました

今の思いつきですが、このあたりは事後のフォローとして、個別にメッセージをお送りしようと思います。

本日の時間がみなさんの次のアクションにつながりそうでしょうか?そうであればアクションの内容を教えてください

  • まずは SRE の活動の社内認知。
    • SRE としての活動を社内に認知してもらうアクションが足りなかったことをchaspyさんがされていることを通じて気づきました。
  • 繋がりそうです。
    • 早速あのあと、4人で今後の進め方について1時間くらい話しました。
    • まずは、リリースエンジニアリングの自動化・仕組みづくりを進めていこうとしています。
  • できるところから徐々に、
    • リリース作業の改善 <-- CI/CDの統制を徐々に
    • 開発開始時の改善 <-- SLI/SLO, Production Readiness Check を広げていきたいと思ってます。そのためにも
    • ドキュメンテーション、啓蒙 ですね。
  • 現在のSREタスクを開発に渡してゆくための、タスクの具体化、優先順位付け、渡す内容整理(そのまま渡すのか?整理(物によっては自動化)してから渡すのか)、等の準備に参考になりました。また考えている事や実験した事等を「みなが見る所」にoutputしてゆく事も我々のactionになってゆきそうです

せっかく貴重な時間を、事前の docs へのインプット、レスポンス含め使っていただいているので、何かしら1つでもアクションにつながることがあれば、この会は価値があったかなと思います。

おっしゃられているように、課題はわかっている、それに対してどういうことをすればいいかも議論して見えはじめている、でも本当にいいんだっけ?という感じだったと思うので、その方向性に対して、難しそうな点、苦労しそうな点をお伝えすることで、そのアクションの解像度があがったのではないかな、と思います。

実際に会話に至るまでの流れに不備はありませんでしたか?改善できる点があれば教えてください

  • 特に問題はありませんでした。zoom 様様ですね
  • 事前に質問表ベースでコミュニケーションが取れたのも議論の土台となって良かったです。
  • 我々の出した項目に対し、まずこちらの背景を要求頂いて大変助かりました。
  • 特に困ったことはありませんでした。

事前のやりとりは実験的でしたが、うまく働いたようで安心しました。

会話を行う上で気になった点、不快に思った点はありませんでしたか?改善できる点があれば教えてください

  • 最初はやはりお互い硬い感じになってたかなと思いました。はじめのアイスブレイクをもう少し上手くやれれば良かったと反省してます

その通りですね、フィードバックいただき感謝します。この意見をいただいて2件目では意図的に冒頭にアイスブレイクをいれています。

その他自由に感想を教えてください

  • 貴重な体験をさせていただき本当に感謝してます。
    • chaspyさんの最初の圧に少しびびりながらも徐々に打ち解けられていって良い時間を過ごせたと思います。
    • 自分が体験してみて非常にプラスな時間でしたので、chaspyさんのこの活動がもっと広がれば最高です!
  • まず、エネルギーの質・量のケタが違うな、とエンジニアとしての日々の努力不足を痛感しました。
    • 今まで外部の勉強会で、他の方が「うまいことやっている」のを学ぶことはあっても、「どれだけバリバリやっているか」を実感する機会はなかなかありませんでした。
    • なんだか、今後頑張っていけそうな気がします。
    • 本当にありがとうございました。
  • いい刺激になりました。

勉強会のあとの懇親会で話を個別に聞く、みたいな感じに近いのかもしれませんね。勉強会での発表内容や、ブログの内容はどうしてもきれいでまとまったもので、応募者さん自身のケースに合わせて、こういう苦労がありそうだね、あったよ、という生の話を聞ける機会はなかなか得るのは難しいかもしれないので、そういう意味で良い場を提供できたのではないかと思います。

また、僕自身も、話す上で自分自身のブログのアウトプットを Reference として提供したり、知っていることを docs で書くなど、アウトプットの力の重要性を再認識できました。今後も怠らずに伸ばしていきたいと思います。気づかせていただきありがとうございます!

なんだか、今後頑張っていけそうな気がします。

めちゃくちゃ嬉しい。。。。!

まとめ

最後に、あらためて今回の bosyu の内容をまとめます。


SRE あるいはそれ以外を雑談したいひとを bosyu

SRE やそれ以外について雑談・相談を受けます。コミュニティ活動の一環で、自分に役立てることがあれば貢献したいのと、自分自身も多様なひとと話すことで学びになればいいと思っています。

  • SRE に関すること. SLI/SLO, Production Readiness, Monitoring
  • AWS, Terraform, Kubernetes, Nginx, Ansible etc.
  • Team Building, Culture Making, OnBoarding
  • コミュニティ活動(SRE Lounge, Terraform-jp)
  • その他質問なんでも

特定の深い技術的な解決よりは相談することで次のアクションの手助けになればいいなと思っています。 30分以内無料、30分以上1時間未満はお酒を何か送ってください。

経歴は https://chaspy.me へどうぞ


補足すると、お酒は amazon の欲しいものリストから選べます。安いのは1000円からあるので、(事前の docs でのやりとりは含まず、当日の会話で30分以上を選ばれる場合のみ、)実際に体験したあとのお気持ちで送っていただけると幸いです。

www.amazon.jp

(なお今回めっっっっっちゃお気持ち積んでいただいて喜びダンスしました。。。。。。。)

また、ここであげていること以外でも、今回やったように、 社内ドキュメント、資料のレビュー というのはお役に立てることだと思います。(もちろん秘密は厳守します)

おわりに

今回、思いつきでのはじめての試みでしたが、満足いただけたようでやってよかったなと思います。今後もコミュニティに貢献できるように、この bosyu は継続的にオープンしながら、自分自身もさらに経験を積み、わかったことや失敗したことをアウトプットしながらさらに価値を発揮できるよう頑張っていきたいと思います。

貴重な機会をいただいた、応募者様、チームのみなさま、本当にありがとうございました!

bosyu 応募いつでも誰でもどうぞ!

Argo Rollouts を使った Canary Release

はじめに

今年は Progressive Delivery をやっていくぞ!という気持ちでいろいろ調べたり試したりしています。その中で、試すのにもっともハードルが低い Argo Rollouts を使っていき、実際に導入するまでを説明していきます。

本当のところを言うと Argo Rollouts 良さそうっスよ、とか言ってたら速度で同僚の mtsm さんRails Upgrade の文脈で素振って使いはじめてあれよあれよと明日本番でやるということで、お任せしてもいいんですがまぁ一応ね、ちゃんと追いつくぐらいはしとかないとね、と思い慌ててまとめています。

Argo Rollouts

オフィシャルドキュメントがちゃんとしているのは最高ですね。

argoproj.github.io

Argo Family の1つで、Kubernetes Deployment の代替となるものです。Deployment と同様に Replicaset を子リソースとして持ちます。通常 Kubernetes Deployment は Replicaset の入れ替えに Recreate か Rolling Update といったStrategy によって行われますが、Rollouts はこの Strategy をより詳細に定義できるリソースです。

何ができるのか

strategy field で step を定義し、replicaset を移り変わる際の挙動を指定できます。

setWeight: 10

Canary 中に Update を進める割合です。これだと 10% を意味しますが、実態は replicaset なので、どう頑張っても pod の数の粒度でしか進めることができないことが注意点です。

argoproj.github.io

important note に書いてますが、round up されます。

pause

止まります。言い換えると、人間の判断を待ちます。

dashboard なのかなんなのかを見て、Yoshi! となってから、promote と呼ばれるコマンドを実行することで次の step に進みます。

なおこの Pause に Duration をつけることも可能で、つけた場合は指定した時間待機して、次の step に進むことになります。

その他の機能

ざっと見ていきましょう。

  • analysis: これは重要です。決められた条件を満たさなければ、rollout は abort となり、元に戻ります。これについてはあとで詳しく掘っていきましょう。
  • antiAffinity: 古い version の replicaset と新しい version の replicaset が同じ node に schedule されないように、RequiredDuringSchedulingIgnoredDuringExecution を set すればいいってやつ。なんでかというと古い version と 新しい version の pod が同一 node に混在していた場合、古い version がスケールインした場合、新しい pod がのっている node は Cluster Autoscaler によって縮退されてしまうから。でもそういうことあるかな。。。そもそも PodAntiAffinity を基本 Production では有効にしているので不要な気がする。
  • canaryService: 有効にすると canary 先の新しい replicaset にだけ traffic を流す。これ、なんのためかわかんなかったけど前方互換性がない場合のためかな?でもそれ割合によって capacity 激落ちするけどいいんだっけという。
  • stableService: stable, つまり canary 先ではないほうを常に参照するようにする。これもなんのためにやんだっけと思うんだがユーザに公開せず deploy して、canary の replicaset には何らかの方法で特別にアクセスするのか?traffic routing のところの header とか使って。
  • maxSurge: 各 step の setWeight した場合に遷移する際に作られる pod の maxSurge。意味あるんだろうか。。。
  • maxUnavailable: 上に同じ。default 0 だし、それでいいんではないか。
  • trafficRouting: 基本は新旧の replicaset の pod の割合で weighted loadbalancing されるが、特殊なルールを設定できる。が、これは Advanced かな。Pod 単位より小さい割合での Traffic Spliting だったり、Header Based routing だったり、Mirroed traffic だったりできる。が、これは他の Front Proxy(Istio, Nginx Ingress Controller, AWS ALB Ingress Controller, Service Mesh Interface)等との組み合わせで実現できるものなので、応用かなーと思っている。

HPA Support

argoproj.github.io

HPA と組み合わせたらどうなるの?ということだが、ちゃんとサポートしている。

HPA の target を rollout resource にしても動く。HPA は rollout の desired replicas を変化させる。

ただ Progressive State のときのロジックが新旧それぞれ Ceil になってるらしく、合計を上回ることはある。

github.com

このへんは同僚の mtsmfmd-kuro がちゃんとコード追っててさすがとなりました。見習おう。

実際にどうやるのか

Plugin いれましょう。

argoproj.github.io

Deployment からの書き換えはここを参照。

argoproj.github.io

あぁ、その前に Controller はいれておきましょう。Cluster Level で先にいれておいたら、あとは yaml 書くだけなので楽勝です。

まぁ例えばこんな感じの差分になる。

f:id:take_she12:20200616043137p:plain

で、もともと Deployment があった場合、Rollout と二重になる。selector も同じなので、ClusterIP の Service からどちらも Traffic は流されるはずだ。

実際の手順は以下のようになるだろう。

  1. Deployment を Rollout Resource に書き換え、Apply
  2. Cluster 上の Deployment を削除する
  3. Canary Release する

この場合、1 と 2 の間では実際に指定した割合以上に、すでに存在している旧バージョンである Deployment にも Traffic は流される。が、まぁ悪いことではない。

もっとも原始的にやるなら、SetWeight と Pause を交互に書けば良い。Promote は CLI で Web Engineer がやる想定。なお RBAC で権限絞ってる場合は変更が必要。

また、待ち時間によって自動的に次の step に進めたいなら Duration を指定すれば良い。かんたん。

Analysis

どうせやるなら自動で戻ったり進んだりしたいよね。Analysis 見ていきましょう。

argoproj.github.io

4つの CRD

  • Rollout: これまで説明したやつ
  • AnalysysTemplate: その Analysis が成功したか判断するロジックとかどの metrics 使うかとかが書いてあるやつ。引数も受け取れる。全体の中での条件( Background Analysis )として使われることもできて、この Step 以降でみる、みたいなのもできる。( startingStep ) また、Step の一部として Analysis を実行する場合でも使える。( Analysis at a Predefined Step
  • AnalysisRun: 複数の Analysys Template を、Step の一部として実行する場合に使われる( Analysis with Multiple Templates
  • Experiment: 解析のために限定的に Analysis を実行する。

その他

  • BlueGreen Pre Promotion Analysis: Blue/Green の事前 Analysis
  • BlueGreen Post Promotion Analysis: Blue/Green の事後 Analysis
  • Failure Conditions: Analysis の失敗条件
  • Inconclusive Runs: 解析結果が決定的でない場合がある:成功条件にも失敗条件にもひっかからない場合など。この場合、その Step で止まってしまう。
  • Delay Analysis Runs: initialDelaystartingStep で解析開始までに遅延をいれること。
  • Referencing Secrets: 外部 Provider へ metrics を収集するときに必要になりそうな Token のような秘匿情報を同じ namespace から arg として渡すことができる
  • Experimentation (e.g. Mann-Whitney Analysis): Stable と Canary 両方に Traffic 流して、どっちも Analysis やる的な。たぶん。
  • Run Experiment Indefinitely: Pause のように Duration を指定しなければずっと Experiment させることができる
  • Job Metrics: Analysis は Kubernetes Job として実行もできる
  • Wavefront Metrics: 知らぬ
  • Web Metrics: 外部の web service の metrics を使う。datadog の場合はこれ使うしかないんかな。

metrics provider 何があるんだろうか。

github.com

ここぽい。うーん web 使うしかないかあ。

とすると datadog api 叩くための secret 作って、それを arg で渡して get する analysis 書いて、arg でサブドメとか渡して前段の nginx の http status の 5xx / 2xx rate でいい気がする。

気をつけるべきこととか

  • 前方互換性:Canary Release するなら、これは守らないとダメ
  • branch が1本しかないことを許容する:つまり Progressing のときに HOTFIX を当てるとかはできない。したがって analysys と組み合わせて比較的短時間、例えば1時間とか。であげきる必要がある。
  • Rollback & HOTFIX: 基本的に途中でダメなら Abort で Rollback して、それに HOTFIX をあてて前に進むという戦略を取る。あげきったあとは戻れない。(し、戻る必要はない)
  • Deployment から Rollout というリソースに変わるので、アラートや Dashboard が死ぬ。やむなし。
  • 毎回 Strategy を選択するのは理想的ではない:
    • いや、リリースのたびStrategy 部分のコードを変更すればいいんだが
    • やる?それ、という
    • 基本的にはすべてのリリースで毎回通る Strategy を指定するしかないんでは
    • あるいは Analysis 付きの場合は対象の Analysis を変更することでスッと行くようにすることはできると思うが
    • そこに気を使わないといけない状況嫌じゃない?

おわりに

この記事が出る本日 Production でやっていくようです。やっていきましょう。

次は Traffic Management を読んで、ALB Ingress を利用したパターンを理解しておく。

6月目標

たぶん半分もできないのはいつものこととして、いったん頭の中をダンプするのが大事なのだ

英語

  • Elsa ぼちぼちやってるけど効果でてるのかさっぱりわからん
  • abceed はなかなか点数があがらんくなってきた
  • DMM 英会話やめてパーソナルコーチに変えてみるのをやってみる。その中で英語学習全体についてのコーチングも受けるのでそれ次第かな
  • 仕事で話せなかったやつとかそれいいなーって思ったのをメモしてるのでそれ復習して使いこなせるようにするみたいなトレーニングを習慣化したいなー

セキュリティ

SRE

サイトリライアビリティワークブック ―SREの実践方法

サイトリライアビリティワークブック ―SREの実践方法

  • 発売日: 2020/06/15
  • メディア: 単行本(ソフトカバー)

資格

Community

  • Kubernetes Website の日本語翻訳 はちょいちょいあいてる時間に息抜きにしていこうかなと思います
    • もし自分が知らないことが当たればラッキーだけど、まぁ学習というよりコミュニティ貢献という感じで
  • SRE.fm #2 "Production Ready" をテーマでゲストを打診中。これも実はコミュニティに恩返しをしたいと思ってはじめたというのもあるのです

仕事

  • EKS 移行
  • Progressive Delivery
  • Team のいろいろ
  • Global のいろいろ

生活

  • 味噌汁がつねにある生活がめっちゃいいので続けたい
  • 10km ラン 思考のデフラグになっていいので続けたい
  • 米抜き継続

おわりに

6月までがんばり継続、7月はゆっくりする。

IaC Maturity Model と学習ステップ #srefm

はじめに

先日、ノリと勢いで企画した SRE.fm を行い、ゆるふわに Terraform や IaC の話をしました。

sre-fm.connpass.com

実際にやってみて、質問への回答を行う中で、IaC に関わるひとたちのマジョリティと自分たちには大きな隔たりがあるような感覚を持ちました。そういった中で、質問の1点1点に答えるというよりも、大局的な理解であったり、その本質的な要素であったり、段階に分けた学習ステップ等を言語化することが必要なのではないか、と(その後の二次会で)たどり着きました。

「IaC は当たり前になった」というのは Infra Study Meetup #1「Infrastructure as Code」 での Mizzy さんの言葉で、これに関しては大きく同意するものの、この「当たり前」は「誰でもしている状態になった」「できていないのはありえない」というものではなく、"Basic" - 基本となった、という意味合いが近いと思います。(簡単 - Easy という意味ではない)これはやる意義や方向性に関してはある程度揺るぎないものになってきた一方で、それを成し遂げる方法が簡単になったわけではないと思いますし、基本になったからこそ、より多くのひとが関心を持つようになりました。だからこそ、学習ステップの言語化がより重要になってくるのではないかと思います。

おことわり

というわけで本記事ではこういった IaC にまつわるいろいろの言語化に試みますが、全文章に(たぶん)(しらんけど)がついてると思って読んでください。

筆者は SRE Team で2年ほど IaC を行ってますが、すでにできているものを運用しながら覚えていきました。2年前は Terraform をちょこっと自分で動かしたことある程度でした。あと、Terraform と AWS がメインなので、そちらに視点が偏っていると思います。自分も学習に苦労した気がしつつ、もう忘れてしまっているので、再現性を持たせるためにも言語化することにしました。

あと後述する IaC Maturity Model だと Level 4 にいます。

IaC Maturity Model

@chaspy なんか IaC のレベル感とかをステップごとに分ければいいんかなー

@qsona よさそう。IaC Maturity Model

こういうノリで段階を区分けして、自分が今どの段階にいて、次はどこを目指すべきかを示すと学習の手助けになるかもしれません。

  • Level 0 インフラリソースを全て Manual で作成しており、一切コード化されていない
  • Level 1 インフラリソースが Code 化されているが、plan や apply は localmachine もしくは共有サーバ上で manual で行っている
  • Level 2 インフラリソースの変更が CI/CD Pipeline の中で実行されている
  • Level 3 インフラリソースの変更が Pull Request Based で実行結果のレビューができる
  • Level 4 複数のチームが自律的に各チームの関心のあるインフラリソースを、レビューを通じて変更、適用ができる
  • Level 5 複数の組織がそれぞれの IaC リポジトリを持ち、各チームで維持・運営ができている

その他関連しそうなことをまとめてテーブルにしてみました。

Level Automation Scope
0 No Personal
1 No Personal
2 Yes Team
3 Yes Team
4 Yes Multiple Team
5 Yes Organization

ここで重要なのは Scope の概念です。Effective DevOps がなぜ組織に着目したのか。それはツールを利用してソフトウェア開発のスピードを高めるには、どうしても組織でそれをうまく扱う方法を考える必要があるからです。IaC Maturity Model は組織のスケールに対してどのように適用していくかの段階を言語化したものになります。

Effective DevOps ―4本柱による持続可能な組織文化の育て方

Effective DevOps ―4本柱による持続可能な組織文化の育て方

IaC の難しさ

さて、学習ステップをどう考えていくかの前に、IaC の難しさに目を向けてみたいと思います。

IaC の難しさはその"運用"にあると思います。つまり複数人で運用するための仕組み作りです。Level2 以降の部分にあたります。

実際、ただコードに起こすだけならそんなに難しくありません。既存リソースのインポートは泥臭い作業が必要ですが、もうそれは(なるべく自動化しながら)愚直にやるしかありません。新規リソースの作成もサンプルを通じて HCL 定義を書いて Apply するだけです。

この"運用の難しさ"を考える点がこれまでなかなか言語化されてこなかった点だと思います。

運用を想像する難しさ

運用を想像するために、主要な要素をいくつかあげてみましょう。

State Unit

インフラリソースをどの単位で適用していくのか、その分割単位のことです。

これは特に Level3 から Level4 に移るときに考慮する必要があります。

monolithic な state であることの問題点は、対象のリソースが多くなることで、Plan や Apply に時間がかかる点や、その影響範囲が大きくなってしまい、変更がしづらくなってしまう点です。

これを"適切"に分割する、という答えが組織によるところで、多くのひとが(僕も含め)悩まれる点だと思います。これに関しては

  • 原則 state 間の依存を作らない
    • 作る場合は1方向にする
    • データソースで持ってくる
    • リソース名や ID をベタに書く
  • オーナーシップを効かせるために、チームで扱う単位で分割する

というのが私見です。

Branch Strategy

開発と本番をどのように分け、どのように適用しているのかを Branch Strategy とともに想像する必要があります。これは前述の State をどう分けるかにも密接に関わってくるため、少し複雑です。

よくみるパターンとしては

1. リリースブランチパターン(コードは共通)
  • master merge で Staging へ Apply, release branch merge で Production へ Apply
    • CI の中で vars で切り替えるか、workspace を利用する
    • フローが1本化されるため、かなり厳密な開発本番一致が求められる
    • 例外をどう扱うか(sandbox を別に作るとか)がポイント
    • 規模がある程度大きいとキツくなると思う。(Resource 200+ とか)
2. GitHub Flow パターン(コードはディレクトリ・state もわける)
  • この場合、Feature Branch では Plan のみになるため、master 必ず apply される
  • 開発と本番をディレクトリでコードを分割する service_a/staging service_b/production
    • まぁ分割しなくても workspace を使えばできなくはないか。。。
  • 開発本番一致を厳密に求めないものの、diff で確認できる

弊社は現状後者のパターンを取っています。変数が多いのでまとめると

Pattern リリースブランチ 開発本番でコードは 開発本番でstateは
1 Yes 同じ 違う
2 No 違う 違う

Branch Strategy に合わせて State も分割されるため、その場合は実行時間が長くならないよう、変更検知をして変更があったものだけを plan, apply する仕組みや、1PR で複数の state を変更させないような仕組みが必要になってくるでしょう。

IaC の罠

IaC はインフラを Software のように扱うことで、Software 開発のプラクティスを利用できる、という言説がありますが、注意すべき点がいくつかあります。

通化

ソフトウェアではよく Function を共通化したり、モジュールを使って再利用性を高めたりしますよね。IaC ではそれは影響範囲を広くすることに他ならないので、極力避けたほうが無難です。

特に Terraform の module を DRY のために使うと、その内容を変更しようとしたときに大変ですし、何より一段層が増えることで単純に可読性が悪くなります。

Terraform の module は"強制化したいもの" - 社内で決められたパラメータがある、これだけは絶対に必要なものである、そういったものを module 化するのが好ましく、必要になるまで使わないほうがいい、というのが私見です。

Repeat Yourself ですね。

ロジック

本当にまったく同じリソースを大量に必要になってくるなら必要ですが、ループや分岐といったロジックはどうしても必要になるまで使わないほうがいいです。

これも同じくそのコードを読み取るのに認知負荷がかかるからです。

IaC をどう捉えるか

Infrastructure を Code で表現できるようになったことで、Software 開発でよく使われる方法がすべて好ましいかというとそうではないことを述べました。

これまでの経験を踏まえて、ポイントをまとめてみます。

  • IaC はインフラを宣言的に表現することができる
    • 容易に内容が把握できる(grep ができる)
    • コピペもできる
    • バックアップにもなる
  • IaC はインフラの API のラッパーである
    • API でできることを宣言的に書けるように Provider がしているものにすぎない
    • 結局対象のリソースが何で、それを API でどう扱えるかを知る必要がある
  • IaC をチームで運用する上でもっとも大事なのは認知負荷を下げることである
    • Software Engineer は grep とコピペは得意
    • いらないリソースは消す、いるリソースは増やす、それをシンプルにやるのが良い
      • それがロジックや共通化、依存を極力避けたい理由
    • なおさらインフラに詳しくない Software Engineer まで扱えるようにするためには、Simple さをキープすることが重要

このあたりは実は誰も教えてくれなかったことなのかもしれないなーと、今思います。

IaC の学習ステップ

さて、いよいよどのように学習していけばいいか、Level ごとに考えていきましょう。再掲します。

  • Level 0 インフラリソースを全て Manual で作成しており、一切コード化されていない
  • Level 1 インフラリソースが Code 化されているが、plan や apply は localmachine もしくは共有サーバ上で manual で行っている
  • Level 2 インフラリソースの変更が CI/CD Pipeline の中で実行されている
  • Level 3 インフラリソースの変更が Pull Request Based で実行結果のレビューができる
  • Level 4 複数のチームが自律的に各チームの関心のあるインフラリソースを、レビューを通じて変更、適用ができる
  • Level 5 複数の組織がそれぞれの IaC リポジトリを持ち、各チームで維持・運営ができている
Level Automation Scope
0 No Personal
1 No Personal
2 Yes Team
3 Yes Team
4 Yes Multiple Team
5 Yes Organization

Level 0 -> 1

  • Terraform といった IaC ツールそのものの理解
    • 概念の理解:state, provider, init, plan, apply, import, refresh
    • 実際にサンドボックスで動かしてみる。S3 を作るとか。EC2 を作るとか
  • コード管理したい対象のリソースの理解
    • AWS であればまずどういうリソースがあるのか?何をどこまで管理すればいいのか?
    • それらを API でどのように扱いたいか?
    • 本当にコード管理すべきか?複数人チームで扱うか?変更頻度はどうか?
      • 1度作って1年間変更しないものならしなくていいかもしれない
    • 対象のリソースは Provider が提供しているか
      • あれば動かしてみたり、パラメータを眺めてみたりする
  • 実際に GUI で作ったものを Import、変更をしてみる
  • あとは気合で全部 Import する

Level 1 -> 2

  • CI/CD ツールの理解
    • どれを選んでもさほど差はないので、お好みのものでいいと思います
    • CircleCI, Travis CI, Github Actions
    • AWS CodeBuild, CodeDeploy は使ったことないです)
  • Branch Strategy を考える
  • CI 用のユーザの権限を考える
    • 本当は最小権限が良いのはわかってるが、強い権限をあげがち

Level 2 -> 3

  • Level 2 と 3 はあんまり大差ないかも
  • 今なら tfnotify が便利そうです
  • レビュー観点の整理
    • とはいえ文法はだいたい plan で落ちる
    • apply してこけるものもあるが、そういう前提で、リスクなく失敗できる環境作りに注力したほうが無難

Level 3 -> 4

  • State 分割単位を考える
  • はじめからここまで想定しておけば、インポートの段階から分けておいても良い
  • plan 実行長期化を避けるための変更検知の導入
  • 他のチームで使ってもらうための勉強会等の実施
    • ドキュメント
    • 頻繁に作るリソース - microservices ごとに RDS を作るとか - があれば tf file を scaffold する script を用意してあげるとか

Level 4 -> 5

到達してないので分かりません。たぶん Module 使ったり、Terraform Cloud 使ったりするのが便利なんだと思う。


おわりに

こう考えると、IaC そのものが登場するのはほとんど Level 0 ->1 の間であり、それ以外はチームでどのように扱うか、という点に難しさがあることが分かると思います。

本記事がこれから IaC をはじめるひとや、現状の運用に悩んでいるひとの学習指針になれば幸いです。

謝辞

今回、この記事を書くにいたり、SRE.fm にいきなりのお願いにも関わらず協力いただいた @ryok6t さん、@_inductor_ さんに心から感謝します。この場で話したおかげで、自分自身の思考の整理にもなりましたし、この記事のアウトプットにつながりました。

このアウトプットのきっかけをくれた同僚の@sona さんに心から感謝します。いつもイシュー度の高い問題を提起してくれるおかげで、僕自身も考えるきっかけになっています。

Quipper において Infrastructure as Code を高いレベルで構築、維持してくれた SRE Team の卒業生、および現 SRE Team メンバーに心から感謝します。僕が今このような知見を持つに至ったのはもともとお手本になる基盤があり、そこから学ぶことができたからです。特に現同僚の@suzuki-shunsuke さんの高い技術力にいつも助けられています。

Terraform-jp slack コミュニティ のスタッフ、および参加メンバーに心から感謝します。いつも有用な情報交換や相談に乗っていただけたおかげで理解を深めることができています。

突撃!隣の Terraform の際に突撃させていただいた Kyash の@lamanotrama さん、Mercari の @deeeet さん、@dtan4 さんに心から感謝します。他社事例を知ることで非常に多くの学びを得ることができました。

InfraStudy にて基調講演を発表された Mizzy さんに心から感謝します。心に残る言葉でシメていただいたおかげで、本記事を書くことができました。

おまけ:質問の回答

その場で回答しましたが、ひとはライブアーカイブを再度見ない生き物であることがわかっているので、僕の意見にはなりますが、ここで回答をまとめておきます。

https://app.sli.do/event/bk0aqupz/live/questions

Terraformのレビューに関して、どのような観点でレビューしてらっしゃるのでしょうか?

  • そもそもこのリソースがなぜ必要か、というサービスレベルの観点
  • 対象のリソースが正しく作られそうか、ほかに必要なリソースはないかというリソースレベルの観点
    • 意図通り作られそうか。どのように通信されるのか、とか
    • tag がちゃんとついてるか、とか
  • あんまり HCL 自体のレビューはしない
  • apply で落ちることもあるけど、はやく失敗したほうがいいかなという考え
  • ざっと見てえいっとやってバーンするのが多い

tfstate の分割単位はどの単位でしょうか

  • 各サービスのチーム単位
  • 共通部分、VPC やネットワークは SRE が見ている

Terraform Workspaces を使っていますか?使っている/使っていないに関わらず、その選択をした理由をお聞かせください。

  • 誰も使ってなかったと思う
  • 開発本番を完全一致させていれば、開発本番の切り替えにつかることもできる
  • たぶん大量の同一リソースを複数のテナントで使ってもらうときとかに有効な気がする

state を分割して、かつシェルスクリプトで実行時間を短縮しているかとは思いますが、複数 state にまたがる変更の plan/apply の実行時間は気になりませんか?(並列に実行したりしてるんでしょうか)

  • 並列実行してます
  • 変更検知して変更があるやつだけ実行するのが一般的だと思います

Terraform以外で気になっているインフラ管理系ツールはありますか?(ex CDK,Pulumiとか)

  • chaspy は特にない
  • 開発者が好きな言語でかけてテンションがあがるならそれでいいと思う
    • (テンションがあがるのは大事)
    • ツール自体はなんでもいいはずなので
    • Provider 相当の部分がちゃんと公式の A{PI に追従しているかは気にした方がいいと思う

クレデンシャル情報の管理はどうしていますか?

  • CI で実行する AWS の credential という意味なら CircleCI の環境変数

インポート作業にどれぐらいの期間かかりましたか?

  • kubota さん向け、3ヶ月だそうです

medium.com

module分割する場合、役割単位、サービス単位どちらが良いのでしょうか

  • サービス単位をお勧めします
  • チーム単位というか

俗人化問題はどうやって解決してるんだろうか。

  • たぶん kubota さんに対するもの
  • なんだっけ。。。

CICDは会社さんによってまちまちでしょうけど、実際のところどうでしょうか?

  • どうなんでしょう
  • まちまちな感じですね
  • お好みで良いと思います

新規プロダクトや少人数チームで IaC がどの程度必要なのか

  • Team Level で扱うなら検討した方がよさそうです
  • この質問も今回のモデルを考えるためのヒントになりました。ありがとうございます。

「dryに書く」という表現イマイチわかってないのですが、具体的にどんな感じなのでしょうか

  • Don't Repeat Yourself といって、ソフトウェア開発で同じことを複数書くことを避けよ、という考えがあります
  • ある Role の EC2 インスタンスDNS record の module を作って、それをペタペラ複数作るとか、ですね

workspaceを使わない場合、環境毎のリソース名の違いはどのように吸収しているのでしょうか

  • ディレクトリと State を分けてます
  • inductor さんは vars でわけて、CI で injection してました
  • コードレベルじゃなく、CIのところでなんとかしたほうがいいよね、って結論になったはず

tfstateを分けないとplanやapplyの速度は遅くなりませんか?

  • なると思います
  • 100 とか 200 とかなると分けざるを得ないと思います

dev/prdなどでtfstateを分割したときに共有のresourceをどう管理するか悩んでます。 flagを持たせたり変数で制御したりしてるのを見ますがif文を使うのは負けな気がして。

  • リソースを共有しないほうがいいと思います
  • if 文もやめたほうがいいと思います

使っているTerraform Providerにはどんなものがありますか

  • AWS
  • GCP
  • Datadog が話題にでましたね
  • 僕はほかに Deadman's snitch や pingdom も使ってます

qiita.com

Terraform本体とProviderのバージョンアップ運用はどうしていますか。アップデート頻度も気になります。

  • 基本は最新に追従したほうがいい、ためるとつらい
  • chaspy は githubwatch して最新版でたらバージョン書き換えて PR 作るジョブを使ってます
    • plan みて問題なければマージ
    • 差分あれば修正

CircleCIのほうが多機能な気がしますが、GithubActionsは今後も使っていきたいですか?

  • inductor さん、actions は ssh できないとか制限があるところが好み、という話だったと思う

Jenkinsはどう稼働してますか?自前でサーバを準備ですかね 笑

  • EC2 ですね

おすすめのゲーミングベッドを教えて下さい。

  • 僕このときいなかったな。。。

IaC のテストステップはどんな分類があるでしょうか?(構文チェック、ユニットテストなど)

  • 僕このときいなかったな。。。
  • ユニットテストは書かないですね
  • lint は tflint がある?
  • tf fmt は CI でみてる
  • ポリシーテストとかやってる事例はありますが、このメンバーは誰もしてなかった気がする

hcl2 の制御構文、関数型由来の function と for_each/count を用いて宣言的に書けるのは module 作るときに結構有用だと思うのですが、そのあたりどうでしょうか?

  • 有用だと思います!