コンテンツにスキップ

学習の記録

このサイトの内容はトピックごとに整理しています。このページは学習の順序に沿って、各段階(Phase)で何をしたか、どんな結論を得たか、内容がどのトピックのページにまとめられているかを記録しています。

  • Phase ごとに 1 つのディレクトリ(01-network/ など)を作り、Terraform で作成・検証してから destroy しています
  • 詳しい作業の記録(日時、コマンド、エラーの原文)はリポジトリの notes/ にあり、サイトには載せていません

一覧

Phase 内容 トピックのページ
0 環境の準備 セキュリティ、コストのガードレール
1 ネットワーク(VCN) ネットワーク、Terraform
2 コンピュート + Ansible コンピュートとロード・バランサ
3 モジュール / リモート state / import Terraform
4 3 層アーキテクチャ ネットワーク、コンピュートとロード・バランサ
5a 静的チェック(tflint / checkov) Terraform
5b リソース・マネージャ Terraform
6 OKE(Kubernetes) OKE
7 サイト公開 + CI/CD CI/CD
8 サイトの自動停止 コストのガードレール
9 セキュリティ・運用 セキュリティ、ネットワーク
10 同じサイトを AWS にも公開 AWS との対比、CI/CD
11 Kubernetes の基礎 Kubernetes、OKE

Phase 0:環境の準備

ローカル PC に Terraform を入れ、API キー、コンパートメント tf-lab、予算アラートを作成しました。初日からのルール:Always Free だけを使い、リージョンは大阪だけ。

Phase 1:ネットワーク

最小限のネットワーク(VCN / インターネット・ゲートウェイ / ルート表 / セキュリティ・リスト / サブネット)。主眼はネットワークそのものではなく Terraform に慣れることです:state とは何か、plan の記号、コンソールで手作業の変更をしたとき(ドリフト)に Terraform がどう扱うか。

Phase 2:コンピュート + Ansible

Phase 1 のネットワークに A1 の VM を作り、nginx を動かしました。利用中のネットワークが 22 番ポートをブロックしている → Cloud Shell のプライベート・ネットワークからログインする方法に変更。最初は cloud-init で nginx を入れていましたが、cloud-init は最小限の初期化だけにし、nginx は Ansible に任せるように変えました(Phase 2.5)。

Phase 3:モジュール / リモート state / import

Phase 2 までに見えた問題を解決しました:state が 1 台の PC にしかない → オブジェクト・ストレージに置く。コードのコピー&ペースト → module + for_each。コンソールで手作業で作ったリソース → import。

Phase 4:3 層アーキテクチャ

LB(パブリック・サブネット)→ プライベート VM ×2 → Autonomous DB。NAT ゲートウェイ / サービス・ゲートウェイで用途別に出口を分け、SSH は OCI 要塞経由、NSG は層ごとに作って相互参照しています。

後から見つかった問題

セキュリティ・リストが VCN 全体からの 22 番ポートを許可しており、NSG との和集合で「SSH は要塞からしか入れない」は実際には成り立っていませんでした。当時は正方向のテストしかしていません。コードは修正済みです(再デプロイは未実施)。詳しくは ネットワーク設計 を参照してください。

Phase 5a:静的チェック

Phase 4 のコードに tflint / checkov をかけ、指摘に沿って修正しました(IMDS v2、転送中の暗号化)。あえて対応しないものは skip コメントに理由を残しています。apply 時に 2 台の VM が同時に再起動して 502 になった → 「インプレース ≠ 無停止」を学びました。

Phase 5b:リソース・マネージャ

OCI がホストする Terraform(リソース・マネージャ)で同じコードを動かしました:スタック、ジョブ(plan / apply / destroy)、ドリフト検出。

Phase 6:OKE

OKE の Basic クラスタ + A1 ワーカー ×2。API エンドポイントはプライベート・サブネットに置き、kubectl は Cloud Shell で実行します。nginx + Service LB をデプロイし、自己修復 / スケール / drain の実験をしました。K8s が間接的に作る LB は Terraform の state に入らないため、削除の順序が重要だと学びました。

Phase 7:サイト公開 + CI/CD

このサイトそのものです:MkDocs(中国語 + 日本語)→ オブジェクト・ストレージの公開バケット。利用中のネットワークで GitHub がブロックされている → OCI DevOps を使用:push → ビルド・パイプラインでチェック、ビルド、アップロード。

Phase 8:サイトの自動停止

公開サイトに大量のアクセスがあると費用が発生する → モニタリングのアラーム(リクエスト数)と予算(実際の費用)でファンクションを起動し、バケットを非公開に切り替えます。エンドツーエンドのテスト:約 3.5 分後に自動で停止しました。

Phase 9:セキュリティ・運用

サービス・ゲートウェイしかないプライベート VM(パブリック・インターネットにはまったく出られない)。ボールトで鍵とシークレットを管理し、VM はインスタンス・プリンシパルで許可されたシークレットだけを読めます。アクセス・ログ / 監査 → コネクタ・ハブ → CMK で暗号化したアーカイブ・バケット。フロー・ログはロギングの検索で確認します。

Phase 10:同じサイトを AWS にも公開

Route 53 でドメインを登録し、ACM、CloudFront + プライベート S3(OAC)、S3 バックエンド + use_lockfile。OCI DevOps のビルドが AWS にも同時に公開します(Access Key は OCI のボールトに保管)。CloudFront の定額プランの Free 枠を使用。AWS 側の費用はドメインだけです(年 $16 + 税)。

Phase 11:Kubernetes の基礎

先に講義、それから実践:第 1〜8 回で、コンテナ、K8s のアーキテクチャ、コア・オブジェクト、ネットワーク、設定とストレージ、信頼性、権限と運用を扱いました。実践では 06-oke/ を再利用:A1 の容量不足を再試行で乗り越えて OKE を作成し、Service LB のリスナーが TCP、ヘルス・チェックが kube-proxy の :10256/healthz であることを確認しました。