学習の記録¶
このサイトの内容はトピックごとに整理しています。このページは学習の順序に沿って、各段階(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 であることを確認しました。