Skip to main content

30 posts tagged with "job"

View All Tags

仕事でやったこと 2020-12-01 ~ 2020-12-31

· 2 min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2020-12-01 から 2020-12-31 にかけて仕事でやったことを書ける範囲で書きます。

  • AWS SAM Application の開発
  • Renovate の PR にリンクを追加
  • Terraform
    • Terraform の CI に関して日々行っている改善点・変更点をチームにシェア
    • Docker Compose を用いてローカルで開発しやすいように改善
    • ドキュメント・コードコメントの追加
    • リファクタリング
      • 不要なコードの削除
      • 不要な secret を削除
      • 不要な変数の削除
      • data.terraform_remote_state を local values に置換
      • なぜか環境変数でパラメータを渡していた箇所を、 local value に置換
    • CI に tflint の導入
    • 対象の build が 1 つの場合 batch build を実行しないようにする
    • master の HEAD じゃなくても apply できるようにする
    • plan file を S3 に保存
    • refactor: tfsec で設定ファイルを使うようにする
    • Renovate の PR が多すぎて鬱陶しい問題の対応
      • automerge されるものは reviewer を設定しないようにした
      • prConcurrentLimit を 1 にした
      • branch protection Require branches to be up to date before merging を無効化
  • kube-linter
    • Rule に基づいて manifest の修正
  • miam でリソースが削除されそうなときに警告をするようにした
  • ブログの執筆

2019-10 から今(2020-12-31)に至るまで仕事でやっていること

· 7 min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2019-10-01 から今の職場で SRE として働いています。 その中で自分がどういうことをやっているかという話をします。

2020-12-31 現在の内容です。

要約​

  • プロダクト横断的な SRE チームで、プロダクトのプラットフォームを運用・開発している
  • 特に CI/CD の改善が得意
  • developer に CI/CD をいわばサービスとして提供しており、 DX の改善に取り組んでいる
  • Monorepo の負の側面(CIが遅い、関係ないTestがこけるetc)の解消にも取り組んでいる
  • 自分が直面している課題を解決する OSS を色々開発している

キーワード​

  • SRE
  • Monorepo
  • CI/CD
  • Developer Experience
  • Terraform
  • Go / Shell script
  • k8s
  • CircleCI / CodeBuild
  • Conftest
  • Renovate

より具体的にやっていることを書いた記事​

何をやっているか​

プロダクト横断的な SRE チームで、プロダクトのプラットフォームを運用・開発しています。

SRE と一言で言っても、その領域は非常に多岐にわたります。 組織によって SRE の実態は異なるでしょう。 例えば SRE とは別にセキュリティの専門チームがあるような組織もあるとは思いますが、 現職ではそのようなものはないのでそこも SRE が見ています。 全ての領域に関して個人がスペシャリティを持つというのは非常に難しいので、 全体的にある程度カバーしつつも特定の領域に対しスペシャリティを持つというのが割と現実的な話だと思います。

自分の場合、 CI/CD の改善を強みとし、そこに主に取り組んでいます。 プラットフォームを運用・開発していると言いましたが、それには CI/CD も含まれます。 現職では Monorepo アーキテクチャが採用されています。 Monorepo にすることで複数のサービスにまたがる変更を 1 つの Pull Request (以下PR) でまとめて出来たり、 CI/CD などの仕組みを共通化することが出来ます。 現職では幾つかの Monorepo があります。

  • アプリケーションのコードと k8s manifest の Monorepo
  • Ansible の Monorepo
  • Terraform の Monorepo
  • などなど

Monorepo の中で CI/CD に関しては SRE が ownership を持ち、言わばサービスとして developer に提供しています。 といっても Jenkins や CircleCI のようなものを自作しているという意味ではありません。 CI/CD には主に CircleCI を使っていますが、CIの設定や CI/CD で使われるスクリプトなどをメンテしています。 全てを SRE が書くということではなく、むしろ developer が新しいサービスを追加する際に簡単に CI/CD をセットアップできるようにしています。

例えば Terraform ではサービス・環境(staging, production, etc) ごとに State をディレクトリを分けていますが、新しいサービスを追加する際は、まずは generator を実行してコード生成し、そこに Terraform の configuration を書けば CI/CD で test や lint, apply が実行されるようになっています。 元々新しいサービスの追加時には .circleci/config.yml に設定を書き足す必要がありましたが、 最近 Terraform の CI/CD を CircleCI から CodeBuild に移行した ことでそれが一切不要になりました。日々進化しています。 単に PR で terraform plan して master で terraform apply するだけなら簡単ですが、 より DX の高いものにするのが自分の強み・専門性です。

Lint や Test を導入したりもします。勿論 Rails などで書かれたアプリケーションのテストを書くということではなく(それを書くのは基本 developer)、例えば k8s のマニフェストのテストや Terraform の lint などです。 Lint や Test は、導入して CI が失敗するようになったら終わり、ではありません。 現職では developer が k8s のマニフェストや Terraform の configuration も書きますが、必ずしも全員がそれらに習熟しているわけではありません。 失敗するようになっても、developer が失敗した原因を理解できなかったら、無駄に rerun してみて結局解決しなくて SRE に質問してくるだけです。 そうではなく、 なぜ CI がこけたのか、どうすればいいのか、その lint はどういう経緯で導入されたのかなどを developer が自分で理解し、自己解決できるようにすることが重要です(勿論必要に応じて問い合わせが発生するのは仕方ないですし、遠慮はしてほしくはありません)。 そこで PR にそれらの情報をコメントするようにしています。 シェルスクリプトから簡単にコメントできるように OSS としてツールも開発しています(gihtub-comment)。

Monorepo では単純に全てのサービスのテスト・ビルド・デプロイを実行すると時間がかかったり、 PR に関係ないテストが落ちたりします。 そのため、必要な job だけ実行するような仕組みが必要です。 そのへんをコードを書かずにいい感じに出来るのが理想ではありますが、 Monorepo のエコシステムはそこまで醸成していないと思っており、自分たちである程度コードを書く必要があります。 自分は Go や Shell Script でそういったコードを普段書きます。

現職の Monorepo のうち、アプリケーションのコードと k8s manifest の Monorepo は非常に大きく、 CI/CD をナイーブに実装すると非常に時間がかかったり効率が悪かったりします。 そういった問題点を見つけ出し、チューニングするといったこともやりました。

その中で生まれた OSS もあります。 自分が直面している課題を解決する OSS を開発するのが自分のライフワークです。

https://github.com/suzuki-shunsuke/profile#libraries

仕事でも使っているツールを幾つか紹介します。

  • gihtub-comment GitHub の PR, commit にコメントするツール
  • circleci-config-merge 分割された .circleci/config.yml をマージ
  • github-ci-monitor CI のステータスを DataDog でモニタリングする AWS SAM application
  • matchfile Monorepo の CI で、特定のサービスが依存するファイルに変更があったか判定するのに便利
  • ci-info GitHub API を使って CI の情報を取得
  • dd-time コマンドの実行時間を DataDog に送る
  • akoi バイナリのバージョン管理

仕事でやったこと 2020-11-01 ~ 2020-11-30

· One min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2020-11-01 から 2020-11-30 にかけて仕事でやったことを書ける範囲で書きます。

仕事でやったこと 2020-10-01 ~ 2020-10-31

· 2 min read

2020-10-01 から 2020-10-31 にかけて仕事でやったことを書きます。 勿論全部は書けないのでいくつかピックアップして書きます。

  • Terraform
  • Docker Hub 認証するようにした
  • kustomize build のテスト(失敗したら PR にコメントをして、なぜ失敗したか分かるようにした)
    • 元々 kustomize build に失敗して CI がこけても、なぜこけたのか分かりにくく、 SRE に問い合わせが来て調べるみたいなことがあった
    • どの k8s manifest の kustomize build に失敗したのか、 PR に分かりやすくコメントするようにした
  • CI で kubectl apply --server-dry-run によるテストを導入
  • Monorepo
    • 差分検知・デプロイパイプラインの改善
  • Renovate

仕事でやったこと 2020-07-01 ~ 2020-09-30

· One min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2020-07-01 から 2020-09-30 にかけて仕事でやったことを書きます。 勿論全部は書けないのでいくつかピックアップして書きます。

  • Terraform
    • CircleCI から CodeBuild への移行
      • Security + DX
      • 10月以降も継続
    • tfnotify の導入
      • Monorepo で導入するには一工夫が必要
      • コメントが消える挙動がドキュメント化されてなくて軽くハマった
  • Renovate の導入
    • Regex Manager 便利
  • Monorepo
    • 差分検知・デプロイパイプラインの改善
  • DataDog からのアラートのハンドリング業務の改善
    • どんなアラートがあって、どう対応したかなどのナレッジの共有の改善
    • 割とアナログな手法だが、ちゃんと work している

仕事でやったこと 2020-04-01 ~ 2020-06-30

· One min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2020-04-01 から 2020-06-30 にかけて仕事でやったことを書きます。 勿論全部は書けないのでいくつかピックアップして書きます。

  • Monorepo
    • CI で kustomize build の diff を PR にコメント
    • Conftest で k8s manifest の validation の導入
    • Go で書かれた差分検知のコードのリファクタリング
    • CI の高速化・コスト削減
  • GitOps
    • GitOps を導入するためのツールの開発のサポート
  • Terraform
    • input variables を local value に置き換え
  • GuardDuty の導入
    • Terraform で IaC
    • False Positive なアラートが多くてハンドリングできてない
  • ブログの執筆
  • Argo Workflows の検証
  • MongoDB Atlas への移行サポート
    • Go で Restore Job の開発
    • オペレーション

仕事でやったこと 2020-01-01 ~ 2020-03-31

· 2 min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2020-01-01 から 2020-03-31 にかけて仕事でやったことを書きます。 勿論全部は書けないのでいくつかピックアップして書きます。

  • Monorepo
  • サーバの OS upgrade
  • Ansible
    • CI の更新検知で、 PR の label で対象を指定できるようにした(コードに変更がなくてもテストが実行できるようにした)
      • たまにテストしたいときはある
      • それまではてきとうにコードを修正しないとテストが実行されなかったが、 PR の label で対象の playbook を指定できるようにした
    • key=value 形式を YAML に変換
  • .circleci/config.yml のリファクタリング
    • job を parameterize して共通化したり
    • parameterize された command を使って共通化したり
    • コード量の大幅な削減
  • Terraform
    • CircleCI の環境変数を設定することで、 master での CI を一時的に禁止できるようにした
      • State を弄ってたりするときに予期せぬ apply が実行されないようにするため
    • master branch の CI が終わるまで wait
      • master の CI が走っている間に PR の CI でまだ apply されていないリソースが差分として出るのを防ぐ
    • shfmt, shellcheck の導入
      • CI/CD でシェルスクリプトを書いているので、それらを lint
    • State Locking の導入
    • Terraform Cloud の検証
      • 結果、見送り
      • すでに CI/CD pipeline を構築している自分たちにとっては、わざわざ移行するメリットが薄いと判断
  • MongoDB upgrade
  • Jenkins Alternative の検証
    • RunDeck
    • Argo Workflows
    • 結局、ローカルで検証した程度

仕事でやったこと 2019-10-01 ~ 2019-12-31

· One min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

2019-10-01 から 2019-12-31 にかけて仕事でやったことを書きます。 勿論全部は書けないのでいくつかピックアップして書きます。

  • Terraform
    • terraform fmt の導入
    • Terraform の upgrade v0.11 => v0.12
    • State の分割 3 => 40 弱(正確な数は忘れた)
    • Conftest による lint: Remote Backend のパスを間違えるとまずいので test を導入
    • 新しいサービスを追加するときのための generator (シェルスクリプト)を開発
    • CODEOWNERS の設定
    • 突撃隣の Terraform
    • リリースブランチをやめて GitHub Flow に移行
    • 古いリビジョンで apply の実行の禁止(CI がこけるようにした)
  • Ansible
    • CI の高速化
    • Jenkins job を CircleCI の scheduled job にリプレース(脱 Jenkins)
    • ローカルでの開発環境の改善
      • コンテナを使い回せるようにする
    • goss に置き換えて高速化
  • CI の改善
    • 高速化(無駄な処理の削減)

モブレビューやっていきたい

· 10 min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

最近モブレビュー取り入れたいと感じていて、なんで取り入れたいかなどについて書いてみました。 モブレビュー自体まだ 2, 3 回しかやってないので説得力にかけますが、ご容赦ください。

想定​

  • チームは 6 人以下
  • Pull Request (以下 PR) をマージするには必ず他の誰かが approve しないといけない

目的​

  • チーム内の情報共有
    • 属人化の解消
    • 退職や異動などによる情報の喪失(誰も分からない状態)を防ぐ
    • チーム外の人とのコミュニケーションにも活用できる
  • レビュー待ちの短縮
  • レビューの品質の改善
  • 仕事を評価してもらうことで承認欲求を満たす
  • オンボーディングの改善
    • レビューを通じて必要な知識を吸収してもらう
    • オンボーディングに限ったことではないが、オンボーディングにも有効ではないか
  • 最後までやりきる

箇条書した内容を補足します。

情報共有​

属人化の解消は結構重要だと自分は思っていて、特定の人じゃないと出来ないこと、わからないことというのは ボトルネックや技術的負債だったり、障害対応時に致命的になりかねません(深夜に障害が起こってAさんに聞かないとわからないのに、Aさんと連絡が取れないとか最悪)。 チーム全員とはいかなくても 3 人ぐらいは出来る・分かってる必要があるかなと思います。

まぁ、当初は 3 人ぐらい分かってても、時間が経って異動やら退職やらで気づいたら分かっている人いなくなってたというのは ありえなくないので、そういったリスクをどうやって防ぐかというのは考える必要がありますが、今回の話とは外れるので割愛します。

また、チーム外の人とのコミュニケーションにも活用できると思っていて、 例えばランチや飲み会でチーム外の人とのコミュニケーションを取る際に自分のチームの他の人が対応した件とかが話題に上がったときに ちゃんと情報共有できてないと、自分は担当外なので分かりませんとなってしまうでしょう。 知っていればむしろ自分から話題にできるかもしれません。 そこから発展して更に新しいタスクの話もできるかもしれません。

レビューの改善​

せっかくいい仕事をしても中々レビューしてもらえないとなると不満がたまります。 モブレビューを実施することでレビューを促進し、レビュー待ちの時間を短くできることを期待します。 レビューしたくても良くわからなくてレビューできないというパターンもあると思うので、 わからない部分をモブレビューで解消されてレビューが進むと良いですね。

また、ちゃんと複数人でレビューすることで目先の問題を解決するだけの本質的でない問題解決を防ぐことが出来ることもあると思います。 「いや、それそもそもPRの前提がおかしくない?前提となっている仕様を見直すべきなのでは」 みたいなこともあるかもしれません。

仕事を評価してもらうことで承認欲求を満たす​

いい仕事したら他の人にも知ってもらいたいというのは自然なことでしょう。 いい仕事を褒めるのは良いチーム・環境であり働きやすさというところにつながるのではないでしょうか。

ちなみに現職だと Slack で他のチームにも共有して emoji で褒め称えるというのが結構やられていて 気持ちのいい環境だなと思っています。

オンボーディングへの活用​

そもそもオンボーディングというものをちゃんと受けたのが現職が初めてで、 現職でもオンボーディングについてはまだまだ検討中であり、「何をもってオンボーディングは終わりと言えるのか」みたいな議論が Slack でされてたりして、 自分もよくわかってないのですが、モブレビューがオンボーディングにも活用できるんじゃないかなという気がしています。

色々なにも分かってない状態の New Joiner でも理解できるように、背景とかを説明したりすることで 会社固有のドメイン知識などを補い、戦力化を促すことが出来るんじゃないかなと思います。 会社固有の略語などが当たり前に使われてたりすると New Joiner には理解できないのですが、そういうのも含めてフォローしてあげる良い機会になると思います。 マイクロサービス化なんかをやっていると New Joiner には名前を聞いただけでは理解できないものも出てきますしね。

まぁあまり細かな話までしだすとそれはまだ New Joiner には早いということにもなるので、ケースバイケースかもしれません。

最後までやりきる​

PR を投げた後、レビューしてもらえない、説明を書いているのに読んでもらえないといったときに

  • 自分はやるべきことをやっている
  • レビューしない人たちが悪い
  • 説明を読まない人たちが悪い

としてそれ以上なにもしないというのはもったいないと思います。 「結果がすべて」だと考えると説明を書いても読んでもらえなかったらそれは書いてないと同じなので モブレビューという形で読んでもらう努力をするのがより建設的なのでしょう。 モブレビューしてみたら「レビューしようと思ったけど、ここが良くわからなくてやめちゃったんだよね」ということもあったので、 自分の説明も足りてなかったんだなと見直す良い機会にもなります。

解決したい課題​

  • 他の人が何やってるのかよくわからない
  • 他の人のをレビューしようとしても良くわからなくてそっとタブを閉じてしまう
    • 分からないことを理解する成長チャンスを無駄にしているのでは
  • レビュー待ちが長い
    • 細かく PR を投げたくても前のがマージされてないと先に進めない
    • マージされないまま master が更新されて逐一 rebase しないといけない
  • レビューの品質の低下
    • よくわからないけどマージしてしまえ: レビューの意味がない
  • issue や PR の説明やコメントが足りてない
    • 説明を英語で書かないといけないとかだと、説明不足になりやすい
    • モブレビューで口頭で説明してみると、 issue や PR に書いてない情報が出てくる その情報を追記することで(口頭で説明するだけではだめ。後からその場にいなかった人も見返すもの)改善できる

実施方法​

定例を組むのもありですが、個人的には予定を押さえなくても場所を確保できるのなら(フリースペースとかにモニターがあってサッと出来るなら理想的)不定期がいいと思います。 やりたくなったらその旨を Slack でサッと共有し、その場で直ぐできるならやり、 できない場合カレンダー見て空いてそうな枠を見つけて予定を押さえるか、Slackのリマインダーをセットします。 モブレビューで話している内容や、質疑応答などは Slack のスレッドにでもメモっておくと良さそうです。 issue や PR の説明に書いてないことが出てきたら、説明を修正して追記すると良いでしょう。

定期的に予定をいれる懸念点​

  • 定例は少ないほうが良い
  • 形式的になる
  • 定例まで待たなくて良いのでは
  • 定例までレビューしないというモチベーションが働く場合もあるのでは

やりたくなったらやる場合の懸念点​

  • カレンダーをチェックするのが面倒くさい(コストがかかる)
  • 人によっては躊躇してしまう
  • 場所を確保できないかも

懸念点​

  • 複数人の時間を拘束して実施することのコスト
  • 口頭で説明することに甘えてちゃんと issue や PR に書かなくなる
    • レビューの段階で指摘する
  • 場所を押さえられるか
    • 会議室足りない問題
  • モブレビューの意義を共有できるか
    • 人によっては時間の無駄と思う人がいてもおかしくない
    • 不満や提案があったときにちゃんとそれを言える環境でありたい

ちゃんと文章化するのをめんどくさがって口頭での説明で済ましたがるようになったらよろしくないですね。

自分の反省点​

ここまで書いて出てきた自分の反省点としては、 issue や PR の説明でちゃんと Context や Background をもっとちゃんと書かないと駄目かなということです。 口頭で説明する際にはそのへんを最初に意識して話すようにしていますが、説明には書いてないことが少なくないのでちゃんと書くようにしようと思いました。

むすび​

今回モブレビューについてあれこれ考えてみました。 まだモブレビューは 2, 3 回やった程度なので、ちゃんと取り組んでみて PDCA 回して改善出来たら良いなと思います。 例えば、今の所定期ではやりたくないと思ってますが、やってみたらちゃんと定期じゃないと駄目だったということもあるかもしれませんし、 モブレビューは目的じゃなくて手段なので、他にもっとよい手段があってモブレビュー不要だったということもあるかもしれません。

やらないと始まらないのでやれたらいいかなと思います。

毎週30分の技術共有会

· 3 min read
Shunsuke Suzuki
Platform Engineer / OSS Developer / Go / Terraform

自分が最近職場で行っている技術共有の取り組みについて紹介したいと思います。

背景​

これまで自分は積極的に自分にとって新しい技術を取り入れてサービスの品質の向上に繋げてきました。 ただし、それらの技術に関して周りに十分に共有できていなかった側面がありました。

やっていること​

毎週30分決まった時間にスライドを使って発表しています。 対象は同じ部署の希望者です。 枠は30分ですが、実質話しているのは20分くらいな気がします。 k8sのハンズオン的なこともやりました(そのときは30分で終わらないので2回に分けてやりました)。

話したいことはたくさんあるのですが、とりあえず大きなトピックとして以下の3つに絞っています。

  1. k8s(Rancher): オーケストレーション (いまここ)
  2. Drone: CI/CD
  3. Graylog: ログ収集

これまで話したこと・話す予定のこと​

k8s の初心者が k8s を本番運用を視野に入れつつ検証環境で使ってみるところまでを目指して話しています。

  1. なぜ k8s を使うのか(部署のコンテキストに合わせて導入意義を説明)
  2. k8s のリソース(Pod, Service, Deployment, etc) について
  3. k8s, Rancher ハンズオン(2回) 簡単なアプリケーションをデプロイしてみたり
  4. Logging (いまここ)
  5. モニタリング
  6. IP制限のかかった外部サービスへアクセスする方法

毎週30分というペース感について​

以下のようなことを配慮しました。

  • 集中力が続くこと
    • 60分は長すぎる
  • 持続可能であること
    • 1, 2 回やっただけでは意味がない
    • 30分だけなら参加しやすい
    • 準備のコストも現実的な範囲
    • 30分と短めなので毎週やる。隔週とかだと頻度が少なすぎるし、1回飛ぶと1ヶ月空いてしまう

これまでの結果​

特に大きな成果があるわけではないですが、 k8sに興味を持ちk8sを検証環境で使ってくれる人が出てきました。 共有会がk8s を触るきっかけになったのだとしたらそれだけでもやってよかったと思います。

また、自分自身学ぶこともありました。 Logging に関して自分は今まで Sidecar pattern を使っていたのですが、Cluster Level Logging への移行を検討するきっかけになりました。

今後もこの取組を(無理のない範囲で)続けていきたいと思います。