Terraform
Terraform:記事リスト
Terraformのカテゴリーには以下の記事がリストされています。
TerraformのlocalバックエンドでCI/CDが詰まる構造|backend切替の設計判断軸
このトラブルの原因は、ほぼ確実に
backend "local" のままCI/CDを回していることにある。この記事では、terraform backend localがCI/CDパイプラインで詰まる3つの構造的な理由を解説したうえで、S3・GCSなどのリモートバックエンドへの切替をどの判断軸で決めればよいかを実装コード付きで整理する。Terraformを使い始めたばかりのエンジニアにも、チームでの運用を始めようとしているインフラ担当者にも参考になるはずだ。
この記事のポイント
・terraform backend localはCI環境でステートが毎回リセットされリソース重複作成が起きる
・ローカルファイルロックは別マシン・別コンテナには効かず並行apply時にstate競合が発生する
・AWS環境ならS3+DynamoDB組み合わせが最小構成のリモートバックエンド定番
・localが許容できるのは個人学習・使い捨て試験環境のみ。チーム利用・CI導入時は即切替が必要
TerraformでALBとターゲットグループを設計する方法|aws_lb・aws_lb_listener・ヘルスチェックとHTTPSリダイレクトの実践
そういう場面でTerraformを使えば、ALBの構成全体をHCLで宣言し、
terraform apply一発で再現できます。この記事では、TerraformでALBを設計するときに欠かせない aws_lb・aws_lb_target_group・aws_lb_listener の3リソースの関係を整理し、HTTP→HTTPSリダイレクト・ヘルスチェック設計・path-basedルーティングまでを実例のHCLで解説します。AWS provider 5.x・Terraform 1.9で動作を確認しています。
この記事のポイント
・ALBはaws_lb・aws_lb_target_group・aws_lb_listenerの3リソースで構成される
・HTTP→HTTPSリダイレクトはaws_lb_listenerのredirectアクションで1本宣言できる
・ヘルスチェックのthreshold値を絞りすぎると正常インスタンスが外れ続ける
・path-basedルーティングはaws_lb_listener_ruleのpriority順で評価される
続きを読む "TerraformでALBとターゲットグループを設計する方法|aws_lb・aws_lb_listener・ヘルスチェックとHTTPSリダイレクトの実践"
TerraformでACMの証明書発行とDNS検証を自動化する設計|aws_acm_certificate_validationの依存関係と発行待ちの実践
「DNS検証レコードとaws_acm_certificate_validationの依存関係の書き方がわからない」
AWSでHTTPS化を自動化しようとすると、必ずACM(AWS Certificate Manager)の証明書発行フローに直面します。AWSコンソールから手動で発行する場合は、画面の指示通りに進めれば数分で完了しますが、Terraformでコード化するとなると話が違います。
aws_acm_certificate(証明書リソース)、aws_route53_record(DNS検証レコード)、aws_acm_certificate_validation(発行完了待ち)の3つのリソースを正しい依存関係で組み合わせなければなりません。この依存関係を間違えると、terraform applyがいつまでも進まないか、ALBに証明書がアタッチされずHTTPS通信が切れます。
この記事では、for_eachを使ったDNS検証レコードの自動生成パターン、CloudFront向けのus-east-1プロバイダーalias設計、ワイルドカード証明書の書き方、タイムアウト時のトラブルシュートまで、実践的なHCLコードと実行例を交えて解説します。
動作確認環境: Terraform v1.9 / AWS Provider v5.x
この記事のポイント
・aws_acm_certificate_validationは証明書リソースとRoute 53 CNAMEレコード両方に依存する
・for_eachでdomain_validation_optionsを展開すると検証レコードを自動生成できる
・CloudFront用証明書はprovider = aws.us_east_1のalias設計が必須
・DNS検証がタイムアウトするときはRoute 53ゾーンのNameserver一致を最初に疑う
続きを読む "TerraformでACMの証明書発行とDNS検証を自動化する設計|aws_acm_certificate_validationの依存関係と発行待ちの実践"
TerraformとCloudFormationを比較する設計判断|HCLとYAML・状態管理・マルチクラウド対応とロールバックの選択基準
TerraformはHashiCorp(現IBM傘下)が開発したオープンソースのIaCツールで、AWS以外のクラウドにも対応します。CloudFormationはAWSが提供するマネージドIaCサービスで、AWSサービスとの統合が深いのが特徴です。両者はコード記法・状態管理・適用範囲・エコシステムが根本的に異なります。
この記事では、Terraform(HCL・v1.6以降)とCloudFormation(JSON/YAML・現行世代)を状態管理・コード記法・マルチクラウド対応・エラー時の復旧の4軸で比較し、「どちらを選ぶべきか」の判断基準を整理します。
この記事のポイント
・TerraformはtfstateをS3等に保管し自分で管理するが、CloudFormationはAWSがStack状態を管理する
・HCL(Terraform)はYAML/JSON(CloudFormation)より変数・ループ・モジュール化が読みやすく書きやすい
・マルチクラウド(AWS+Azure+GCP)を扱う場合はTerraform一択、AWSのみならCloudFormationも有力な選択肢
・Terraformのapply失敗は手動ロールバックが必要だが、CloudFormationはStack単位の自動ロールバックが標準機能
続きを読む "TerraformとCloudFormationを比較する設計判断|HCLとYAML・状態管理・マルチクラウド対応とロールバックの選択基準"
AWSを使わずMinIOでTerraformのstate共有基盤を用意する設計|互換オプションの指定と最小権限のアクセスキー発行
そういう場面で使えるのが、S3互換APIを実装したオブジェクトストレージ「MinIO」です。自分たちが管理するLinuxサーバーにMinIOを立ててS3互換バックエンドとして指定すれば、AWSなしでtfstateの共有基盤が成立します。
この記事では、MinIOをTerraform backendに接続するための設定に絞って解説します。「どのポートで立てるか」「force_path_styleとは何か」「アクセスキーの必要最小権限はどう書くか」という実装の観点で説明します。Rocky Linux / RHEL9での動作を前提にしています。
この記事のポイント
・MinIOのS3互換バックエンドにはforce_path_styleとskip系3オプションの設定が必須
・regionはMinIOが使わない値でも us-east-1 のようなダミー文字列の指定が必要
・最小権限は GetObject・PutObject・DeleteObject・ListBucket・GetBucketVersioning の5権限
・Terraform 1.10以降は use_lockfile=true でDynamoDB不要のstateロックが使える
続きを読む "AWSを使わずMinIOでTerraformのstate共有基盤を用意する設計|互換オプションの指定と最小権限のアクセスキー発行"
TerraformでDynamoDBテーブルを宣言的に定義する設計|GSI・TTL・ストリームの設定変更を安全に差分適用する
aws_dynamodb_tableリソースは、変更内容によって「インプレース更新(テーブルはそのまま)」と「リソース置換(テーブル再作成=データ消失)」の2パターンに分かれる。どちらになるかをterraform planで読み取れないまま apply すると、本番データを失うリスクがある。
この記事では、TerraformでDynamoDBテーブルを宣言的に定義する方法を解説する。GSI追加・TTL有効化・Streams設定変更がterraform planでどう差分に出るか、そしてリソース置換を招かない変更順序を実践例で示す。
動作確認環境: Terraform v1.9 / AWS Provider v5.x
この記事のポイント
・name/hash_key/range_key変更はforces replacement(テーブル再作成・データ消失)
・GSI追加・TTL有効化・Streams変更はインプレース更新で通る
・GSIのhash_key/range_keyを変え直すときは2ステップapplyで置換を回避する
・terraform planの「forces replacement」を必ず確認してからapplyする
続きを読む "TerraformでDynamoDBテーブルを宣言的に定義する設計|GSI・TTL・ストリームの設定変更を安全に差分適用する"
Terraformで「Backend configuration changed」が出たときの復旧手順|-migrate-stateと-reconfigureの判断基準
そんな状況に置かれたことはないだろうか。
╭ │ Error: Backend configuration changed │ │ A change in the backend configuration has been detected, which may require │ migrating existing state. │ │ If you wish to attempt automatic migration of the state, use "terraform init -migrate-state". │ If you wish to store the prior configuration, use "terraform init -reconfigure". ╰
この記事では、「Backend configuration changed」が発生する仕組みから、-migrate-stateと-reconfigureの正確な違い・判断基準、代表的なシナリオ別の実際の復旧手順を解説する。
この記事のポイント
・「Backend configuration changed」は.terraform/terraform.tfstateとの設定差分が原因
・本番インフラを管理中なら-migrate-stateが原則(stateを新backendへ移行する)
・-reconfigureはstateを移行せず再初期化するため、本番環境での乱用は危険
・シナリオ(ローカル→S3移行、バケット名変更等)ごとに正しい手順が異なる
続きを読む "Terraformで「Backend configuration changed」が出たときの復旧手順|-migrate-stateと-reconfigureの判断基準"
TerraformでVPCピアリングをコード化する設計|requesterとaccepterの分離とルートテーブル更新の依存関係
VPCピアリングのTerraform実装は、AWSが「requester(接続要求側)」と「accepter(承認側)」の2段階ハンドシェイクで設計しているため、Terraform初学者がつまずきやすいポイントです。特に別アカウントをまたぐ構成では、provider aliasの設定と適用順序を正しく制御しないと、applyが途中で止まります。
この記事では、aws_vpc_peering_connectionとaws_vpc_peering_connection_accepterの役割分担、別アカウント構成でのprovider alias設計、ルートテーブル更新との依存関係を実装レベルで解説します。動作確認環境: Rocky Linux 9.4 / Terraform 1.9.5 / AWS プロバイダー v5.62.0。
この記事のポイント
・requesterはaws_vpc_peering_connection・accepterはaws_vpc_peering_connection_accepterが担当
・auto_acceptは同一アカウント内のみ有効・別アカウントでは必ずaccepterリソースを記述する
・別アカウント構成はprovider aliasを2つ用意し・requester apply後にaccepter applyの順序が必要
・ルートテーブル更新はaccepterリソースへのdepends_onを明示し・順序崩れを防ぐ
続きを読む "TerraformでVPCピアリングをコード化する設計|requesterとaccepterの分離とルートテーブル更新の依存関係"
Terraformのbackendブロックはinit時にしか評価されない|s3・gcs・httpで必須キーと認証情報の渡し方が変わる仕組み
「terraform initを一度実行した後でbackendの設定を変えたのにplanに反映されない。なぜか」
この2つの疑問は、backendブロックが「terraform initのタイミングにしか評価されない」という動作仕様から来ている。plan・applyの段階ではbackendブロックは読み直されない。そのため変数解決も行われず、設定変更も無視される。
この記事では、backendブロックの評価タイミングの仕組みを整理した上で、s3・gcs・httpの3種別それぞれの必須キーと認証情報の渡し方を解説する。どのbackendを選ぶべきかという選定比較は本記事の対象外とし、実装上の設定キーと認証の仕組みに絞って説明する。
この記事のポイント
・backendブロックはterraform init時にしか評価されない(planでは読まれない)
・backendブロックで変数は使えない。-backend-configで外から渡す
・s3はbucket/key/region、gcsはbucket、httpはaddressが必須キー
・認証情報はbackendに書かず環境変数かIAMロールで渡すのが標準
続きを読む "Terraformのbackendブロックはinit時にしか評価されない|s3・gcs・httpで必須キーと認証情報の渡し方が変わる仕組み"
Route 53のサブドメインをTerraformで別ゾーンに切り出す設計|NSレコード委任と環境ごとの権限分離
Route 53のホストゾーンをサブドメインで分割する実装は、HCLの書き方さえ押さえれば作業自体は単純だ。ただしname_serversの受け渡しとNSレコードの登録先zone_idを混同すると委任が機能せず、名前解決が切れたまま原因を特定しにくい状況になる。
この記事では、
aws_route53_zoneで子ゾーンを作成し、aws_route53_recordでNSレコードを親ゾーンに登録する実装を解説する。ゾーンをどの単位で分けるべきかという設計判断論には踏み込まない。HCLでのNSレコード委任の書き方と、ゾーンIDで絞ったIAM権限の設定という実装に絞って説明する。この記事のポイント
・ 子ゾーンのname_servers属性をそのまま親ゾーンのNSレコードのrecordsに渡せる
・ NSレコードはtype="NS"+records=aws_route53_zone.子.name_serversで書く
・ IAMポリシーはARNにゾーンIDを含めてゾーン単位で権限を絞れる
・ 委任後はdigコマンドで親ゾーンのNSサーバーに直接問い合わせて確認する
続きを読む "Route 53のサブドメインをTerraformで別ゾーンに切り出す設計|NSレコード委任と環境ごとの権限分離"
TerraformのstateロックをDynamoDBからS3ネイティブロックへ移行する判断|use_lockfileの併用期間とロック競合の解消
その不満は正当だ。Terraform 1.11.0でS3ネイティブロック(use_lockfile)が正式サポートとなり、DynamoDB依存なしにstateロックが実現できるようになった。同時にDynamoDBロック引数は非推奨(deprecated)となり、将来バージョンでの削除が予定されている。
この記事では、DynamoDBロックからS3ネイティブロックへの移行手順、安全な併用期間の設け方、そして移行後に発生しやすいロック競合の解消方法を実践的に解説する。
動作確認環境:Terraform 1.11.x / AWS provider 5.x / Ubuntu 24.04 LTS
この記事のポイント
・use_lockfileはTerraform v1.11でGA。.tflockファイルをS3条件付き書き込みで管理する
・dynamodb_table引数はdeprecated。移行期間中は両設定の同時有効化が可能
・移行はIAM権限追加→use_lockfile追加→動作確認→dynamodb_table削除の4段階で進める
・ロック競合は terraform force-unlock コマンドで解除できる
続きを読む "TerraformのstateロックをDynamoDBからS3ネイティブロックへ移行する判断|use_lockfileの併用期間とロック競合の解消"
TerraformでVPCエンドポイントを一括定義する方法|インターフェース型のサブネット配置とプライベートDNS有効化の実装
Interface型のVPCエンドポイントはサービスごとに
aws_vpc_endpoint リソースを1つずつ書く必要があり、5本・10本と増えるにつれてHCLが冗長になりがちです。for_each を使えば、サービス名マップを1か所で宣言するだけで全エンドポイントを同じ設定で一括作成・管理できます。この記事では、TerraformでInterface型VPCエンドポイントを複数サービスまとめて定義する設計パターンを解説します。サブネットのマルチAZ配置・専用セキュリティグループ・
private_dns_enabled の設定根拠を実際のHCLコードと実行例で説明します。この記事のポイント
・Interface型エンドポイントはsubnet_ids・security_group_ids・private_dns_enabledの3点セットが必須
・for_eachでlocalsのサービスマップを回すとDRYな一括定義が実現できる
・マルチAZにサブネットを分散するだけでエンドポイントもHA構成になる
・private_dns_enabledにはVPCのenable_dns_hostnames/supportが有効である前提条件がある
続きを読む "TerraformでVPCエンドポイントを一括定義する方法|インターフェース型のサブネット配置とプライベートDNS有効化の実装"
Terraformで環境ごとにstateの保管先を切り替える設計|部分設定ファイルと環境変数によるinit時の分岐
Terraformのbackend設定は、terraform initで一度確定するとその後のplan・applyすべてに引き継がれます。複数環境をコードで管理していると、どの環境でinitしたかがstateの向き先を決める分岐点です。ここを誤ると、devのリソースをprodのstateで管理してしまう重大な事故につながります。
この記事では、terraform backend-config file(部分設定ファイル)を使って、init時にstateの保管先を環境ごとに切り替える実装手順を解説します。AWS S3をバックエンドに使う構成を例に、ファイル分割の設計からコマンド操作・CI連携まで実際の出力例とともに示します。
この記事のポイント
・-backend-config fileはinit時に部分設定ファイルでbackendの向き先を切り替える仕組み
・backend.tfはtype宣言のみの空定義、バケット名等の実値は環境別.hclに分離する
・TF_CLI_ARGS_initで-backend-configを環境変数化するとCIパイプラインと連携しやすい
・initを再実行する時は-reconfigureを付けないと前回のbackend情報が残り失敗する
続きを読む "Terraformで環境ごとにstateの保管先を切り替える設計|部分設定ファイルと環境変数によるinit時の分岐"
TerraformでRoute 53のaliasレコードとCNAMEを使い分ける設計|ALBへの向き先をHCLで宣言し名前解決を安定させる
Terraformを使ってAWSインフラをHCLで管理する現場では、この混乱が珍しくない。aliasとCNAMEはDNSの世界で似た役割を担うが、HCLの構文はまるで違う。書き方を間違えると
terraform applyが通っても名前解決が壊れるか、apexドメインに書けないエラーで詰まることになる。この記事では、
aws_route53_recordリソースでaliasブロックを使うパターンとCNAMEを使うパターンを実際のHCLで示し、ALBへの向き先をどう宣言するかを解説する。DNSルーティング方式の選定論には踏み込まない。aliasとCNAMEをHCLでどう書くかという実装に絞って説明する。この記事のポイント
・ aliasレコードはHCLでalias {}ブロックで書く。CNAMEとは構文が全く異なる
・ ALBをRoute 53で向ける場合はaliasが正解(apexドメインでも使えてTTL不要)
・ apexドメイン(example.com)にCNAMEは書けない。HCLでのエラー回避に重要
・ zone_idの混同(Route 53のIDとALBのzone_idは別物)がよくあるトラブルの原因
続きを読む "TerraformでRoute 53のaliasレコードとCNAMEを使い分ける設計|ALBへの向き先をHCLで宣言し名前解決を安定させる"
TerragruntでTerraformをDRY化する設計入門|includeとdependencyで環境差分を管理する方法
「moduleを使っても、呼び出し側のroot moduleが環境ごとにほぼ同じ内容で増えていく……」
Terraformは設計の自由度が高い反面、backendブロックにはTerraform変数を使えないという制約があります。環境ごとにbackend設定を書き分けると、dev・stg・prodで同じS3バケット名とDynamoDBテーブル名の指定が3ファイルに散らばり、変更のたびに全ファイルを手動で更新しなければなりません。
この記事では、そのギャップを埋めるツールとして現場で広く使われているTerragruntの設計パターンを解説します。includeブロックで共通設定を一元管理し、dependencyブロックでモジュール間データを受け渡す方法を、実際のディレクトリ構成とHCLコードで説明します。
この記事のポイント
・TerraformのbackendにはHCL変数が使えないため、環境差分が重複しやすい
・Terragruntのincludeブロックで親設定を継承し、backend設定を1箇所に集約できる
・dependencyブロックでVPC→EC2のようなモジュール間outputを安全に参照できる
・run-allコマンドで依存グラフを自動解決しながら複数モジュールを一括実行できる
続きを読む "TerragruntでTerraformをDRY化する設計入門|includeとdependencyで環境差分を管理する方法"
TerraformのインフラドリフトをPlan -refresh-onlyで検出する方法|手動変更との整合性設計と修正戦略
ドリフトを放置すると、次のterraform applyで意図しないリソース削除や変更が走るリスクがある。本記事では、Terraform 1.1以降で正式サポートされた
terraform plan -refresh-only を使ったドリフト検出の手順と、実務で役立つ3つの修正戦略、CI/CDへの組み込み設計、lifecycle ignore_changesで意図的に許容するパターンまで、設計の視点から解説する。この記事のポイント
・terraform plan -refresh-onlyはstateと実インフラの乖離(ドリフト)だけを表示するサブモード
・ドリフト修正には「コードで上書き・stateを現実に合わせる・ignore_changesで許容」の3戦略がある
・CI/CDに週次のrefresh-onlyジョブを組み込むことで早期発見できる設計を紹介
・lifecycle ignore_changesは「意図的に許容するドリフト」を宣言する正しい設計手段
続きを読む "TerraformのインフラドリフトをPlan -refresh-onlyで検出する方法|手動変更との整合性設計と修正戦略"
TerraformでGCPのVPCとCompute EngineインスタンスをIaC管理する方法|google providerの設定とリソース設計の実践手順
こういう状況に陥ることは珍しくない。AWSとGCPではプロバイダーの構造や認証方法が異なるため、同じHCLの感覚でそのまま移行しようとするとつまずく箇所が必ず出てくる。
この記事では、TerraformのGoogle Cloudプロバイダー(google provider)を使ってVPC・サブネット・ファイアウォール・Compute Engineインスタンスを一から定義し、terraform apply で実際にリソースを作成する手順を解説する。認証設定の落とし穴、AWSとの設計の違い、よくあるエラーの切り分けまでカバーする。
この記事のポイント
・google providerの認証はService Accountキーファイルで行う
・VPCはAWSと違いリージョンを持たず、サブネットがリージョン単位になる
・Compute Engineはゾーン指定が必須でrequired_providers設定と一緒に確認する
・APIの有効化忘れと権限不足が最頻出エラーの2大原因
続きを読む "TerraformでGCPのVPCとCompute EngineインスタンスをIaC管理する方法|google providerの設定とリソース設計の実践手順"
TerraformのHCL組み込み関数実践ガイド|templatefile・jsonencode・try・mergeでリソース設定を動的に組み立てる方法
Terraformを使い始めてしばらく経つと、こんな場面に直面します。複数のリソースに同じタグセットを使いたい、外部ファイルからJSON設定を動的に生成したい、存在しないかもしれないattributeを安全に参照したい……。
これらはすべて、HCLの組み込み関数を使うと解決できます。この記事では、実務でよく登場する組み込み関数を機能別に整理し、実際に動くコード例と設計パターンで解説します。
この記事のポイント
・mergeで共通タグと個別タグを合成すると重複コードが消える
・templatefile・jsonencode でuser_data・IAMポリシーをHCL構文で書ける
・tryとcanで存在しない属性を安全に参照してモジュールを柔軟にできる
・terraform console で関数をその場で対話検証できる
続きを読む "TerraformのHCL組み込み関数実践ガイド|templatefile・jsonencode・try・mergeでリソース設定を動的に組み立てる方法"
TerraformでWAF v2(aws_wafv2_web_acl)をALBに適用する方法|マネージドルールとカスタムルールの設計
TerraformでWAF v2を設定しようとすると、こういった疑問が次々と出てきます。AWSコンソールでは画面に沿ってクリックすれば一応動きますが、コードで書こうとすると構造の把握から始める必要があります。
この記事では、TerraformでAWS WAF v2(aws_wafv2_web_acl)をALBに適用する方法を解説します。マネージドルールの選定からカスタムルールの書き方、CloudWatch Logsへのログ出力設定まで、実際に動く構成を使って設計の「型」を身につけてください。
動作確認環境:Terraform v1.9.x、AWS provider 5.x、ap-northeast-1(東京リージョン)
この記事のポイント
・TerraformでWAF v2をALBに適用するにはaws_wafv2_web_aclとaws_wafv2_web_acl_associationを使う
・マネージドルール(AWSManagedRulesCommonRuleSet等)はoveride_actionで有効・無効を切り替えられる
・IPブロック・レートリミットのカスタムルールはstatementブロックで宣言的に記述できる
・CloudWatch Logsへのログ出力はaws_wafv2_web_acl_logging_configurationで設定する
続きを読む "TerraformでWAF v2(aws_wafv2_web_acl)をALBに適用する方法|マネージドルールとカスタムルールの設計"
TerraformでEKSクラスターを構築する方法|managed node groupとPod Identityの実践設計
「aws_eks_node_groupの設定がわからず、とりあえずコピペしたが何が正しいのか理解していない」
EKSをTerraformで管理しようとすると、クラスター本体・IAMロール・node group・add-onと、設定すべきリソースが多く、どこから手を付ければいいか迷うエンジニアが多い。
この記事では、EKSクラスターをTerraformでゼロから構築する実践手順を解説します。managed node groupの最小構成から、IRSAの後継であるPod Identityの設定方法、EKS managed add-onのバージョン管理、managed node groupとFargateプロファイルの設計判断まで、設計軸で体系的に身につけられます。
実行環境:Terraform 1.8.x / AWS provider 5.x(EKS 1.30、ap-northeast-1で動作確認済み)
この記事のポイント
・aws_eks_clusterとnode groupリソースで最小構成EKSを作れる
・Pod IdentityはIRSAの後継でOIDC設定が不要になる
・EKS add-onはaws_eks_addonでバージョン固定できる
・managed node group vs Fargate profileの設計判断基準も解説
続きを読む "TerraformでEKSクラスターを構築する方法|managed node groupとPod Identityの実践設計"
TerraformでCloudFrontとS3の静的サイトをコード管理する方法|OAC・HTTPSリダイレクト・キャッシュポリシーの実践設計
CloudFrontとS3を組み合わせた静的サイト配信は、設定項目が多く手動管理では属人化しやすい構成です。Terraformでコード管理すれば、設定の意図がHCLに記述されてGitで変更履歴を追跡でき、複数環境への展開もモジュール化で効率化できます。
この記事では、TerraformでCloudFront+S3の静的サイト配信基盤をゼロから構築する方法を解説します。旧方式のOAI(Origin Access Identity)ではなく現在推奨のOAC(Origin Access Control)でS3を保護する設計、HTTPSリダイレクト、マネージドキャッシュポリシー、ACM証明書とRoute 53レコードの管理まで、実際のHCLコードと実行ログで説明します。
動作確認環境: Terraform 1.7.x、hashicorp/aws プロバイダー 5.x、RHEL 9.4
この記事のポイント
・OAI(旧)ではなくOAC(Origin Access Control)でS3を保護するのが現在の推奨設計
・S3バケットはパブリックアクセスを全ブロックし、OACからのGetObjectのみをバケットポリシーで許可する
・CloudFrontのviewer_protocol_policy = "redirect-to-https"でHTTPSへの強制リダイレクトを設定できる
・ACM証明書はCloudFrontのグローバル要件によりus-east-1リージョンで作成する必要がある
続きを読む "TerraformでCloudFrontとS3の静的サイトをコード管理する方法|OAC・HTTPSリダイレクト・キャッシュポリシーの実践設計"
OpenTofuとTerraformを比較する|BSLライセンス変更後の移行判断・HCL互換性・機能差分の実践ガイド
2023 年 8 月、HashiCorp は Terraform のライセンスを MPL-2.0(Mozilla Public License)から BSL(Business Source License)に切り替えました。競合他社が Terraform をマネージドサービスとして再配布することを制限する変更で、Linux Foundation はこの動きに対抗して Terraform 1.5 コードをフォークし、OpenTofu を立ち上げました。2024 年 1 月に v1.6 が正式リリースされ、2026 年 8 月現在は v1.8 系が安定版として稼働しています。
この記事では、OpenTofu と Terraform を HCL コードレベルで比較し、移行手順と選択の判断基準を解説します。動作確認環境: Rocky Linux 9.4 / OpenTofu 1.8.0 / AWS プロバイダー v5.60.0 で動作確認済みです。
この記事のポイント
・OpenTofu は Terraform 1.5 のオープンソースフォーク・CLI は tofu コマンドで置き換わる
・HCL 構文・プロバイダー・state ファイルはほぼ完全に互換で既存コードの変更は不要
・移行は tofu init → tofu plan の 2 ステップで動作確認できる
・Terraform Cloud 非依存なら移行コストは低く・判断は「社内ポリシー」「将来リスク」で決まる
続きを読む "OpenTofuとTerraformを比較する|BSLライセンス変更後の移行判断・HCL互換性・機能差分の実践ガイド"
TerraformでLambda関数をデプロイする方法|aws_lambda_function・IAMロール・zip配布とCloudWatchログの実践設計
「関数が10本を超えたあたりから、誰がどのバージョンをデプロイしたか追跡できなくなった」
こういった問題はTerraformでLambdaを管理することで根本的に解決できます。関数本体・実行ロール・CloudWatchロググループをひとつのHCLで一貫して定義すれば、デプロイの差分はすべてterraform planで可視化でき、変更履歴はGitで追跡できます。
この記事では、
aws_lambda_functionを起点に、IAMロール設計・zip配布・CloudWatchログ・環境変数の扱い方・バージョン管理まで、実務で使える設計パターンを解説します。Rocky Linux 9.4 + Terraform v1.7.5、AWS Provider v5.54で動作確認済みです。この記事のポイント
・aws_lambda_function + aws_iam_role + aws_cloudwatch_log_group を3点セットで定義するのが基本
・source_code_hashでコード変更を検出し、差分があるときだけ再デプロイを走らせる
・LambdaのIAMロールはAWSLambdaBasicExecutionRoleを起点に最小権限で追加する
・ログ保持期間をTerraformで強制管理しないと無制限になり請求が膨らむ
続きを読む "TerraformでLambda関数をデプロイする方法|aws_lambda_function・IAMロール・zip配布とCloudWatchログの実践設計"
TerraformでRDSをプロビジョニングする方法|aws_db_instanceとサブネットグループ・パラメータグループの実践設計
こうした声はよく聞きます。RDSはEC2やVPCと比べてリソース間の依存関係が多く、サブネットグループの設定漏れやセキュリティグループの許可ポートミスで apply 直後にエラーになるケースが後を絶ちません。
この記事では、aws_db_instance を中心に、aws_db_subnet_group・aws_db_parameter_group・aws_security_group を組み合わせたRDSのプロビジョニング手順を実践解説します。MySQLを題材に、削除保護・マルチAZ・自動バックアップ・ストレージ暗号化・RDS IAM認証といった本番環境の必須設定も含めてカバーします。
動作確認環境: Terraform 1.8.5 / AWS Provider 5.50.0(ap-northeast-1リージョン、MySQL 8.0.35)
この記事のポイント
・aws_db_instanceの前にサブネットグループとセキュリティグループの定義が必要
・aws_db_parameter_groupで文字コード・タイムゾーン・スロークエリをコードで管理できる
・本番環境ではdeletion_protection=trueとskip_final_snapshot=falseを必ず設定する
・storage_encrypted=trueはインスタンス作成後に変更できないため最初から有効にする
・iam_database_authentication_enabled=trueでパスワード不要のIAM認証接続が実現できる
・lifecycleブロックでパラメータグループの無停止差し替えとエンジンバージョンのdrift防止を両立できる
・apply後はterraform outputとAWS CLIでRDSエンドポイントと稼働状態を必ず確認する
続きを読む "TerraformでRDSをプロビジョニングする方法|aws_db_instanceとサブネットグループ・パラメータグループの実践設計"
terraform consoleコマンドでHCL式を対話検証する方法|変数・関数・条件式のデバッグ実践手順
Terraform を書いていると、変数の値がどう展開されるか、関数が期待通り動くかをその場で確認したい場面が頻繁にある。apply を繰り返すのはリスクがあり、plan でさえ AWS API を呼ぶため数十秒かかることも多い。
この記事では、
terraform console コマンドを使って HCL 式を対話的に評価・検証する方法を解説する。変数の参照・組み込み関数のテスト・条件式・for 式のデバッグまで、実際のコマンド出力例を交えて説明する。動作確認環境: Terraform 1.7.5 / Rocky Linux 9.3
この記事のポイント
・terraform console でHCL式をplan不要で対話確認できる
・var.変数名・local値・data sourceも console で参照可能
・cidrsubnet・jsonencode・formatlist等の関数をその場で試せる
・for式・条件式のデバッグに console は特に効果的
続きを読む "terraform consoleコマンドでHCL式を対話検証する方法|変数・関数・条件式のデバッグ実践手順"
Terraformのdata sourceで既存AWSリソースを参照する方法|aws_ami・aws_vpc・aws_subnetsのfilter設計
この記事では、aws_ami・aws_vpc・aws_subnets・aws_caller_identity・aws_route53_zone を使い、IDのハードコードをゼロにするポータブルなIaC設計を実践解説します。filterブロックの書き方、よくある「No results」エラーの対処まで、実際のterraform plan出力例を交えて解説します。
動作確認環境: Terraform 1.8.5 / AWS Provider 5.50.0(ap-northeast-1リージョン)
この記事のポイント
・data sourceはリソースを作らず既存の属性値をTerraformコードへ動的に取り込む仕組み
・aws_amiでmost_recent=trueとfilterを組み合わせると常に最新AMIを自動参照できる
・aws_vpc・aws_subnetsで既存VPCのサブネットIDを一覧取得しEC2やALBへ渡せる
・aws_route53_zoneでゾーン名からIDを動的取得すればRoute 53レコード追加にハードコードが不要になる
続きを読む "Terraformのdata sourceで既存AWSリソースを参照する方法|aws_ami・aws_vpc・aws_subnetsのfilter設計"
Terraformのprecondition・postcondition・checkでリソース設定を自動検証する方法|Terraform 1.5以降のバリデーション機能と実践設計
こうした問題を未然に防ぐために、Terraformにはバリデーション機能が用意されている。apply前に入力値を検証するprecondition、リソース作成後の状態を確認するpostcondition、そして継続的な整合性チェックを担うcheckブロックの3種類だ。
この記事では、Terraform 1.2以降で使えるprecondition・postconditionと、Terraform 1.5以降のcheckブロックの構文と使い分けを解説する。RHEL 9.4・Terraform 1.9で動作確認済みのコード例を中心に説明する。
この記事のポイント
・preconditionはapply前に入力値を検証し、失敗するとapplyをブロックできる
・postconditionはリソース作成後の状態をselfで参照して確認できる
・checkブロックは非ブロッキングで継続的なインフラ整合性チェックができる
・3機能を組み合わせると入力→作成→状態の3段階バリデーションが実現できる
続きを読む "Terraformのprecondition・postcondition・checkでリソース設定を自動検証する方法|Terraform 1.5以降のバリデーション機能と実践設計"
terraform apply -targetの使い所と危険な乱用パターン|ピンポイント変更の判断基準と安全な運用設計
そう思って使い始めたところ、次の全体適用でサービス断が発生した——現場でよく聞くインシデントです。
`terraform apply -target` は、Terraform のオプションのなかでも「正しく使えば有効、乱用すると危険」の差が最も大きい機能の一つです。公式ドキュメントでも「通常運用での使用は推奨しない(escape hatch)」と明記されているにもかかわらず、日常的に使ってしまっているチームが後を絶ちません。
この記事では、`-target` の仕組みと正当な使い道、危険な乱用パターン、そして `-target` に頼らなくて済む設計への移行方法を実務目線で解説します。Terraform 1.8系 / RHEL 9.4 環境で動作確認しています。
この記事のポイント
・terraform apply -targetは「緊急避難のオプション」であり通常運用向けではない
・乱用するとtfstateの整合性が崩れ、次の全体applyで予期しない変更が発生する
・正当な用途は「壊れたリソースのピンポイント再作成」「ドリフトした単一リソースの修正」の2つ
・-targetに頼る設計はモジュール分割やdepends_onで根本解決できる
続きを読む "terraform apply -targetの使い所と危険な乱用パターン|ピンポイント変更の判断基準と安全な運用設計"
Terraformで複数AWSアカウントをまたぐ設計|provider aliasとassume_roleでマルチアカウント構成を実装する方法
「provider aliasは名前だけ知っているが、assume_roleと組み合わせてクロスアカウント操作をどう書けばいいのかわからない」
複数のAWSアカウントを扱う場合、Terraformのprovider aliasとassume_roleを組み合わせると、1つのコードベースで開発・ステージング・本番の各アカウントにまたがるリソースを同時管理できます。アカウントをまたぐ認証切り替えはTerraformが自動的に行ってくれます。
この記事では、provider aliasの基本設定からassume_roleによるクロスアカウント認証の仕組み、IAMクロスアカウントロールの準備手順、実際のリソース実装例、さらに「provider aliasで統合管理」と「ディレクトリ分割で分離管理」のどちらを選ぶべきかの判断基準まで解説します。
実行環境:Terraform 1.8.x(RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済み)
この記事のポイント
・provider aliasで複数AWSアカウントへのproviderを1つのコードで定義できる
・assume_roleブロックにrole_arnを指定するだけでクロスアカウント認証が切り替わる
・リソース定義でprovider = aws.devのように明示すると作成先アカウントを固定できる
・本番/開発で構成差が大きい場合はディレクトリ分割のほうが安全
続きを読む "Terraformで複数AWSアカウントをまたぐ設計|provider aliasとassume_roleでマルチアカウント構成を実装する方法"
Terraformのnull_resourceとterraform_dataの使いどころ|local-execを乱用しないための判断基準
そういった悩みを抱えているエンジニアは多い。null_resourceは確かに便利だが、使い方を誤るとTerraformコードの可読性が急落し、インフラのドリフト検出も困難になる。
この記事では、null_resourceとterraform_dataの違い・使い分け、そしてlocal-execプロビジョナーを「いつ使っていいか」「いつ代替手段を選ぶべきか」の判断基準を実践的に解説する。
この記事のポイント
・null_resourceはTerraform 0.x時代の回避策、terraform_dataが現代の正解
・local-execは「Terraformで管理できないもの」に限定して使う
・スクリプト実行はnull_resource/terraform_dataではなくAnsible等に委ねるのが設計上正しい
・triggers_replace引数の正しい使い方を理解すれば意図しない再実行は防げる
続きを読む "Terraformのnull_resourceとterraform_dataの使いどころ|local-execを乱用しないための判断基準"
TerraformでIAMポリシーをコード管理する方法|aws_iam_policy_documentで最小権限を宣言的に書く
「最小権限の原則は理解しているが、全員がコンソールを触れる状況では権限の肥大化を止められない」
これはIAM管理が手作業に頼り続けることで生まれる問題です。TerraformでIAMを管理するようにすると、ポリシーの変更はすべてHCLファイルのコードとして記録され、Gitで差分管理・コードレビューできるようになります。
この記事では、Terraformの
aws_iam_policy_documentデータソースを中心に、最小権限のIAMポリシーを宣言的に書く方法を解説します。S3読み取り専用ポリシーの基本から、Conditionブロックによる細かい権限制御、IAMロールへのアタッチ、よくあるトラブル対処まで一気通貫で習得できます。実行環境:Terraform 1.8.x(RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済み)
この記事のポイント
・aws_iam_policy_documentはIAMポリシーJSONをHCLで書くためのdata sourceで、コードレビューが可能になる
・statementブロックにactions/resources/effectを明示し、最小権限を宣言的に設計できる
・Conditionブロックを使うとIPアドレス制限やMFA必須などの細かい権限制御ができる
・tfstateにIAMアクセスキーが入るリスクに注意し、IAMロール設計を優先する
続きを読む "TerraformでIAMポリシーをコード管理する方法|aws_iam_policy_documentで最小権限を宣言的に書く"
Terraformのdepends_onと依存関係設計・暗黙依存とterraform graphでリソース作成順序を制御する方法
Terraformはリソース間のHCL参照式から依存関係を自動的に解決します。しかし、参照式では捕捉できない「副作用依存」が存在するとき、depends_onを明示的に指定しないと期待した順序でリソースが作成されません。
この記事では、terraform depends_on の正しい使い所と、暗黙依存(Implicit Dependency)が機能するしくみ、terraform graphを使った依存関係の可視化方法、さらにdepends_on過剰使用のリスクまで、実コードを交えて解説します。実務でTerraformを使うエンジニアが知っておくべき「依存関係設計の勘所」を体系的にまとめます。
この記事のポイント
・HCL参照式(aws_vpc.main.id など)を書くだけで暗黙依存が自動生成される
・depends_onは暗黙依存が捕捉できない副作用依存にのみ使う最後の手段
・terraform graph | dot -Tpng で依存関係グラフを画像として確認できる
・depends_onの過剰使用は計画精度を下げるため最小限にとどめる
続きを読む "Terraformのdepends_onと依存関係設計・暗黙依存とterraform graphでリソース作成順序を制御する方法"
Terraformのmoved・removedブロックで安全にリファクタリングする方法|state mvに頼らない宣言型の構成変更
terraform state mv を打ち間違えたら取り返しがつかない」Terraform で本番インフラを管理していると、そんな不安を抱える場面は必ずあります。
CLI コマンドによる state 操作は強力ですが、誰がいつ実行したかの履歴が残らず、チームで共有もできません。
Terraform 1.1 以降で導入された moved ブロック、そして 1.7 以降の removed ブロックを使えば、リソースの移動や state 管理除外を HCL コードとして宣言できます。変更内容を
terraform plan で事前確認し、Pull Request でレビューして、チームに共有しながら安全にリファクタリングできる。これが宣言型アプローチの本質です。この記事では、moved ブロック・removed ブロックの構文から実務リファクタリングパターン、よくあるエラーの対処まで体系的に解説します。
この記事のポイント
・moved ブロックは state mv の宣言型代替で VCS 管理・PR レビューが可能
・removed ブロックの destroy=false でインフラを残したまま state 除外できる
・plan 実行時に「Moved」表示で事前確認できるため誤操作リスクがほぼゼロ
・Terraform 1.1 以降で moved、1.7 以降で removed が利用可能
続きを読む "Terraformのmoved・removedブロックで安全にリファクタリングする方法|state mvに頼らない宣言型の構成変更"
terraform testによるコード検証の始め方|1.6以降のネイティブテスト機能でリグレッションを防ぐ
チームでTerraformモジュールを共有していると、誰かの変更が別のモジュールを静かに壊すリグレッションが避けられません。手動で確認するのには限界があり、本番環境への適用後に発覚するケースも珍しくないのが現実です。
Terraform 1.6から、外部ライブラリなしで使える公式のネイティブテスト機能が正式リリースされました。
.tftest.hclファイルを作成してterraform testコマンドを実行するだけで、モジュールの入出力やリソース属性を自動的に検証できます。この記事では、terraform testの基本構文と実行方法を押さえたうえで、CI/CDへの組み込みやtflintとの役割分担まで実践的に解説します。前提バージョンはTerraform 1.6以降です。
この記事のポイント
・terraform testはTerraform 1.6から正式搭載されたネイティブテスト機能
・.tftest.hclにrunブロックとassertを書くだけでモジュール検証ができる
・tflintの静的解析とterraform testの動的テストは役割が異なる二軸
・GitHub Actionsへの組み込みでリグレッションを自動防止できる
続きを読む "terraform testによるコード検証の始め方|1.6以降のネイティブテスト機能でリグレッションを防ぐ"
Terraformのsensitive変数とシークレット管理|SSMパラメータストア参照で秘密情報を安全に扱う設計
sensitive = true を付けたから秘密情報は安全」と思っていたら、tfstateファイルを開いた瞬間にDBパスワードが平文で丸見えだった ── そんな落とし穴にはまるチームは少なくありません。sensitive = true はTerraformのターミナル出力から値を隠す機能であり、シークレットの「保存」や「管理」の問題を解決するわけではありません。設計レベルでのシークレット管理が別途必要です。この記事では、
sensitive = true の正確な動作と限界を整理したうえで、AWS SSM Parameter Store(SecureString)をdata sourceで参照してシークレットをTerraformコードの外に切り出す設計を、実装例と実行結果を交えて解説します。動作確認環境: Terraform 1.6 / AWS Provider 5.x
この記事のポイント
・sensitive = true はログ隠蔽のみ。tfstateには平文でシークレットが残る
・SSM Parameter Store(SecureString)でシークレットをコード外で管理する
・outputにsensitive指定を忘れるとCI/CDログに平文が流れる
・リモートバックエンドのSSE-KMS暗号化が最低限の対策
続きを読む "Terraformのsensitive変数とシークレット管理|SSMパラメータストア参照で秘密情報を安全に扱う設計"
tflint・terraform fmt・validateでコード品質を自動チェックする方法|pre-commitとCIへの組み込み手順
terraform applyを実行してから書き間違いに気づいた」「チームで開発していると、インデントや命名規則がバラバラになってPRの差分がノイズだらけになる」こういった問題を放置すると、Terraformコードのレビューコストが静かに積み上がっていきます。この記事では、Terraformのコード品質を静的チェックで自動化する3つのツール(terraform fmt・terraform validate・tflint)の役割と使い分けを解説し、pre-commitフックへの組み込みとGitHub Actions CIへの統合手順をステップごとに説明します。動作確認環境はRocky Linux 9.4 / Ubuntu 24.04 LTSです。
この記事のポイント
・tflint / terraform fmt / validateは「規約違反・構文・書式」をそれぞれ担当する
・実行順序はfmt → validate → tflintの順が鉄則
・pre-commitフックに登録するとコミット前にチェックが自動実行される
・GitHub Actionsに組み込むとPRレビュー時にチェック結果が可視化される
続きを読む "tflint・terraform fmt・validateでコード品質を自動チェックする方法|pre-commitとCIへの組み込み手順"
Terraformのuser_dataとcloud-initでEC2を初期設定する方法|provisionerを避けるサーバー初期化設計
このような問題は、Terraformでのサーバー初期化設計を見直すことで解決できます。
この記事では、user_dataブロックとcloud-initを組み合わせたEC2初期化設計を実践的に解説します。provisionerが持つ構造的な問題点の整理から、HCLでのheredoc・templatefile()関数・base64encode()の使い方、cloud-config形式のYAML実践例、初期化ログの確認方法、よくあるトラブルの対処まで、本番で使えるレベルで体系化します。
この記事のポイント
・user_dataでEC2起動時にcloud-init処理を実行するのがprovisionerより安全な設計
・HCLのheredocまたはtemplatefile()で外部cloud-config YAMLを渡せる
・変更を反映するにはEC2の再作成(replace)が必要な点に注意する
・実行結果は /var/log/cloud-init-output.log で確認できる
続きを読む "Terraformのuser_dataとcloud-initでEC2を初期設定する方法|provisionerを避けるサーバー初期化設計"
Terraform Registryの公開モジュールを本番で使う判断基準|terraform-aws-modulesの選定とバージョン固定
Terraform Registryの公開モジュールは実装速度を大幅に短縮できる一方、外部コードを本番インフラに組み込む以上、選定を誤ると取り返しのつかない事態を招きます。
この記事では、Terraform Registryの仕組みからterraform-aws-modulesの選定基準、バージョン固定の正しい書き方、公開モジュールのカスタマイズ戦略、そして導入後のトラブル対処まで、本番採用の判断に必要な情報を体系的に解説します。
この記事のポイント
・terraform registry モジュールはsource + versionでバージョンを固定して使う
・terraform-aws-modulesはAWS公式支援・Star数1万超の実績ある公開モジュール群
・メンテ活性度・Issue対応速度・バージョン更新頻度の3点で本番採用を判断する
・variablesで吸収できないカスタマイズが出た時点で自作モジュールへの移行を検討する
続きを読む "Terraform Registryの公開モジュールを本番で使う判断基準|terraform-aws-modulesの選定とバージョン固定"
Terraformのディレクトリ構成ベストプラクティス|environments分割とmodules共通化のリポジトリ設計
「terraform planを実行するたびに全リソースの差分確認に追われ、本当に変えたい設定に集中できない」
Terraformを使い始めたエンジニアが必ずぶつかるこの壁の根本原因は、terraform ディレクトリ構成が適切に設計されていないことにあります。
この記事では、単一ファイル構成(脱・単一main.tf)の限界を整理したうえで、environments分割とmodules共通化を組み合わせたリポジトリ設計のベストプラクティスを解説します。3つの設計パターンの比較・environments/dev/stg/prodの実装例・modules/の設計指針・よくある失敗パターンと対策まで、リポジトリ構成軸で体得できます。
実行環境:Terraform 1.8.x(RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済み)
この記事のポイント
・単一main.tfはリソースが増えると「全リソースplan」「環境コピー増殖」で必ず破綻する
・environments分割型はdev/stg/prodをディレクトリで分離しtfstateも環境ごとに独立させる
・modules/共通化の基準は「2環境以上で同じ構成を使うリソース群」を抽出することだけ
・tfstateのS3バックエンドはenvironments/dev・stg・prodで必ずkeyパスを分ける
続きを読む "Terraformのディレクトリ構成ベストプラクティス|environments分割とmodules共通化のリポジトリ設計"
Terraformのworkspaceと-var-fileで環境を分離する方法|dev・stg・prodを1つのコードで管理する設計
「workspace切り替えだけでは、インスタンスタイプやドメイン名の環境差分を管理しきれない」
terraform workspaceはtfstateを分離するための仕組みですが、workspaceを切り替えるだけでは「どの環境の変数値を使うか」まで制御できません。dev・stg・prodでインスタンスタイプ、DBのサイズ、ドメイン名が異なる現場では、workspaceと-var-fileを組み合わせて初めて完全な環境分離が実現します。
この記事では、terraform workspace 環境分離の設計として、workspaceと-var-fileを組み合わせたdev・stg・prodの管理方法を解説します。実行環境はTerraform 1.8(RHEL 9.4 / Ubuntu 24.04 LTS)で動作確認済みです。
この記事のポイント
・workspaceはtfstateを分離し、-var-fileはパラメータを分離する役割を担う
・2つを組み合わせることで1セットのHCLで3環境を安全に管理できる
・S3バックエンド使用時はworkspaceごとにtfstateのパスが自動で分かれる
・「workspace selectを忘れたまま apply」が最多事故パターンで対策が必要
続きを読む "Terraformのworkspaceと-var-fileで環境を分離する方法|dev・stg・prodを1つのコードで管理する設計"
terraform importで既存AWSリソースをコード化する方法|importブロックで手作業インフラをIaC管理下に置く手順
こうした状況は、クラウド運用の現場でよく見かけます。Terraform導入前に作ったリソース、別チームが手動で作成したセキュリティグループ、移行作業で一時的にAWSコンソールから起動したEC2インスタンスなど、IaC管理外のリソースは思いのほか多いものです。
この記事では、terraform import を使って既存AWSリソースをTerraformのstate管理下に移す方法を解説します。旧来の
terraform import コマンド方式(Terraform 1.4以前から利用可能)と、Terraform 1.5以降で使えるimportブロック(宣言的な新方式)の両方を比較しながら、実践的な手順を順を追って説明します。この記事のポイント
・terraform importでAWSコンソール作成済みリソースをIaC管理下に移せる
・Terraform 1.5以降のimportブロックはPRレビュー可能な宣言的方式で推奨
・state mv/rmとは軸が異なる——実インフラを「取り込む」操作がimportの本質
・よくある失敗はIDフォーマット不一致とplan差分の修正漏れの2パターン
続きを読む "terraform importで既存AWSリソースをコード化する方法|importブロックで手作業インフラをIaC管理下に置く手順"
Terraformのremote_stateでモジュール間データを受け渡す方法|tfstate分離設計とoutput参照の実践
Terraformの構成が大きくなると、すべてのリソースを1つのtfstateに押し込むのが怖くなります。ネットワーク・コンピュート・アプリケーションの3層に分離してみたものの、「VPC IDをどうやって別プロジェクトに渡すんだ?」と詰まる方は多いです。
この記事では、terraform_remote_state data sourceを使って、分離されたtfstate間でデータを安全に受け渡す設計パターンを解説します。S3バックエンドを前提に、実際のHCLコードとterraform planの実行例を交えて説明します。
この記事のポイント
・terraform_remote_stateで別tfstateのoutputを参照できる
・backendブロックのS3設定で参照先のstateを指定する
・outputにsensitive=trueで機密情報を安全に渡せる
・設計の鉄則は「一方向参照のみ」で循環参照は禁止
続きを読む "Terraformのremote_stateでモジュール間データを受け渡す方法|tfstate分離設計とoutput参照の実践"
Terraformのdynamic blockでHCL設定を動的に生成する方法|繰り返し設定の簡潔化と実務パターン
「EC2に追加するEBSボリュームの数を環境ごとに変えたいのに、resource{}自体をfor_eachで増やしても内部のブロックを制御できない」
Terraformを実務で使い始めると、ブロック単位での繰り返し設定という壁にぶつかります。resource{}全体をfor_eachで増やすことはできても、resource{}の内部にある特定のネストブロック(ingress・ebs_block_device・global_secondary_index等)を動的に生成するには、別の構文が必要です。それがdynamic blockです。
この記事では、TerraformのHCLでネストブロックを動的に生成するdynamic blockの仕組みを解説します。基本構文から始め、iterator引数のカスタマイズ・セキュリティグループへの実務適用・DynamoDB GSIの動的定義・ネストしたdynamic block・for式との組み合わせ・よくあるエラーの切り分けまで、設計パターンとして体得できます。
実行環境:Terraform 1.8.x(RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済み)
この記事のポイント
・dynamic blockはresource内のネストブロックをリストや集合から動的に生成するHCL構文
・for_each + content{} の組み合わせが基本形。iterator引数で参照名を変更できる
・セキュリティグループのingress・EBSボリューム・DynamoDB GSIが代表的な実務ユースケース
・ネストしたdynamic blockで「typeに応じてブロックを切り替える」条件分岐パターンも実現できる
続きを読む "Terraformのdynamic blockでHCL設定を動的に生成する方法|繰り返し設定の簡潔化と実務パターン"
Terraformのplan・applyエラーを調査・解決する方法|TF_LOG・Stateロック・ドリフトを実践的に切り分ける
Terraformを本番運用し始めると、こうした状況に必ず一度は直面します。エラーメッセージは英語で長く、どの行が本当の原因なのか見つけにくい。CI/CDに組み込んでいれば、パイプラインが突然止まって復旧に時間がかかることもあります。
この記事では、Terraformのplan・applyエラーを体系的に調査・解決するための実践手順を解説します。デバッグログ(TF_LOG)の活用、DynamoDBのStateロック解除、ドリフト検出とリカバリ(
terraform plan -refresh-only の使い方と解消アプローチ)、よくあるエラーパターンの切り分けまで、実際のコマンド出力を交えて説明します。この記事のポイント
・TF_LOG=DEBUG 設定だけでAPIレベルのエラー原因を特定できる
・DynamoDB Stateロック詰まりはforce-unlockコマンドで安全に解除できる
・terraform plan -refresh-only でドリフトを診断し、インフラは変更しない
・ドリフト解消は「コード修正・インフラ修正・terraform import」の3択で判断する
・CI/CDに -detailed-exitcode を組み込めばドリフトをexit codeで自動判定できる
続きを読む "Terraformのplan・applyエラーを調査・解決する方法|TF_LOG・Stateロック・ドリフトを実践的に切り分ける"
Terraformのstate操作コマンド実践ガイド|state list・state mv・state rmで既存インフラを安全に管理する方法
「既存のAWSリソースをTerraformの管理から外したいのに、誤ってdestroyされてしまわないか心配だ」
「チームメンバーが手動でEC2を増設してしまい、tfstateと実態がずれた。どうやって修正すればいい?」
Terraform運用を本格化するほど、こうした「stateをどう操作するか」という問題に必ずぶつかります。
この記事では、terraform stateサブコマンド(list・show・mv・rm)の使い方を実践形式で解説します。モジュール化に伴うリソース移動、管理対象からの除外、stateのバックアップとロールバック、よくある操作ミスの対処まで、現場で即使える手順を説明します。
実行環境:Terraform 1.8.x、AWS Provider 5.x
この記事のポイント
・terraform state listで管理中リソースのアドレス一覧を確認できる
・terraform state mvはdestroyなしでリソースを移動・リネームできる
・terraform state rmは実インフラを削除せず管理対象から外すだけ
・操作前のterraform state pullによるバックアップが安全運用の絶対条件
続きを読む "Terraformのstate操作コマンド実践ガイド|state list・state mv・state rmで既存インフラを安全に管理する方法"
GitHub ActionsでTerraformのCI/CDパイプラインを構築する方法|plan自動実行からapply承認フローまで
こういった課題は、Terraformを個人で使い始めた段階から、チームに広げようとした瞬間に一気に顕在化します。コードレビューはできても、そのコードを適用したらインフラがどう変わるのかをレビュアーが把握できていない、というのは非常に多い現場の悩みです。そこへ「誰かがローカルから手動applyした」という事故が重なると、tfstateが壊れてインフラの実態とコードの乖離が始まります。
この記事では、GitHub Actionsを使ってTerraformのCI/CDパイプラインを構築する方法を解説します。PRトリガーによるterraform plan自動実行とPRへの結果コメント投稿、GitHub Environmentsを使った本番applyの承認フロー、AWSへのOIDC認証設定まで、チーム開発で実際に使えるワークフロー設計の全体像をカバーします。ステージングから本番への段階適用パターンと、IAM最小権限ポリシーの具体的な設計も合わせて解説します。
動作確認環境: GitHub Actions(ubuntu-latestランナー)、Terraform 1.8.5、AWS(ap-northeast-1リージョン)。
この記事のポイント
・PR作成時にterraform planを自動実行しPRコメントでレビュアーが差分を確認できる
・GitHub Environmentsで本番applyに承認フローを挟み誤操作と手動実行を防ぐ
・OIDCを使いアクセスキー不要でAWSへ安全に認証する設定方法を解説
・workflow_dispatchで緊急時の手動applyも承認フロー経由で安全に制御する
・if: failure()でapply失敗時のSlack通知を組み込みパイプライン障害を見逃さない
・initの失敗・OIDC認証エラー・stateロック残留など現場で起きるエラーの対処法
続きを読む "GitHub ActionsでTerraformのCI/CDパイプラインを構築する方法|plan自動実行からapply承認フローまで"
Terraformのprovider設定とバージョン管理|required_providersとterraform.lock.hclでチーム開発を安定させる方法
Terraformで複数人の開発や複数環境(dev・staging・prod)の管理を始めると、プロバイダーのバージョン管理のズレが原因でこうした問題が起きます。TerraformのAWSプロバイダーは本体とは独立して頻繁に更新されるため、バージョン指定を適切に設計していないと静かに環境差異が生まれます。
この記事では、
required_providers ブロックによるバージョン制約の設計と、terraform.lock.hcl を使ったチーム全体での環境固定方法を解説します。バージョン制約演算子の使い分け・複数プロバイダーの設定・provider alias による複数リージョン構成と、よくあるエラーの対処法も合わせて説明します。動作確認環境: RHEL 9.4 / Ubuntu 24.04 LTS + Terraform v1.9.x + hashicorp/aws v5.x
この記事のポイント
・required_providers でプロバイダーのsource・バージョン制約を必ず明示するのが基本
・~> 演算子でメジャーバージョンを固定しつつセキュリティパッチを自動取り込みできる
・terraform.lock.hcl は必ずGitにコミットしてチーム全体の環境を固定する
・provider alias で複数リージョン・クロスアカウント構成を1コードベースで扱える
続きを読む "Terraformのprovider設定とバージョン管理|required_providersとterraform.lock.hclでチーム開発を安定させる方法"
Terraformのlifecycleブロックで本番リソースを誤削除から守る方法|prevent_destroyとignore_changesの実践設計
Terraformを使い始めたエンジニアやチームで本格運用を始めたばかりの現場では、こうした誤操作が実際に起きています。Terraformは「宣言した状態を実現する」ことに忠実すぎるがゆえに、意図しない削除や置換が発生しやすいツールでもあります。
この記事では、Terraformの
lifecycle ブロックを使って本番リソースを守る方法を解説します。prevent_destroy・create_before_destroy・ignore_changes の3設定の意味と、RDS・ALBへの実践的な適用パターンを具体的なコード例と実行ログで説明します。この記事のポイント
・prevent_destroy = true で誤ったdestroy/replace操作をエラーでブロックできる
・create_before_destroyでALB・セキュリティグループのゼロダウンタイム置換を実現する
・ignore_changesでコンソール手動変更によるドリフトを安全に吸収できる
・RDSにはDeletion Protectionとの二重防護でより確実に誤削除を防げる
続きを読む "Terraformのlifecycleブロックで本番リソースを誤削除から守る方法|prevent_destroyとignore_changesの実践設計"
TerraformのHCL変数設計|variable・locals・output・data sourceで構成を整理する方法
「開発・本番の切り替えでファイルを書き換えたら、うっかり本番用の値で開発環境を壊してしまった」
「モジュールを分割し始めたら、どの値をvariableにして、どの値をoutputで公開するべきか整理できなくなった」
Terraformを触り始めたころ、こういった失敗は誰もが経験します。その根本原因は、Terraformの変数機能を正しく使っていないことにあります。
TerraformのHCLには「variable」「locals」「output」「data source」という4種類の変数・参照機能があります。これらを使い分けることで、コードの重複を排除し、環境ごとの値切り替えをファイルコピーなしに実現できます。さらに、Terraform 1.2以降で使えるprecondition・postconditionを組み合わせれば、設定ミスをapplyの前後に多段で検知できます。
この記事では、HCL変数設計の4要素を実際のコードと実行例で解説します。variables.tfの型定義・バリデーション・tfvarsによる環境分離・locals/outputの使い所・data sourceによる既存リソース参照、そしてlifecycleブロックのprecondition/postconditionによる多段防御まで、設計軸で整理して体得できます。
実行環境:Terraform 1.8.x(RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済み)
この記事のポイント
・variable{}で入力値を外部化し、terraform.tfvarsで環境ごとに安全に切り替えられる
・locals{}は繰り返し使う式や計算結果を1箇所にまとめてDRYにするための要素
・output{}はモジュールから外部へ値を公開し、モジュール間の疎結合を保つ
・data{}ソースは「Terraformで作っていない既存リソース」をコードから参照するための機能
・precondition・postconditionはvariable validationで届かない実行時コンテキスト条件を多段で検証する
続きを読む "TerraformのHCL変数設計|variable・locals・output・data sourceで構成を整理する方法"
TerraformとAnsibleの違いと使い分け|IaCツール選定の判断軸
Infrastructure as Codeの導入を検討するエンジニアなら、一度はこの疑問にぶつかるはずです。
どちらもIaCを実現するツールですが、設計思想も得意領域もまったく異なります。「なんとなく流行っているから」という理由で選ぶと、現場で使い物にならない構成になってしまいます。
この記事では、TerraformとAnsibleの違いを設計思想レベルから整理し、「どの場面でどちらを選ぶべきか」の判断軸を実務目線で解説します。CI/CD連携の具体的な手順や、現場でよくある連携の失敗パターンも取り上げます。
この記事のポイント
・TerraformはインフラのプロビジョニングにAnsibleは設定管理に向く
・「宣言型」と「手続き型」の設計思想の違いが選定の核心になる
・現場では両ツールを役割分担させて併用するのが主流
・null_resource+local-execでAnsibleを呼ぶのは避けるべきアンチパターン
Terraformのtfstate管理とS3バックエンド設定|チーム運用で壊さないための基礎
「git管理しているtfstateを複数人が同時に変更して、どれが正しいか分からなくなった」
「S3バックエンドを設定しようとしたが、どのファイルに何を書けばいいのか分からない」
こうした悩みはチーム開発でTerraformを導入した直後に必ずといっていいほど発生します。
この記事では、tfstateの仕組みを基礎から解説し、S3バックエンドによるリモート管理の設定手順、DynamoDBを使ったState Lockingの実装、stateが壊れたときのトラブルシューティング、さらにチームが拡大したときのTerraform Cloud(HCP Terraform)への移行指針まで一気に解説します。
チームでTerraformを安全に運用するための設計知識を、実際のHCLコードと実行例を交えて丁寧に説明します。
この記事のポイント
・tfstateはTerraformがインフラの「現在の状態」を記録するJSONファイル
・S3バックエンド設定でtfstateをチーム共有・バージョン管理できる
・DynamoDB State Lockingで同時実行によるstate破損を防ぐ
・state破損・ロック残留はterraform force-unlockで対処できる
・チームが拡大したらTerraform Cloud(HCP Terraform)への移行も選択肢に
TerraformでAWS VPCとEC2を構築する方法|HCL記法とterraformコマンドの実践
「HCLの構文は調べたが、実際にterraform applyするまでの全体像がつかめない」
こういった悩みを持つエンジニアは多いです。Terraformのドキュメントは英語が中心で、しかもProviderのバージョンによって書き方が変わるため、情報が散らばりがちです。
この記事では、terraform aws vpc の構築を軸に、VPC・サブネット・インターネットゲートウェイ・EC2インスタンスをHCL(HashiCorp Configuration Language)で定義し、terraform init / plan / apply の実行フローまで一気通貫で解説します。さらに dynamic ブロック+for_each によるセキュリティグループの動的ルール生成・locals での for 式活用・splat 式による出力値取得といった実務パターン、および既存AWSリソースをTerraform管理下に取り込む terraform import の基本手順まで押さえます。動作確認環境は Terraform v1.8.x / AWS Provider v5.x(Rocky Linux 9 / Amazon Linux 2023で動作確認済み)です。
この記事のポイント
・terraform aws vpcはHCLのresourceブロックで宣言的に定義する
・VPC→サブネット→IGW→ルートテーブルの順に依存関係を組む
・dynamic ブロック+for_eachでSGのingressルールを動的に展開できる
・terraform plan で差分確認、apply で実際にAWSリソースが作成される
・tfstateはS3+DynamoDBでチーム共有するのが本番運用の鉄則
・TypeScriptで書きたい場合はCDKTF(Cloud Development Kit for Terraform)が選択肢になる
Terraform入門|Infrastructure as CodeでAWSインフラをコード化する基礎ハンズオン
「Terraformを使えばインフラをコードで管理できると聞いたが、何から始めればいいのかわからない」
「コンソールで手動作成した既存リソース、どうやってTerraformに取り込めばいいんだ…」
こういった悩みを持つインフラエンジニアは多いでしょう。AWSコンソールでの手作業は、チームで運用するほどに属人化・設定漏れ・環境間の差異という問題を引き起こします。
この記事では、Infrastructure as Code(IaC)の代表格であるTerraformの概念から、HCL構文・状態管理・既存リソースの取り込み(terraform import)・モジュール設計、そしてAWSでVPCとEC2をコード化するハンズオンまでを体系的に解説します。「なぜTerraformを使うのか」「どう設計するか」「既存リソースをどう管理下に置くか」「よくあるトラブルをどう乗り越えるか」という4つの軸で、実務で使えるレベルまで踏み込んで説明します。
この記事のポイント
・TerraformはHCLでAWSインフラを宣言的にコード化できるIaCツール
・tfstateで状態を管理し、S3+DynamoDBでチーム共有するのが実務の基本
・terraform importで既存リソースをTerraformのstate管理に取り込める
・terraform fmt/validateでコードの構文ミスを即座に検知できる
・plan/apply失敗の多くは依存関係・権限・tfstate不整合が原因
続きを読む "Terraform入門|Infrastructure as CodeでAWSインフラをコード化する基礎ハンズオン"
