Stripeに学ぶ高信頼性インフラへのマイグレーション

## はじめに

[NTTコミュニケーションズアドベントカレンダー][1] 21日目になります。

先週、シアトルで開催された[KubeCon][2]に参加してきました。
せっかくシアトルに行ったので空き時間に一人で美術館、図書館、水族館を回ったら
周りから「えっ!?」って顔をされましたがみんな行きますよね？1人水族館

今回は初日のkeynoteで話題になったJuia Evansの[Stripe][3]の事例を
紹介させていただきます。

![31365928407_565982dea7_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/309176/b5d746f8-9541-9e9c-3cae-8cdc731ee1e8.jpeg)
[Juia Evans][4]

## この記事を読んでわかること

- システムをマイグレーションするときの基本的な考え方(Kubernetesのことを何も知らなくても大丈夫)


## What is Stripe?
Stripeは決済のインフラを提供する会社になります。
ユーザが意識するというよりは、ユーザが使っているアプリ等の裏側で
決済をいい感じにしてくれるインフラのようなものになります。

日本ではあまり社名に馴染みはないかもしれませんが、
世界で120カ国以上、数百万に及ぶ企業が利用しており

Amazon、Google、Uberといった企業が利用しています。

[Stripeの会社についてはこちら][5]

## Stripeのシステムに求められる要件  

#### 決済のシステムなので以下の2つがとても大事 
- Reliability
- Security

#### 求められる信頼性の要件は以下
- 99.99%(1週間に停止時間は1分以下)

#### そのために、2つの方法を実施
- kubernetesへの移行
- Envoyを使ったサービス間のNetworkの構築

## システムのマイグレーションの理想と現実

### 理想の姿

<img width="811" alt="julia_evans_talk_pdf 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/abac3555-2a74-7c6b-a528-dc5682100163.png">

課題が明確となっており、課題に対する解決策も明確となっている状態

### 現実の姿

<img width="811" alt="julia_evans_talk_pdf 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/2a930137-9333-e5b6-9ef3-3e2d9845eb89.png">

そもそも何が課題か誰も分からない

### インフラに対する期待

<img width="808" alt="julia_evans_talk_pdf 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/cd508559-9a49-446b-47d1-820f9a7883a1.png">

我々はよく分かっていないが、この上で大事なシステムを動かそうとしている

所感：システムの移行とかだと、移行先のアーキテクチャについて理解しないまま進むことってありません？自分は覚えがあります。

## 99.99%への道のり

<img width="810" alt="julia_evans_talk_pdf 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/4ab0132a-edea-4e57-d14d-1bfe7ff47bdb.png">

99%を達成するまでに色んなことが起こるし
99%から99%を達成するまでにはさらに色んなことが起こるよ

所感：その通り過ぎる。

## 99.99%のやり方

<img width="807" alt="julia_evans_talk_pdf 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/789dd8a2-a025-234b-304e-215da8de394b.png">

1. システムのデザインを理解する(分からないことだけググるのでは足りない)
2. あらゆるテストを実施する(思いつくことは全部やる)
3. 障害を検知する仕組みを作る(どんなにテストをしても障害は起こる)
4. インシデントは1度しか起こらないようにする(必ず根本原因を見つけて対処する)
5. 変更は段階的に加える(まずはtrafficの5%だけ新しい機能に流すなど)
6. 必ずロールバック計画を立てること(100%成功するものなんてない)

所感：Kubernetesとか関係なく、いつでも使えそう。

##  99.99%を達成するためのCulture&Leadership

<img width="804" alt="julia_evans_talk_pdf 8.png" src="https://qiita-image-store.s3.amazonaws.com/0/309176/5d636556-bcab-7fa9-e985-ca35d6ed7bb7.png">

・　初めからエキスパートである必要はないが、エキスパートになる必要がある
・　エキスパートになるためには、手を動かして学ぶための十分あ時間が必要である

所感：ほんとその通りですね。勉強時間が業務時間内に確保されてるのは大事ですね。

## Kubernetes移行に関するStripeの取り組み
###  Don' expose kubernetes to developers

Stripeでは、DeveloperがKubernetesを覚える学習コストが
課題と考えているので、Pythonのコードを書けば自動でYAMLを生成してくれるものを作って提供している。

Developerはコードを愛してるので、
YAMLを覚える気は無くても新しいコードなら覚えるよねという考え方。


![図1.png](https://qiita-image-store.s3.amazonaws.com/0/309176/4fd1b0a5-315f-d326-7c42-a2741aad7375.png)


該当の資材は[skycfg][6]という言い、公開されています。

## 最後に
Youtubeで[動画][7]が公開されてますが、Youtubeの速度調整と字幕の機能は最高ですね。
自分は記事をまとめるにあたり、自信がなかったので「0.75倍速/字幕(英語自動生成)」で3回聴いて、気になるところがあったら何度も聴き直していますが、字幕の精度が高くて感激しました。

[KubeConの動画][8]はシアトルの分だけでも350件近く上がってるので、皆さんも興味のあるテーマがあればYoutubeの機能を駆使して聴いてみてください。

英語に自信がある方は、気にしないでください。



[1]:https://qiita.com/advent-calendar/2018/nttcom
[2]:https://events.linuxfoundation.org/events/kubecon-cloudnativecon-north-america-2018/
[3]:https://sched.co/GsxA
[4]:https://flic.kr/p/PMGzK6
[5]:https://stripe.com/about
[6]:https://github.com/stripe/skycfg
[7]:https://youtu.be/obB2IvCv-K0
[8]:https://www.youtube.com/channel/UCvqbFHwN-nwalWPjPUKpvTA