ツナワタリマイライフ

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

Nginx Ingress Controller で Progressive Delivery したい

現在運用中の Kubernetes Cluster は、Multi Cluster を Support するためにALB で受けたのち、Nord Port に流されたトラフィックセレクタによって Service Router という、各 Kubernetes Service へ Proxy するための Nginx がいる。

この Config が中央集権的な管理になっており、server directive ごとに区切られるとはいえ、かなりデカい Config になっており、なかなか心理的にもいじりづらくなってきている。

これはもともとさらに前段のインターネットフェイシングなトラフィックを受ける Reverse Proxy(Nginx) の中にあった Config のうち、Service 固有の Routing をいじりやすくするように移したという背景がある。これはこれで、Reverse Proxy よりはいじりやすくなったが、今度は次のステップとして各 Service ごとに Config や Deploy を分離したいと考えている。

加えて、Traffic を Percentage-Based で Canary Release(Progressive Delivery) をやりたいと考えており、そのためにも必ず Traffic を受ける Service Router がいては邪魔なのだ。

そこで選択肢として、慣れている Nginx であり、かつ現在導入中の Rollouts との相性、あるいは将来の選択肢としての Flagger との相性を考えて Nginx Ingress Controller を検討している。

というわけでドキュメントを読んでいく。

kubernetes.github.io

AWS の場合。

kubernetes.github.io

NLB が Ingress Resource としてできるようだ。

しかしこれだと External ALB から NLB に Weighted Load Balancing できないので困ったな。

kubernetes.github.io

で、まぁこのドキュメントだと正直 NLB で受けたあとどういうルーティングで各サービスにいくのかがよーわからんので、Nginx 公式のこっちをみてみた。

www.nginx.com

なるほど Nginx の設定に対応する Virtual Service と Virtual Server Route があるんだね。

docs.nginx.com

つまり、この yaml で表現されるような単純な Routing は代替できて、生の Nginx を書かないといけないような場合は、各サービスごとに Nginx なりを持って好きにしてくれ、という感じになるわけだ。

user -> NLB(Ingress) -> nginx -> service

こういう流れで、Nginx Ingress Controller は与えられた yaml にしたがって各サービスごとの Nginx Deployment を生成して、Configmap の設定を読み込ませるということだ。

Argo Rollout と連携して、canary=weight の値を nginx ingress に持たせておけば、rollout controller が nginx の config をいじって routing 先の service を weighted でいじるのだろうか。ちょっといまだにピンときてない。や、多分特定の割合で特別な Header を NLB でつけるようにして、それをみて Nginx が振り分けるようにする気がする。

ただこの場合、Ingress を通る全部のトラフィックが対象になる気がする。Service ごとにできるんだろうか。やっぱ動かさないとなんともだな。

おわりに

というわけでシンプルに routing するだけなら Nginx Ingress Controller で実現できそうだが、Progressive Delivery をやる上で Flagger なり Argo Rollout なりと連携していく部分はちょっとまだ見えてないので動かして学んでいきたい。

あと、Cluster 自体も Canary Switching したいので AWS で Nginx Ingress をいれた状態でどう実現するかの案も考えていきたい。

追記

split っていう設定があるので、これで Stable と Canary のService へ Canary できそう。

docs.nginx.com

Rollout Controller は多分これを Strategy にしたがっていじるんだろうな。

Argo Rollouts の Traffic Management

読んでいく。

argoproj.github.io

Quipper では日本サイドにおいて Progressive Delivery の方法として Deployment から Rollout への移行が進んでいる。

これにより Pod 単位での Traffic Splitting / Canary Releasing が可能になるが、Front Proxy 部分と連携することでより柔軟な Traffic Splitting ができる。(たぶん)

Overview

できること

  • Percentage-based は Traffic Splitting
  • Header-based routing
  • Traffic Mirroring

夢がひろがりんぐですね。

基本的に、Kubernetes Native の機能では上記のようなサポートは提供されないため、Service Mesh をサポートする以下の外部ツールを使う必要がある。

  • Istio
  • Nginx Ingress Controller
  • AWS ALB Ingress Controller
  • Service Mesh Interface(SMI)

Argo Rollout Controller はこれらの外部 Service に対して変更を行うことで Traffic Routing を行う。

1つずつみていく。

Istio

最終的に本格的に Controll Plane を入れる場合にIstio は強力な選択肢の1つであるが、まだベネフィットに対して運用負荷のほうが高そうなので、来年4月に再検討する、ぐらいの温度感である。

Argo Rollouts Controller は Istio の virtualService を指定する。

virtualService では route として destination を定義し、stable-svc と canary-svc を宛先として指定する。

Argo Rollouts Controller はこの Weight を Rollout の設定にしたがって変更することになる。

ところで Canary Service と Stable Service の2つを用意しないといけないと思うんだけど、これのセレクターはこの Rollout でいいんだろうか?このへんがよくわかってない。

それとも Service + Rollout で2セット用意するんだろうか?だとすると Kind Rollout の Resource も2種類必要になってきてよくわからなくなるから多分違う。

なお GitOps と連携する場合、Controller が Weight を変えてもすぐに戻ってしまうが、ArgoCD では Annotation をつけることで Argo Rollout Controller の変更のほうを優先するとのこと。便利。

Nginx

次のステップとして Nginx Ingress Controller を導入しようと考えている。現在 Application が Rollout に移行していることを考えると、この組み合わせでやることになると思っている。

ちょっと Nginx Ingress Controller 自体がどういう動きをするのかまだ理解できてないが、Nginx の Deployment に対応する Ingress Resource が存在して、それぞれが Annotation を持つ。Canary 用の Ingress の canary-weight field を Argo Rollouts Controller が変更する。

うーん、雰囲気はわかったけど雰囲気しかわからない。

Traffic が Front -> Nginx(Stable) -> Service -> Rollout だったとして、Nginx(Canary) があらたに存在するとして、何を持ってトラフィックを Canary 経由にするのだろうか?さらにその前段に Traffic Splitting をする Layer が必要な気がする。

AWS ALB

一度 ALB Ingress 導入したが、今は Multi Cluster を Canary Switching するために Ingress をはがしたのでもうこの選択肢は使わない。

Ingress で ALB の Weight Target Groups の機能を使い、行き先の Service を指定するようだ。とはいえ、結局宛先は Node Port が受けるような Target Groups になると思うんだが、何を持って後続で区別されるのかが謎。ALB 的には Kubernetes の Service って見えないと思うので、"ServiceName":"stable-service", が ALB 上でどんな設定になるのか気になる。

SMI

SMI も雰囲気でしか理解していない。Service Mesh のための CRD が標準的にあって、それを使おうぜって感じなのかなという雑な理解。

で、Argo Rollouts Controller は TrafficSplit CRD を操作して、Weight を変更する。

あーで、ようやくわかりやすい図が出てきた。

なるほど、Canary Service と Stable Service はそれぞれ App の Selector 以外に、Rollout の Replicaset の hash を持たせておいて、そっちに転送させるみたいなことができるのか。すごい。で、Rollouts Controller はそのそれぞれの Service がもってる hash を replicaset が変わるたびに指定すると。なるほどがってん。

おわりに

いずれの手法も、Front Proxy の層で Traffic Splitting する部分の Weight を Argo Rollout Controller が変更する。その部分の宛先はそれぞれ Canary と Stable のService を事前に作成しておき、それらの Service は Rollout 管理の Replicaset へ Routing することで、Rollout による2世代の Replicaset 管理に対して Canary Releasing を実現している。

次回は実際に使っていくであろう Nginx Ingress Controler 自体の理解を深めていく。

Private English Lesson #2

2020/06/16 にやった分を今更復習。

Pronunciation

  • Vincent vowed vengeance very vehemently
  • She sells seashells by the seashore

v と sh の練習。sh はイーの口で息を吐く感じ。

これ、意外と残るんだよな。すごい。

Expressions

  • I can‘t agree more
    • I totally agree
  • I‘m with you
    • I’m in your side
    • I agree with you
  • I’m in.
    • Ok, let’s go
    • Casual expression

同意するときの別の言い回しが2つと、カジュアルな承諾。I'm in ははじめて聞いた。

Writing

留学先の担当者に、質問をメールでする課題。

で、いろいろツッコミがあったんだが、疑問文をちゃんと作れてないことがわかった。

以下を聞くとして

  • How many students there will be in the school and each class
    • How many students will be there in the school and each class?
  • What qualifications the teachers have
    • What qualifications do the teachers have?
  • What resources the school has
    • What resources does the school have?
  • What is included in the price
    • What is included in the price?
  • What amenities there are in the area
    • What amenities are there in the area?

What なんちゃら系の疑問文を全然普段書いてないことに気づいた。 Do you? Did you? とかか、肯定文 + right? とかで済ませることが多いっぽい。

なんかその事実にめっちゃショックを受けてしまったのと、そのときめっちゃなんか疲れてたっぽくて、その次のレッスンでがっつりこの辺話して、うわーまじかーってなって、それからちゃんと復習してからやるぞーっていって、予約できてなくて2ヶ月経ってしまった。

DMM 英会話がマンネっててやめてしまったので、質の改善という意味で Private Lesson に切り替えて、収穫もあったが、継続しなければ意味がないので、DMM 英会話を再開すると同時に、Private Lesson も来週から再開予定。

普段細かく指摘されることのない Pronunciation, あと事前にリクエストしておいて、仕事で使えそうな Expression を教えてもらったり、英語の勉強やりかたとか、まぁ英語における「不自然な表現」みたいなのを指摘してもらえるのはありがたい。今年は Writing もちゃんとやっていきたいので別料金でそれの添削もしてもらえたらと思ってる。

英語学習をはじめて1年経った

そういえば英語学習を気合入れてはじめてちょうど1年経った。

見える世界はだいぶ変わったと思う。9ヶ月ほど DMM 英会話をほぼ毎日続け、仕事で英語を使う機会が増えて。

そのときは同僚に時々 1on1 でコーチングをしてもらっていたんだけど、当時のメモがこれで。


どこに行きたいの?目的地

  • 国際カンファレンスで聴講者として英語で質疑応答ができる
  • 国際カンファレンスで発表者として英語で質疑応答ができる
  • 社内の英語話者と仕事に関する議論を電話会議でできる

自分は今どこにいる?スタート地点

  • 英語のほとんどが1回では聞き取れない
  • 語彙も少なく、図を使わないとチームメイトと意思疎通ができない
  • 発音が見についておらず、自分の発言が相手に伝わらない
  • TOEIC院試前595がベスト
  • 読むとき、技術文章は1度じゃ理解できない
  • 書くのも1度調べる、長いものは

目的地に達せたかというと、そうとはいえない。ただ、部分的に、手加減してもらっている範囲内で言えば仕事に関して電話会議をする機会は増えた。国際カンファレンスも、質問できるかはおいといて、一年前は全然さっぱりわからなかったのが、今は普通に聞こえるようになっていることを KubeCon で感じたのは大きな進歩を感じた。

上記のスタート地点に比べると、聴き取れる量はだいぶ増えてきたし、喋るのも、ブロークンながらなんとか伝えることもできるようになってきた。読むときの理解のスピードはまだちょっと遅い。Writing も昔よりはスピードとか分量書けるようになってきたけどまだまだって感じ。

5月に一度振り返ったんだが、このタイミングでまた次の1年どこを目指して、何がギャップで、そのために何をするのかというのをあらためて整理する。方向が定まれば、やるだけなので。

おしまい。

英語 Private Lesson #1

2020/06/13 にやった分の復習を今更ながらやる。

Pronunciation

Practice: Vivian believes violent, violet bugs have very big value

v の発音難しい。けど意識すればできるので、これを意識しないでできるようにならないといけない。

Expressions

I have butterflies in my stomach.

  • Feel nervous
  • こういう慣用句の意味想像して?って言われて全然わからなかった。蝶だとむしろポジティブなイメージかと思った。
  • When I had given presentation in the international conference, I had butterflies in my stomach! といった感じだ。まだ1年しか経ってないのに懐かしいなあ、SRECon。

I got the short straw.

  • Got task that I don’t want
    • I.e. copy 50 pages of a book
  • すまんがそんな仕事全然ないわという話をして笑った
  • いや、たまにはあるか、?SaaS の売り上げを Spreadsheet に転記するだけの仕事は I got the short straw だ

Writing

外国から来る友人に、自分の都市を案内せよという課題。

いくつかトピック別に振り返る。

その名詞が加算か不加算か常に考えよ

その場所には公共交通機関でいけるよ、みたいなことを言うとき

  • by public train
  • by a public train
  • by public trains
  • public transportations

が選択肢になる。

  • a: 文中に初めて登場したものや、特定されてないもの(単数形)
  • the: 文中に登場するのが2回目以降で、話している対象物がどれなのか明確な場合

ここで、train が加算か不加算かを考えると、交通手段を意味する場合は不加算になる。

public transportation も不加算である。 public train も不加算

なので、特定の電車をささない、交通手段という意味の場合、by public train が正しい。

access it -> access there

神奈川より南にある

It's located south of Kanagawa

Farther south than Kanagawa みたいには言わない。

as below

あとに示す場合は使うと良い。

I can propose some options as below.

簡潔に言う

もし他に何か行きたい場所や好きなことがあれば、知らせてね、みたいなのは、If you have any further questions でよい。

おわりに

Writing が難しい。加算と不加算が永遠に難しい。全単語調べないと無理かもしれない。

入社してから2年

6/20 で2年経った。

前回

blog.chaspy.me

この半年もとても大きく成長した期間になったと思う。

振り返り

SRE Global Team として

1月に、フィリピンとインドネシアに出張に行ったことは自分にとって大きな出来事だった。global team メンバーとちゃんと顔を合わせて話すこと。一緒にやっていくこと、たとえば SLI/SLO について説明したり、あるいは SRE Team に対する期待値を話したり。食事に行ったり、遊びにいったり。id とアイコンだけの海の向こうのあいつらが、やっぱほんとにいいやつらだな、って思えたことは大きいし、思ってもらえたならいいと願う。

quipper.hatenablog.com

Boracay も最高だったな。海外旅行、大好きなのでまた行けるような世界に戻りますように。

この出張後から、彼ら彼女らとオンラインのミーティングをする機会がぐっと増えた。彼らから質問してもらうことも、チャット・オンラインともに増えた。やっぱり今までどこか遠い存在で、聞くまでにハードルがあって、それが下がったということなのかな、と捉えている。

もちろん相棒の Robbie との距離もグッと縮まったのもこの期間だった。同チームメンバーとしてリスペクトしながら仕事をしていたとはいえ、海外出張で一緒の時間を多く過ごして、仕事のことも、それ以外のこともたくさん話した。その後も直接話す機会を継続的に持つようにできている。ちゃんと言葉で「一緒に sre global team」をやれてよかったよ、ありがとう」と伝えられてよかった。彼もまた「入ってくれてありがとう」と言ってくれた。

SLI/SLO の組織への導入

そして1月末はそのまま SRE NEXT での登壇もした。カンファレンスの運営もしていたし、海外出張もありつつ、Coursera の資格も取って勉強しつつ、進捗を出すということで今思い返すとゾッとするほど Hard Days だった。もうできない。

quipper.hatenablog.com

SLI/SLO という、「アイデア」「考え方」は一般的に知られているが、それを実際に組織に落とし込むこととは大きな差がある。それを当時思ってたぐらいの世界には変わっていった。1年かかった。自分自身に経験がない中で、模索しながらだったので、もっと早くできたかというと難しい。しかし、学びは非常に多かった。

ある種、ツールを導入することを目的にしたわけで、それが正しいのか?という疑問は最後まで持ちながら続けることになった。途中、苦しいときもあったが、最初1人で模索していた時期から、後半になると Engineering Manager の takeyama さんがやりましょうと後押ししてくれたことは大きな支えになった。

まだまだその運用方法は各チームで試行錯誤している最中で、改善の余地は多いにある。また、SLO の Error Budget 消費に伴うアラートもまだこれからだ。それでも、SLI/SLO という"言葉"が Product Manager, Developer, SRE の中で共通言語となった今の状態は、十分よくやったと言えると思う。

開発組織の自己完結化、本番環境の信頼性、組織とシステムのスケーラビリティ、そういったことに対して、技術・文化面両方で支えるのが SRE の本質的な役割だと思っている。それに対して、Site Reliability Engineering の本丸である SLI/SLO を、開発チーム主体で運用がまわるところまで持っていけたことは自分にとって大きな財産になると思う。こういう経験ができる会社であることを本当にありがたく思う。

Team Lead として

5月から Team の Lead をしていくことがミッションに加わった。これまでもチームのことはそれなりに考えてきたつもりだったけど、それと同時に自分がやるべきミッション、仕事もちゃんとこなした上で、だったので、余力でやる、ぐらいでしかできていなかったことを、もう少し力をかけてやっていい状態にはなった。

とはいえ、現在 EKS への Migration や Progressive Delivery の段階的な導入など、1年前の自分じゃ任せきれなかったような、それなりに難しいテクニカルタスクをやりながらなので、状況がハードなのは変わりがない。

僕は takeyama さんが前 Blog に書いていた Management と Lead の不可分性について、ははあと納得したのであった。今でもこれはその通りだと思う。

blog.yuyat.jp

その中でこれらを分離しようとするわけで、期待値調整というか、Lead が Team / Project を技術あるいはコミュニケーションを通じて前に進める役割だとして、Engineering Manager は何に注力するのか、ということをお互い言語化したのはよかった。蓋をあけてみれば結構認識はあっていて、なーんだ、とはなるんだけど、やっぱり不安な状態でやるよりは安心して仕事ができたほうがいい。

これに関してはまだやりはじめたばっかりなので、次の半年がいろんな意味で楽しみだ。5月いっぱいはこの Role がすべきことを腹落ちさせるのに丸々悩んだりしてようやく納得できて、6月いろいろできる範囲でやってみている。

結構ハードなんだけど、すごい成長機会でもあるので、そういう機会をもらえて感謝している。

次の半年

ずっと同じことを言っているが、英語と技術が基本なので、それをシュッシュ変わらずやりつつ、前述した Team をどう前に進めるか、といったことに向き合い続けるんだと思う。

英語

正直前の半年ては伸び悩んでいた。コロナで若干体調というかリズムが崩れた段階で英会話ができなくなってしまって、思い切ってやめてしまった。質に課題感があったので、身に付けたい能力をちゃんと言語化して、プライベートレッスンをはじめた。

現状課題感があるのはライティングと発音、そして語彙(表現)なので、その3つに注力しながら、フィードバックをもらっている。

このへんは基礎体力みたいなもんなので、やり方を都度変えつつ内省しつつ続けるしかない。

技術

「はやく失敗する」「はやくフィードバックを得る」みたいなところは前よりは上手にできるようになってきたと思う。

また、コミュニティや発表されてる事例から、現実の課題解決に結びつけるみたいなことも少しずつできるようになってきた。

あとはすぐにリターンが来るわけではないが、知っておくと良いような深い技術力をどう無理なく身に付けていくか、は考えたほうがいいかもしれない。

無理なく、というのがポイントで、もう31をすぎまして、健康であることの優先順位を最近あげたので、今までのようにがむしゃらに時間を投資することはますますできない。

このあたりはこの2年課題感だけずっと曖昧なままなので、どこかでセルフコーチングをして、誰かに相談しようと思う。

組織

実は組織をどううまくするか、については昔から強い関心があった。が、この2年間は特に積極的にやろうと思ってなかったし、なんなら関心があったことすら忘れていた。

一周まわってようやくまた考えられるフェーズになったので、またあらためて本を読み直したり、言語化したり、試してみたりしたい。

これは SRE チーム内もそうだし、プロダクトチームという広いスコープでもそうだし、その両者の関係もそうだし、いろんなスコープで、ちょっとずつ自分が貢献できることを増やしていきたいと思う。

おわりに

半年ごとにちゃんとコンフォートにならずに済んでいるし、半年ごとに結構見える視界が変わってきているように思う。

特に最近は自分の得意な部分が明確にわかってきて、それの発揮の仕方もわかってきたので、いい状態ではある。

追いかけたい背中はちょっと減ってしまったけれど、まだまだ追いかけたいひとはいる。そんな幸せな環境に感謝しつつ、これまで以上にバリュー出していこうと思います。

おしまい。

2020-07-05 SREに関する雑談 bosyu#4 ECS + Fargate 構成におけるログの問題と IaC について

こういう bosyu をしています!

bosyu.me

背景

  • Frontend / Backend をやる Engineer の方が、副業でインフラを含めすべて1人で構築するシーンで苦労しているので壁打ち相手になってほしい
    • 特にインフラに苦手意識があるため、どうやってキャッチアップしていくかを悩んでいる

ということで、このあたりの勘所はなかなか経験ないと厳しいところだと思うので、壁になるだけでも十分貢献できたようです。

いくつかトピックを紹介します。

実践 Terraform をみて動かしてみるが、コピペ Terraform エンジニアになってしまっている

実践 Terraform すばらしいですよね。

このままでは力がつかないのでは、あるいはちょっとした構成変更をするのに苦労してしまったとのこと。

これはめちゃくちゃいいところに気づいていて、Terraform 自体は最低限の内容だけ抑えておけば対して難しくないんですよね。大事なのは中身のクラウドのことを知ること。

以前書いた記事を紹介しつつ、そもそもクラウドの中身を知ることのほうが大事という話をしたり

IaC はインフラの API のラッパーである API でできることを宣言的に書けるように Provider がしているものにすぎない 結局対象のリソースが何で、それを API でどう扱えるかを知る必要がある

blog.chaspy.me

実際に IaC 化するところで、いきなり HCL を書き始めているとのことなので、「僕たちだってよく知らないリソースに関してはドキュメント読んで、まずはマネジメントコンソールで作って動かして最低限の疎通を得たりしながら勘所を得て、それを Import しますよ」という話をしました。

SRE は自由自在に最終的な HCL を間違いなくエレガントにかけると思われてたようなので、そんなことないですと(笑)

クラウドリソースってものによっては作るのに時間かかったり、Terraform だとパラメータによっては作り直しになってしまったりするので、フィードバックをはやく得るには最初はコンソールでいじり倒した方がフィードバックが早く得られるので、取り組む順番を変えてみては、という話をしました。

あと上記に関連して、Terraform の基本的な事項についておさらいしました

  • state とは何か:実際のクラウドリソースの状態をあらわしているもの
    • Import: state にないものを state に取り込む
    • refresh: 実際のリソースに state を同期させる

ECS の Scheduled Task で動かしているもののログが出ない

awslogs Log Driver を使って、ログを出すようにしているが、Scheduled のもののログが出ない。そうでない Task のログは出ている、という具体的な問題について、画面共有しながら調査しました。

docs.aws.amazon.com

非常に申し訳ないことに、僕自身が ECS の経験が豊富でないこともあり、限られた時間で解決はできませんでしたが、方向性としては

  • このコンテナは本当に動いてるのか?
    • rails env prodcution で、ローカルで動かしてみては?
  • 同じイメージで scheduled じゃなく通常の Task として動かしてみては?

という話をしました。Task Definition を見る限りログの設定は問題なさそうでした。

ちょっと僕も昔 ECS 少しすぶったぐらいなのであらためて触りなおそうと思えたいい機会でした。

ペアデバッグ、ペアオペみたいなことも、解決できる保証はないんですが、積極的にやっていきたいですね。

はやくフィードバックを得ること、はやく失敗すること、安全に失敗すること

これは Quipper に入って学んだことでもっとも重要なことの1つでもあり、今でも向き合い続けていることです。

上記のデバッグをして、Task かな?を作り直そうとしていたときに、項目を見直して、ご自身で悩まれていたので、「これやってしまったら何か壊れますか?壊れたら困りますか?」という問いをして、失敗を恐れる傾向があるのかな?、という話をしました。

個人の性格によるんですが、大丈夫かな、と石橋を叩いて壊す(w)タイプのひともいれば、やっちゃえやっちゃえでぶっ壊すひともいて、どちらも極端なんですが、重要なのは「はやくフィードバックを得ること」そして「安全に失敗すること」なんですよね。

だからステージングとプロダクションでネットワークレベルで分離するし、Terraform state も分けるし。ステージングなら最悪大丈夫、って言えるのは「安全に失敗する」ため。

特にクラウドリソースなんて中身は見えないわけで、ドキュメントも完璧じゃないわけで、動くか動かないか、それをまず先に突き詰めてためにはたくさん失敗する必要があります。フィードバックループをできるだけ早くすることはソフトウェアエンジニアリングのいろんな場面で重要です。

僕も全然得意ではないですが、意識するようになって少しずつですが変わってきました。

今回のようにメンタリング的なアプローチができたのは思わぬ副産物だったと思います。

応募者からのフィードバック

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

  • ECS+Fargate環境における具体的な困りごとを一緒に画面見るなどして、切り分ける考え方を教えてくれた
  • Terraformのツールの使い方を超えて、ツールを使うにあたっての心構えを聞けた
  • 「早く失敗することを意識したほうがいい」というアドバイスをもらえた(これはマジで心に響いた)

ということで、意味のある時間になったようで何よりです。

おわりに

引き続き bosyu しています!

bosyu.me

今回のように一緒にデバッグしたり、ぼんやりとした状態から悩みを具体化したり、もしかしたら考え方に関する話もできるかもしれません。曖昧な状態で大丈夫です。気軽に応募してください。それでは!

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