結果に git commit する

つよいエンジニアのブログ

サイバーエージェントの新卒技術研修で学んだことと学びたかったこと

 はじめに

この4月から株式会社サイバーエージェントに新卒で入社していました。

4月に3週間ほどの期間で行われた新卒技術研修をやっと振り返りたいと思います。

研修でやったこと

ツイッターを作りました。

クライアントはAndroid、サーバサイドはKotlin、インフラはGCPを使いました。

僕は主にインフラ担当でした。

こんなアプリになりました

こんなシステムアーキテクチャでした

サービス開発する上で最低限必要なことはやってみたつもりです。

新卒みんなで使っていたCircleCIの無料枠が終わって、人事が課金してくれるのを待ってる間に、チームのメンバーがbashスクリプトを使ってオンプレ(Macbook Pro)にCI/CDを作っていたのは面白かったです。

f:id:snowman_mh:20190615143942p:image

学んだこと

GCPAWSの違い

普段はAWSをメインで使っていて、GCPをガッツリ触るのは初めてでした。

GCPAWSは似ているところが多いのでめちゃくちゃ苦戦した点は特になくて良かったです。

大きく違うなと思ったところは、ネットワークまわりとシークレットの扱い方(後述)です。

AWSのネットワークは古き良き構成で、良くも悪くもサブネットとかいろいろ設計しないといけないですが、GCPはなんかネットワーク1個ドーンってやってその中で良しなにやってくれる感じでした()。

Kubernetesの基本

最近よく聞くKubernetesですが、1ミリも触れていない状況でした。

今回の研修ではGKEを使うことで、Kubernetesの基本的なリソース(Deployment、Service、Ingress、Secretなど)を理解できました。

一応、Podの占有CPUと使用メモリを調整して、効率的にHorizontal Pod Autoscalingが行われるようにすることを意識しましたが、実稼働サービスではないのでちゃんとできたかと言われるとなんとも言えないです。

また、GCPのマネージド証明書(beta)とIngressを使ってHTTPS化も行いました。

GKE+Preemptibleインスタンス

GCEはPreemptibleモードと呼ばれるオプションがあり、これでインスタンスを起動すると、24時間以内に強制シャットダウンされる代わりに料金70%オフで使うことができます。

これにKubernetesのノード自動修復機能を合わせると、格安のGKEクラスタが出来上がります。

ちょっと調べるとすぐに情報が出てきますし、やってる人も多そうだったので当たり前のことだったかもしれませんが、これに感動した僕は研修中Preemptibleインスタンスばかり使っていました。

GCPにおけるシークレットの扱い

今回の研修では、DBのパスワードなどのシークレット情報はCloud KMSをバックエンドとするkubesecを使って暗号化し、KubernetesのSecretリソースのマニフェストファイルとしてGitHubで管理していました。

Cloud KMSへの参照権限を持っているサービスアカウントかグーグルアカウントがあれば復号化でき、マニフェストをapplyできるような形で運用していました。

AWSのECSで、タスク定義からパラメータストアのシークレットへのパスを参照することに慣れていた僕には新鮮でした。

Locustによる負荷検証

今回の研修の要件に「10000rpsのGETリクエストに耐える」というものがありました。

これを満たすことを検証するために、Locustを使って負荷試験を行いました。

LocustをGKEクラスタ上に構成し、大量のPodからGETリクエストを投げる感じにしました。

特に難しいことはしていませんが、Locustはおろか負荷試験すら初めての経験だったので新鮮で楽しかったです。

学びたかったけど無理だったこと

Atlantis

普段はAWSリソースをTerraformで管理しているのですが、そのplan/applyをCircleCIで自動化することがよくあります。

今回の研修ではTerraformの自動化はせず、ローカルから実行していたのですが、Atlantisを使って自動化してみたかったなぁと思っています。

AtlantisをGitHubと連携して使うと、PRがOpenされたらplanを実行してその結果をPRにコメントとして追加してくれたり、PRがApproveされるとapplyを実行してくれたりします。

GoのバイナリやDockerイメージにビルドできるので、GKE上に構築することでシークレット(インフラリソースを触れる強い権限)を外部インフラに登録する必要がなかったりもするので良さそうです。

Argo

今回は使い慣れてるCircleCIを使いましたが、Kubernetesクラスタ上にCI/CDやWorkflowのプラットフォームを構築できるArgoを使ってみたかったなぁと思っています。

Argoを使えばワークフローのステップをコンテナで定義できるので、ローカルでの動作確認などが楽になったり(CircleCIはしんどいというかほぼやろうとしたことがない)、Kubernetesリソースのオーケストレーションもできたり、Atlantisと同様にシークレットを安全に管理できたりして、良さそうです。

おわりに

触ったことない技術を触りながら楽しく開発ができて、同期の友達もできて嬉しかったです。

これからもがんばっていきます。