MENU
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
AWSの導入・クラウド運用を総合支援【CapsuleCloud】
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
AWSの導入・クラウド運用を総合支援【CapsuleCloud】
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
  1. ホーム
  2. AWS技術知見
  3. Terraform
  4. TerragruntでDRYなTerraform Remote State

TerragruntでDRYなTerraform Remote State

2022 8/18
Terraform
2022年8月18日
目次

はじめに

前回に引き続きTerraformをさらにいい感じに使えるTerragrunt。
今回はそのTerragruntでTerraformのRemote Stateをいい感じにDRYに管理する方法をご紹介します。

便利なRemote Stateだが…

Terraformにはインフラの状態(state)をリモートに保存しておけるようにremote stateという便利な機能があります。
保存先として主流なのは、おそらくs3やconsulになるのですが、リモートに保存しておくことで、複数人でインフラをTerraformで扱ったり(要ロック)、ローカルに保存してたstateが消えたりしてもリモートにあるから大丈夫になります。
要はインフラの状態管理が今よりもっといい感じになるのです。

ですが、これには致命的な問題があって、terraformファイルで記述するのはbackendというブロックになるのですが、ここでインタポレーション(変数を使うこと)が効かないのです。

terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "frontend-app/terraform.tfstate"
region = "us-east-1"
encrypt = true
lock_table = "my-lock-table"
}
}

上のブロックで記述したものは再利用される項目も多々あるのですが、ここで変数を使えなかったり、共通化できないのは結構な痛手なんですよね。

├── backend-app
│ └── main.tf
├── frontend-app
│ └── main.tf
├── mysql
│ └── main.tf
└── vpc
└── main.tf

例えば上のような構成だった場合。
main.tfのbackendブロックに何回も同じ記述を書かないといけないのです。
これはDRYじゃないですしバグを作る要因にもなります。
そこで、Terragruntではremote_stateというブロックを使用することができます。

Terragruntのremote_stateそしてinclude

上の問題をTerragruntでどう解決するのかと言うと、まずはmain.tfにプレースホルダを記載しておきます(これは必須)。

terraform {
# ↓この中身はTerragruntが埋める
backend "s3" {}
}

中身は空っぽです。
この中身をTerragruntが埋めてくれる感じです。ディレクトリ構造としては以下のようになります。

├── terraform.tfvars
├── backend-app
│ ├── main.tf
│ └── terraform.tfvars
├── frontend-app
│ ├── main.tf
│ └── terraform.tfvars
├── mysql
│ ├── main.tf
│ └── terraform.tfvars
└── vpc
├── main.tf
└── terraform.tfvars

親ディレクトリに共通利用するterraform.tfvarsがあり、モジュール固有の設定についてはそれぞれサブディレクトリにterraform.tfvarsを配置します。
そして、親ディレクトリのterraform.tfvarsには以下のように記述します。

terragrunt = {
remote_state {
backend = "s3"
config {
bucket = "my-terraform-state"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "us-east-1"
encrypt = true
lock_table = "my-lock-table"
}
}
}

ポイントとなるのはpath_relative_to_include()の部分です。
ここがモジュール固有の設定が入る場所となります。
モジュール固有のterraform.tfvarsがどうなるかと言うと

terragrunt = {
include {
path = "${find_in_parent_folders()}"
}
}

となります。includeが重要な役割を担っています。
includeブロックのpathで指定されたterraform.tfvarsのterragruntブロックがまるっとここにコピペされると思ってください。
そして、もちろん子の設定が優先されるので、同じ設定を記述している場合は子の設定が反映されます。

find_in_parent_foldersはTerragrunt特有の関数で、親ディレクトリで最初にみつけたterraform.tfvarsファイルのパスを返却します。
こうすることでpathに自分でパスを指定する必要がなくなります。
そして、上で少し述べたpath_relative_to_include()は、親terraform.tfvarsから見たincludeが含まれるterraform.tfvarsへの相対パスに変換されます。

何を言っているのかさっぱり想像しづらいと思いますが…。
例えば、backend-appのterraform.tfvarsを例に取った場合、親のterraform.tfvarsから見て、backend-appのterraform.tfvarsはbackend-app/terraform.tfvarsになるので、path_relative_to_include()はbackend-appbackend-appのtfstateのkeyはbackend-app/terraform.tfstateというパスに保存されることになり、モジュール固有のstateをリモートでkeyを分けて管理できるということです。

ちょっとHackyな雰囲気が出てますが、どのみち現状のTerraformでコピペミスを防ごうとするとこういった感じのスクリプトを自分で書くことになるかと思うので、Terragrunt側で用意してくれているのは嬉しいことですね。

おわりに

TerragruntでbackendブロックをDRYにする方法を紹介しました(本家のREADMEに記載されている内容です)。
IaCでインフラ自動化するのは良いのですが、テストが普通のコーディングと違ってしづらい為、極力バグが混入しにくい使い方をすることが大切です。
まだTerragruntで紹介できていない機能がありますが、それはまたの機会に。

Terraform
remote-state Terraform terragrunt

関連記事

  • terraform
    Terraformと変数(variable)のお話
  • terraform
    TerragruntでDRYなTerraform
検索
clouddx003-low.pdf - 1.8MB
資料ダウンロードはこちら
人気記事
  • terraform
    Terraformと変数(variable)のお話
    Terraform
  • aws-s3
    Amazon S3で署名付きURLを使ったアクセス制御
    AWS技術知見
  • AWS導入支援
    amazonクラウド、AWSとは?何ができるかデメリット含めわかりやすく説明
    AWS導入支援
  • WordPress高速化!6つの簡単な方法で重さを改善
    WordPress
  • ansible
    AWSのためのAnsible入門
    AWS技術知見
  • WordPress脆弱性の原因とやっておくべき7つの対策
    WordPress
  • 【実例20選】AWS導入企業、活用事例をご紹介
    AWS導入支援
新着記事
  • AWS運用代行企業5選!企業選びのポイントを解説
    AWS運用代行
  • AWS運用代行のサービス内容やメリットについて
    AWS運用代行
  • 10分でスタート!AWSの利用開始までを解説
    AWS導入支援
  • WordPress脆弱性の原因とやっておくべき7つの対策
    WordPress
  • WordPress高速化!6つの簡単な方法で重さを改善
    WordPress
カテゴリー
  • AWS導入支援
  • AWS技術知見
    • Rancher
    • Terraform
  • AWS運用代行
  • WordPress
タグ一覧
AI (3) aws (25) aws-cli (3) CloudFormation (1) CloudSearch (3) DeepLearning (1) DNS (2) Docker (4) EBS最適化オプション (1) ec2 (7) ElasticBeanstalk (1) Geo Routing (1) Gitlab (1) HA (1) infrastructure-as-code (1) keypair (1) load-balancer (1) nginx (2) OpenAM (3) Rancher (8) Rekognition (2) Route53 (3) s3 (2) secrets (1) security-group (1) Terraform (6) terragrunt (2) tfvars (1) variable (1) vault (1) VPC (1) wordpress (3) アプリケーション (1) オンプレミス (2) クラウド (2) サインアップ (1) シングルサインオン (3) セキュリティ (1) セキュリティグループ (1) ネットワーク設計 (1) 人工知能 (2) 初心者 (1) 本番運用 (1) 画像認識 (3) 起動 (1)
アーカイブ
  • 2022年9月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2017年7月
  • 2017年6月
AWSエンジニア積極採用!
採用情報
フリーランスの求人情報!
テックブレイン

スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。

スーパーソフトウエアはRancherパートナーネットワークのコンサルティングパートナーです。

logo

カプセルクラウドはAWSクラウドのマネージドサービスです。AWSを安心かつ迅速に導入し、負荷分散・セキュリティ・DevOps・コスト削減など、クラウドサービスのメリットを活かした豊富なベストプラクティスをご提供いたします。

Contents

  • サービス
  • 導入支援
  • WordPress
  • 導入事例
  • ブログ
  • Q&A
  • お問い合せ
  • 資料ダウンロード

お問い合わせ

株式会社スーパーソフトウエア
東京 03-6721-7105
大阪 06-4707-6001
info-capsulecloud@tokyo.supersoftware.co.jp

  • プライバシーポリシー
  • 免責事項
  • 契約約款
  • 特商法に基づく表記
  • 会社情報
  • サイトマップ

© Supersoftware 2017. All rights reserved.

目次