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

TerragruntでDRYなTerraform

2022 9/16
Terraform
2022年9月16日
目次

はじめに

IaC (Infrastructure as Code) に興味がある人は、おそらくTerraformについて聞いたことがあるかと思います。
様々なクラウドプロバイダーのインフラをコードで宣言的に管理できる優れたツールです。
Terraform単体でも強力な機能を多数持っているのですが、今回はそのTerraformにさらに+αな機能を加えたTerragruntについて触れていきたいと思います。

TerragruntはDevOps as a Serviceを提供しているGruntwork社が公開しているTerraformのラッパーツールです。
「Terraformにこんな機能があったらいいのになー」というものが実装されている感じです。

共通化の全く無いTerraform

まずは共通化が全くされていないプレーンなTerraformを見てみましょう。
ディレクトリ構成は以下のような状態です。

└── live
├── production
│ └── app
│ ├── main.tf
│ └── terraform.tfvars
└── staging
└── app
├── main.tf
└── terraform.tfvars

main.tfの中身は全く同じで↓のようになっています。

variable "instance_count" {
description = "How many servers to run"
}

variable "instance_type" {
description = "What kind of servers to run (e.g. t2.large)"
}

provider "aws" {
region = "ap-northeast-1"
}

resource "aws_instance" "web" {
ami = "ami-afb09dc8"
instance_type = "${var.instance_type}"
count = "${var.instance_count}"
}

stagingでは、環境のレベルを下げ気味でtfvarsにて↓のように定義し

instance_count = 3
instance_type = "t2.micro"

productionではあるべき姿に設定しています↓

instance_count = 10
instance_type = "m2.large"

とりあえずはこの定義でstagingとproductionのインフラを作ることができます。

moduleを使ったDRYなアプローチ

さて、上の例は全くもってDRY(Don’t Repeat Yourself)ではないので、ここでTerraformに標準機能として備わっているmoduleを使って共通化を試みたいと思います。

まずは共通部分を切り出してGithubに置きます。
こうすることで、この共通部分を呼び出したいTerraformのファイルはmoduleとして呼び出せるようになります。
moduleはhttps://github.com/capsulecloud/tf_ec2_sampleに置いてあるものとして、構成としては以下のとおり。

└── app
├── main.tf
└── variables.tf

それぞれのファイルの中身は以下のように分解されています。

# variables.tf
variable "instance_count" {
description = "How many servers to run"
}

variable "instance_type" {
description = "What kind of servers to run (e.g. t2.large)"
}
# main.tf
resource "aws_instance" "web" {
ami = "ami-afb09dc8"
instance_type = "${var.instance_type}"
count = "${var.instance_count}"
}

このようなmoduleが存在している場合、まずディレクトリ構成は以下のようになります。

└── live
├── production
│ └── app
│ └── main.tf
└── staging
└── app
└── main.tf

そして呼び元からは以下のように呼び出すことができます。

# staging
provider "aws" {
region = "ap-northeast-1"
}

module "ec2" {
source = "git::https://github.com/capsulecloud/tf_ec2_sample//app"
instance_type = "t2.micro"
instance_count = "3"
}

# production
provider "aws" {
region = "ap-northeast-1"
}

module "ec2" {
source = "git::https://github.com/capsulecloud/tf_ec2_sample//app"
instance_type = "m2.large"
instance_count = "10"
}

単にこれはec2のmoduleなのでほとんど恩恵がみられません。
しかし、これが大きなmoduleになった場合、この共通化はなかなかな威力を発揮し始めます。

ただ、小さなモジュールだから余計に感じてしまうのですが、providerも冗長ですし、moduleのインプットをハードコードしてるのも微妙です(tfvarsにしていいのですが、それも冗長な感じがしてしまう)。
stagingとproductionでとにかく変えたいのはinstance_typeとinstance_countだけなのです!それ以外には興味が無いのに、毎回書いてしまっています。

TerragruntによるDRYなアプローチ

上の課題をさらに解決してくれるのがTerragruntです。
Terragruntの場合、moduleを作るというより丸っと今までのTerraformのファイルを再利用してしまうイメージです。
なので↓のようにproviderブロックもそのまま入れてしまいます。

# variables.tf
variable "instance_count" {
description = "How many servers to run"
}

variable "instance_type" {
description = "What kind of servers to run (e.g. t2.large)"
}

# main.tf
provider "aws" {
region = "ap-northeast-1"
}

resource "aws_instance" "web" {
ami = "ami-afb09dc8"
instance_type = "${var.instance_type}"
count = "${var.instance_count}"
}

そして、このTerraformを参照する側のディレクトリ構成は↓のようになります。
注目したいのはterraform.tfvarsだけになっている点です。

└── live
├── production
│   └── app
│   └── terraform.tfvars
└── staging
└── app
└── terraform.tfvars

中身は↓のようになっています。
Terragrunt独自のterragruntブロックがあることに注目してください。
ここに共通利用したいTerraformファイルを参照させることができます。
そして標準のterraform.tfvars同様、変数の値も指定できるんです。
これで極限までDRYにもっていけることがわかったと思います。
少々シンプルすぎる例だったので恩恵が伝わりにくい部分もあるかと思いますが、これは確かにqa, staging, productionと分けたい場合には便利だと思います。

# staging
terragrunt = {
terraform {
source = "git::https://github.com/capsulecloud/tf_ec2_sample//app"
}
}

instance_count = 3
instance_type = "t2.micro"

# production
terragrunt = {
terraform {
source = "git::https://github.com/capsulecloud/tf_ec2_sample//app"
}
}

instance_count = 10
instance_type = "m2.large"

おわりに

今回はTerraformのコードをDRYにする方法をTerragruntでご紹介しました。
Terragruntにはまだまだ強力な機能がありますが、他の機能に関してはまた違う機会にでも紹介していきたいと思います。

正社員希望の方はこちら
業務委託希望の方はこちら
Terraform
infrastructure-as-code Terraform terragrunt

関連記事

  • terraform
    Terraformと変数(variable)のお話
  • terraform
    TerragruntでDRYなTerraform Remote State
検索
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.

目次