リプレイスを行うために入社したが、DevOps領域が整っていなかったのでDevOps周りの対応に従事することになりDevOpsエンジニアとしてチームにジョイン。
入社する前にはKubernetesを初めて運用することを知らされていたので学習し、ジョイン時に戸惑わないようにしていた。
当初AWS + Kubernetes(EKS)でシステムが構築されていたが、アプリエンジニアがAPIを作成する傍らで作ったもののため色々と問題点を抱えていた。
これらの問題点をissueに起こし優先度付けを行い改善活動を行った。
AWS環境をGUIコンソールで手動で作成していたため開発と本番でリソース差異があったり、VPCを分けると速度が遅くなると思って本番だけVPCの分割方法が開発と本番で違っていたりした。このためステージング環境を用意してほしいという要望が出た際に直ぐに対応が困難な状態で環境の再現ができないという問題があり誰もインフラ環境をちゃんと把握できていなかった。
この問題に対しTerraformを導入しIaC化を行う + 開発と本番の差異をなくす対応を行うことにより環境を簡単に復元、新規用意できるようになった。この対応を終えた後に実際にステージングがほしいという要望にも迅速に答える事ができた。
また、インフラ構成図を用意したり、どうしても手動構築が必要な部分は手順書を用意するなどを行い、オンボーディングのコストを下げるような対応を行った。
バックエンドAPIが2つとフロントエンドが2つとインフラコードが全て1つのリポジトリに格納され相互に依存しあっていたためデプロイが気軽にできず、リリースがリポジトリの状態に影響されてできないことがあったりと問題を抱えていた。
こちらは、リポジトリを分割する必要があったのでその分割とリポジトリが統合されていたからできていたことを別の手法に置き換える作業を行った。
アプリケーションのリポジトリの分離から入り(こちらの主担当は別の方自分はenvファイルの環境変数化でExternalSecretsやConfigMapでのsecret、envを管理する対応を実施)、インフラ側はKubernetesに関してはマニフェストの共通化がオレオレShellで実装されCIでアプリのenvファイルから埋め込みを行っていたが、こちらをKustomizeとHelmに置き換えたり、Terraform CloudとArgoCD導入によるGitOps化を行い、かつImageを管理する方法としてSemantic Versioningを採用することでリリースフローを整えたり、CircleCIのcheckの充実やTelepresence導入による開発時の体験を上げる対応を行うことで、デプロイを気軽に行える環境、開発しやすい環境を用意しデプロイ回数を増やした。
アプリエンジニアが作成したためセキュリティ的に危ない箇所も数箇所ありセキュリティ対策の改善も行った。
envファイルにパスワード直書きされていたものをExternalSecretsを導入することでAWS上でKMSで暗号化した状態で管理できるようにしたり、EKSの多層防御を導入したり、SecurityGroup、IAMの見直し、ユーザー作成のIaC化、ECRでの脆弱性チェック、namespaceごとのユーザー権限設計、CustomControllerからAWS APIにアクセスする際にIRSAを利用するように修正、クラスターアップデート対応(EKS v1.14 to 1.16)など実施した。
開発人員
- SM 1人
- DevOpsエンジニア 2人