インフラ
terraform state lock エラーの解決 — 原因の確認と force-unlock の判断基準
Error acquiring the state lock エラーの Lock Info の読み方から整理します。同僚や CI が実行中という正常な状況と、異常終了でロックだけが残った状況を見分ける確認手順、force-unlock を使ってよい条件と誤って使うと state が壊れる理由、DynamoDB ロック方式の場合の確認場所と再発防止の設定まで扱います。
Terraform 運用 #7 OpenTofu とライセンス — BSL 転換、IBM による買収、選択基準
2023 年の BSL ライセンス転換と OpenTofu フォークの経緯から、CNCF への採択と IBM による HashiCorp 買収まで続いた勢力図の変化を時系列で整理します。BSL が実際に禁止していることと大半のユーザーには無関係な理由、2 つのツールの機能分岐の現状、組織の状況別の選択基準と移行時の確認事項を扱い、Associate 資格の案内とあわせて Terraform トラック全体を締めくくります。
Terraform 運用 #6 実行プラットフォーム比較 — 素の CI、HCP Terraform、Atlantis、Spacelift
自作した GitHub Actions ワークフローがどこまで持ちこたえ、どこから苦しくなるのかを基準に、マネージドの HCP Terraform、セルフホスト OSS の Atlantis、商用専門プラットフォームの Spacelift 系を比較します。ポリシーのコード化、RBAC、実行履歴の可視化といったプラットフォームの付加価値と料金構造を確認し、チーム規模ごとの選択基準を整理します。
Terraform 運用 #5 大規模の構造化 — スタック分割の基準、スタック間参照、Terragrunt 導入のタイミング
1 つの state が大きくなると生まれる plan の遅延、ブラスト半径、チーム間のロック競合という問題を整理し、変更頻度、寿命、所有チームを基準にスタックを分割する方法を説明します。スタック間で値を渡す 2 つの方式である terraform_remote_state と SSM パラメータの結合度の違い、モノレポの運用ルール、そしてボイラープレートが限界を超えたときの Terragrunt 導入の判断まで扱います。
Terraform 運用 #4 セキュリティ・コストスキャン — trivy、checkov、Infracost で PR ガードレール
セキュリティ設定のミスを apply の前に捕まえる静的スキャナー trivy と checkov を比較して導入し、誤検知の例外処理を理由つきでコードに残すルールを決めます。Infracost で PR に月額コストの変化をコメントとして表示してコストレビューをデプロイ前の段階に引き上げ、default_tags ベースのコスト追跡までつなげて PR ガードレールを完成させます。
Terraform 運用 #3 コード品質とテスト — tflint、pre-commit、terraform test
fmt と validate の上に tflint を重ね、存在しないインスタンスタイプのようなプロバイダー知識ベースのエラーを plan の前に捕まえ、pre-commit フックでコミット時点に自動化します。Terraform 内蔵のテストフレームワーク terraform test の tftest ファイルと run・assert 構造をモジュールテストの例で身につけ、plan テストと apply テストのコスト差に応じた使い分けの基準まで整理します。
Terraform 運用 #2 drift と state の手術 — 定期検知、import ブロック、removed ブロック
コードの外で起きた変更を定期 plan ワークフローと -detailed-exitcode で検知する仕組みを作り、drift への 3 つの対応(コードに吸収、apply で戻す、ignore_changes)の選択基準を整理します。コンソールで生まれたリソースを import ブロックで編入し、-generate-config-out でコードのドラフトを生成する手順から、state からだけ取り除く removed ブロックまで扱います。
Terraform 運用 #1 チームワークフロー — PR で plan レビュー、GitHub Actions で apply
ローカル apply がチームにもたらす権限の集中とレビュー不在の問題を整理し、PR には plan をコメントとして残し、マージすると CI が apply する標準ワークフローを GitHub Actions で構成します。OIDC ロールの接続、plan 出力の PR コメント自動化、concurrency で同時 apply を防ぐ設定まで、人の手による apply をなくす最初のステップを作ります。
Terraform 実践 #10 ドメイン・HTTPS・完成 — Route 53、ACM 検証、CloudFront と provider alias
Route 53 のホストゾーンをデータソースでつなぎ、ACM 証明書をリソース 3 つの DNS 検証イディオムで発行して、ALB に HTTPS リスナーとリダイレクトを取り付けます。CloudFront 用の証明書のために provider alias で us-east-1 を併用する方法を扱い、OAC で閉じた S3 バケットを配信する CDN とエイリアスレコードまでつないで、10 本のアーキテクチャを完成させます。
PostgreSQL LISTEN/NOTIFY — どこまで使い、いつメッセージキューへ移行するか
PostgreSQL 内蔵の pub/sub である LISTEN/NOTIFY の実用範囲を整理します。トランザクションと一緒にコミット時点で発行される動作原理、8000 バイトのペイロード上限と「キーだけ送れ」の原則、リスナーがいなければ消える揮発性、大量発行時のコミット直列化ボトルネックという規模の限界、だから定石になる「通知は起動の合図 + 仕事は SKIP LOCKED のテーブルキュー」の組み合わせ、そして本物のメッセージキューへ移る基準まで扱います。
Terraform 実践 #9 環境分離 — ワークスペースの限界、ディレクトリ構成、moved リファクタリング
ワークスペース方式が環境分離で直面する限界を整理し、modules と envs のディレクトリに分ける実務標準の構成を立てます。単一ディレクトリで育ったコードを network、compute、data モジュールにリファクタリングしながら、moved ブロックで再作成なしにアドレスを移し、dev と prod が同じモジュールを別の値で使う構成を完成させます。
PostgreSQL Row-Level Security — マルチテナント分離を DB で強制する
行単位のアクセス制御(RLS)の実践導入を扱います。WHERE tenant_id の漏れというマルチテナント最悪の事故を、アプリケーションの規律ではなく DB の強制で防ぐ構造、ENABLE ROW LEVEL SECURITY と CREATE POLICY の基本形、current_setting でリクエストごとにテナントを指定する標準パターンとコネクションプールの注意点、性能の条件(tenant_id のインデックス)、そして RLS を使わないほうがいい場合まで扱います。