要旨
クラウドネイティブの時代になり、APレイヤだけでなく、インフラレイヤのコードも含めて広く考慮する必要がある。
開発者の環境で実施すべきものもあれば、ビルド環境でCI/CDをまわすものもある。
複雑化した構造の中で、開発ツールをどうとらえれば良いか。体系化の方針として、開発成果物をレイヤとフェーズの2軸で整理し、対応するツール・機能を紐づける。
要素は何か
レイヤとフェーズ分けした成果物ごとに、どういう機能が求められるかを明確にする。
- 成果物
- レイヤ: AP、コンテナ、k8s(オーケストレーション)
- フェーズ: ソースの状態から、Build/Ship/Runのそれぞれの成果の状態
- 機能
- 成果物のレイヤとフェーズごとに必要な機能は異なる
- ソース
- エディタ
- フォーマッタ/シンタックスハイライト/ソースの自動再生や補完
- 静的チェック
- スタイル、バグ検出、セキュリティチェック
- エディタ
- Build
- テスト実行
- パッケージング
- AP: Jarファイル
- コンテナ: コンテナイメージ
- セキュリティチェック
- ※AP、コンテナ共に
- Ship
- リポジトリへの登録
- AP: NEXUSへアーティファクトの登録
- コンテナ: コンテナレジストリへの登録
- k8s: etcdへの登録
- セキュリティチェック
- ※AP、コンテナ、k8s共に
- リポジトリへの登録
- Run
- 実行環境へのデプロイ
- コンテナ: コンテナの実行
- k8s: Podの起動
- 実行環境へのデプロイ
要素に対応するツールは何か
組み合わせがかなり多いので、組み合わせを減らせる順にざっくり代表例を書く。
- セキュリティ全般
- Trivyなどを用いてシフトレフトが基本。つまりなるべく早いフェーズでリスクを排除する
- コンテナ全般
- とりあえずDocker。
- コンテナ × Build: Buildpackなどのツールで効率化
- ソース全般: VSCodeなどのIDEを使うことでエディタなどの機能が使える
- AP × ソース:言わずもがなMaven
- k8s × ソース:SkaffoldやKustomizeで効率的に開発
- Run全般:
- IaC化: kubectl芸に頼らない。
- コマンドで頑張るのではなく、TerraformなどのIaCツールのソースに寄せる
- パイプライン化: GitOpsなどの考え方をベースにする
- Circle CIやArgoCDなどのCI/CDツールとの組み合わせてビルドパイプラインを構築する
- APとインフラのGitリポジトリは分ける
- 効率化: k9sなどのツールの活用
- IaC化: kubectl芸に頼らない。
どのツールの組み合わせがお薦めか
好みに合わせてで良いが、例えば、
Trivy, Kustomize, Rancher Desktop, VSCode, Circle CI, ArgoCD, k9sなど。
世の中の事例をどう捉えれば良いか
前節までの整理を頭に入れた上で、クラウドネイティブ系のコミュニティで先進企業の事例セッションなどを聞いてツールの位置付けを理解すると良い。
まとめ
ここまで書いておいて逆のことを言うが、ツールの比較表などは、破綻することが多いのであまりこだわらない方が良い。
なぜならば、ツール間で機能が重複するし、具備する機能のレベルもAppleToAppleで語れないケースも多い。
あくまで、ツールは手段でもあるので、ざっくりとした概観の理解に留め、やりたい事・目的に応じてプロジェクトで検証すると良いと思う。