Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

20
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ใ€Terraformใ€‘state็ฎก็†ๆ–นๆณ•ใพใจใ‚๏ผˆstateใŒๅข—ใˆใŸใจใใซ่€ƒใˆใ‚‹ในใใ“ใจ / modulesใƒปbackend-configใƒปworkspacesใƒปTerragrunt๏ผ‰

Last updated at Posted at 2025-12-23

็’ฐๅขƒใŒๅข—ใˆใฆใใŸใจใใฏใ‚‚ใกใ‚ใ‚“ใ€ใƒชใ‚ฝใƒผใ‚น้–“ใฎๅฝฑ้Ÿฟๅบฆใ‚’ๆธ›ใ‚‰ใ™ใŸใ‚ใซstateใ‚’ๅˆ†ๅ‰ฒใ™ใ‚‹ใจใ„ใ†ใฎใฏTerraformใ‚’ๅˆฉ็”จใ—ใฆใ„ใ‚‹ใจใ‚ˆใใ‚ใ‚‹ใ“ใจใ ใจๆ€ใ„ใพใ™ใ€‚

ใ“ใฎstateใŒๅข—ใˆใŸใจใใฎๅ•้กŒใซๅฏพๅ‡ฆใ™ใ‚‹ใŸใ‚ใ€state็ฎก็†ใฎๆ–นๆณ•ใ‚’ใพใจใ‚ใฆใฟใพใ—ใŸใ€‚ใœใฒๅ‚่€ƒใซใ—ใฆใฟใฆใใ ใ•ใ„:clipboard:

stateใŒๅข—ใˆใ‚‹ใจ่ตทใใ‚‹ใ“ใจ

ใพใšใ€ใใ‚‚ใใ‚‚ไฝ•ใŒ่ตทใใ‚‹ใญใ‚“ใจใ„ใ†ๆ–นใ‚‚ใ„ใ‚‹ใ‹ใจๆ€ใ†ใฎใงใ€ใใ“ใ‹ใ‚‰่งฃ่ชฌใ—ใพใ™ใ€‚

ไพ‹ใˆใฐ็’ฐๅขƒใ‚’่ค‡ๆ•ฐไฝœใ‚‹ๅ ดๅˆใ€moduleใ‚’ไฝฟใˆใฐmain.tfใฏๅ…ฑ้€šๅŒ–ใงใใพใ™ใŒใ€provider.tfใ€backend.tfใ€terraform.tfใชใฉใฎ่จญๅฎšใฏใ€stateใ‚’ๆŒใค็’ฐๅขƒใ”ใจใซ็”จๆ„ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

็ต่ซ–

็ต่ซ–ใ‹ใ‚‰ๆ›ธใใพใ™ใ€‚

็ฎก็†ๆ–นๆณ•ใฏใ‚ฟใ‚คใƒˆใƒซใฎ้€šใ‚Šใ€modulesใ€backend-configใ€workspacesใ€Terragruntใฎ4ใคใงๆฏ”่ผƒใ—ใฆใฟใพใ—ใŸใ€‚

ไธŠ่จ˜4ใคใฎๆฏ”่ผƒ็ตๆžœใ€ๅŸบๆœฌใฏmodulesใฎใฟใฎ้‹็”จใงใ„ใ„ใจๆ€ใ„ใพใ—ใŸใ€‚ใใฎไธŠใง็’ฐๅขƒใŒๅคง้‡ใซๅข—ใˆใ‚‹ใ“ใจใจใ€็’ฐๅขƒๅทฎๅˆ†ใŒใ‚ใ‚‹็จ‹ๅบฆ่ฆ‹่พผใ‚ใ‚‹ใฎใงใ‚ใ‚Œใฐใ€Terragruntใ‚’ๅฐŽๅ…ฅใ—ใฆใ‚‚ใ„ใ„ใ ใ‚ใ†ใจใ„ใ†ใฎใŒ็งใฎ็ต่ซ–ใงใ™ใ€‚

backend-configใ‚„workspacesใฏไฝฟใˆใชใ„ใจใ„ใ†ใ“ใจใฏใชใ„ใ‚‚ใฎใฎใ€ๅˆฉ็”จใ‚ทใƒผใƒณใฏใ‹ใชใ‚Š้™ๅฎšใ•ใ‚Œใ‚‹ใ‹ใชใจๆ€ใ„ใพใ™ใ€‚

ๆฏ”่ผƒ่กจ

ไฝœใฃใฆใฟใพใ—ใŸใ€‚

  • rootๅ…ฑ้€šๅŒ–๏ผšroot moduleใงใ„ใ‹ใซๅŒใ˜ใ‚ณใƒผใƒ‰ใ‚’ๆ›ธใ‹ใชใ„๏ผˆDRY๏ผ‰ใงๆธˆใ‚€ใ‹
  • ใ‚ณใƒผใƒ‰้‡๏ผš็ด”็ฒ‹ใชใ‚ณใƒผใƒ‰้‡ใŒๅฐ‘ใชใๆธˆใ‚“ใงใ„ใ‚‹ใ‹
  • ่‡ช็”ฑๅบฆ๏ผšๅ…ฑ้€šๅŒ–ใ™ใ‚‹ใ“ใจใงๅคฑใ‚ใ‚Œใ‚‹่‡ช็”ฑๅบฆ / ใพใŸใฏใใฎ่‡ช็”ฑๅบฆใ‚’ๅˆฉ็”จใ™ใ‚‹ใŸใ‚ใฎๆ‰‹้–“
้ …็›ฎ modules backend-config workspaces Terragrunt
rootๅ…ฑ้€šๅŒ– ร— โ–ณ โ—ฏ โ—ฏ
ใ‚ณใƒผใƒ‰้‡ ร— โ–ณ โ—ฏ โ–ณ
่‡ช็”ฑๅบฆ โ—ฏ ร— โ–ณ โ–ณ

็ฎก็†ๆ–นๆณ•

ใงใฏๅฎŸ้š›ใซ4ใคใฎ็ฎก็†ๆ–นๆณ•ใงใ‚ใ‚‹ใ€modulesใ€backend-configใ€workspacesใ€Terragruntใ‚’็ขบ่ชใ—ใฆใ„ใใพใ—ใ‚‡ใ†ใ€‚

ไปŠๅ›žไฝฟใฃใŸใ‚ณใƒผใƒ‰ใฏใ“ใกใ‚‰ใฎใƒชใƒใ‚ธใƒˆใƒชใง็ขบ่ชใงใใพใ™ใ€‚

modules

ใพใšใฏmodulesใ‹ใ‚‰ใงใ™ใ€‚ใ“ใ‚Œใฏ็ฎก็†ๆ–นๆณ•ใจใ„ใ†ใ‹ใ™ในใฆใฎๅŸบๆบ–ใซใชใ‚‹ใ€ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฟใŸใ„ใชใ‚‚ใฎใ ใจๆ€ใฃใฆใใ ใ•ใ„ใ€‚ๅพŒ่ฟฐใฎ็ฎก็†ๆ–นๆณ•ใŒใ‚คใƒกใƒผใ‚ธใ—ใ‚„ใ™ใใชใ‚‹ใ‚ˆใ†ใซใ‚ใˆใฆๆ›ธใ„ใฆใŠใใพใ™ใ€‚

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๆง‹ๆˆ

.
โ”œโ”€โ”€ env1
โ”‚   โ”œโ”€โ”€ main.tf
โ”‚   โ”œโ”€โ”€ provider.tf
โ”‚   โ”œโ”€โ”€ terraform.tf
โ”‚   โ””โ”€โ”€ terraform.tfstate
โ”œโ”€โ”€ env2
โ”‚   โ”œโ”€โ”€ main.tf
โ”‚   โ”œโ”€โ”€ provider.tf
โ”‚   โ”œโ”€โ”€ terraform.tf
โ”‚   โ””โ”€โ”€ terraform.tfstate
โ””โ”€โ”€ modules
    โ””โ”€โ”€ s3-bucket
        โ”œโ”€โ”€ main.tf
        โ””โ”€โ”€ variables.tf

ใ€ŒstateใŒๅข—ใˆใ‚‹ใจ่ตทใใ‚‹ใ“ใจใ€ใง่งฃ่ชฌใ—ใŸ้€šใ‚Šใ€ใ„ใใคใ‹ใฎใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒ้‡่ค‡ใ—ใฆใ—ใพใฃใฆใ„ใพใ™ใ€‚ใพใŸใ“ใ‚Œใ‚‰ใฏไธญ่บซใŒใพใฃใŸใๅŒใ˜ใƒ•ใ‚กใ‚คใƒซใงใ™ใ€‚ๅฎŸ้š›ใซใฏenv้…ไธ‹ใซ.terraformใŒใ‚ใฃใฆใใ“ใซๅคงๅฎน้‡ใฎproviderใฎใƒ•ใ‚กใ‚คใƒซใŒๅญ˜ๅœจใ—ใพใ™ใ€‚

backend-config

ๆฌกใฏbackend-configใงใ™ใ€‚ใ“ใ‚Œใฏinitใ™ใ‚Œใฐstateใ‚’่‡ช็”ฑใซๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹ใ“ใจใŒใงใใ‚‹ๆฉŸ่ƒฝใงใ™ใ€‚

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช

.
โ”œโ”€โ”€ backend.tf
โ”œโ”€โ”€ backends
โ”‚   โ”œโ”€โ”€ bucket_1.backend
โ”‚   โ””โ”€โ”€ bucket_2.backend
โ”œโ”€โ”€ main.tf
โ”œโ”€โ”€ provider.tf
โ”œโ”€โ”€ terraform.tf
โ”œโ”€โ”€ terraform.tfstate.d
โ”œโ”€โ”€ tfstate
โ”‚   โ”œโ”€โ”€ bucket_1.tfstate
โ”‚   โ””โ”€โ”€ bucket_2.tfstate
โ”œโ”€โ”€ tfvars
โ”‚   โ”œโ”€โ”€ bucket_1.tfvars
โ”‚   โ””โ”€โ”€ bucket_2.tfvars
โ””โ”€โ”€ variables.tf

ใ‚ณใƒžใƒณใƒ‰

terraform init -backend-config=backends/bucket_1.backend
terraform apply -var-file=tfvars/bucket_1.tfvars

tfvarsใ‚’ๆŒใคใจใƒ•ใ‚กใ‚คใƒซใ‚’2ใคไฝœใ‚‰ใชใ„ใจใ„ใ‘ใชใ„ใ—ใ€ใ‚ณใƒžใƒณใƒ‰ๅ†…ใงใ‚‚ใƒ•ใ‚กใ‚คใƒซๆŒ‡ๅฎšใŒๅฟ…่ฆใซใชใ‚‹ใฎใงใ‚ใพใ‚Šใ„ใ„ใจใฏ่จ€ใˆใชใ•ใใ†ใงใ™ใ€‚้€†ใซ่จ€ใˆใฐๅค‰ๆ•ฐใ‚’ๆŒใŸใชใ„ๅฎŒๅ…จๅŒไธ€ใฎ็’ฐๅขƒใ‚’่ค‡่ฃฝใ—ใŸใ‚Šใ™ใ‚‹ใฎใงใ‚ใ‚Œใฐใ€ไฝฟใฃใฆใ‚‚ใ‚ˆใ•ใใ†ใงใ™ใ€‚

workspaces

ๅ‰ๆใจใ—ใฆใ€็’ฐๅขƒใ‚’ใใฃใกใ‚Šๅˆ†ใ‘ใŸใ„็”จ้€”ใซใฏๅ‘ใ‹ใชใ„ใฎใงใ€ใƒฉใ‚คใƒˆใซไฝฟใ†ใ‚‚ใฎใ ใจ่€ƒใˆใพใ—ใ‚‡ใ†ใ€‚

้‡่ฆ:ใƒฏใƒผใ‚ฏใ‚นใƒšใƒผใ‚นใฏใ€ใ‚ทใ‚นใƒ†ใƒ ใฎๅˆ†่งฃใ‚„ใ€ๅ€‹ๅˆฅใฎ่ช่จผๆƒ…ๅ ฑใจใ‚ขใ‚ฏใ‚ปใ‚นๅˆถๅพกใ‚’ๅฟ…่ฆใจใ™ใ‚‹ใƒ‡ใƒ—ใƒญใ‚คใƒกใƒณใƒˆใซใฏ้ฉใ—ใฆใ„ใพใ›ใ‚“ใ€‚่ฉณ็ดฐใจๆŽจๅฅจใ•ใ‚Œใ‚‹ไปฃๆ›ฟๆ‰‹ๆฎตใซใคใ„ใฆใฏใ€Terraform CLI ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฎใ€Œใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใ€ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช

.
โ”œโ”€โ”€ backend.tf
โ”œโ”€โ”€ main.tf
โ”œโ”€โ”€ provider.tf
โ”œโ”€โ”€ terraform.tf
โ”œโ”€โ”€ terraform.tfstate.d
โ”‚   โ”œโ”€โ”€ 3
โ”‚   โ”‚   โ””โ”€โ”€ terraform.tfstate
โ”‚   โ””โ”€โ”€ 4
โ”‚       โ””โ”€โ”€ terraform.tfstate
โ”œโ”€โ”€ tfvars
โ”‚   โ”œโ”€โ”€ bucket_3.tfvars
โ”‚   โ””โ”€โ”€ bucket_4.tfvars
โ””โ”€โ”€ variables.tf

ใ‚ณใƒžใƒณใƒ‰

terraform init
terraform workspace new 3
terraform workspace select 3
terraform apply -var-file=tfvars/bucket_3.tfvars

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚„ใ‚ณใƒžใƒณใƒ‰ใฏใ€ใ‚ใ‹ใ‚Šใ‚„ใ™ใใฆ็ถบ้บ—ใชใ ใ‘ใซๆƒœใ—ใ„ใงใ™ใญใ€‚ไฝฟใ„ๅ‹ๆ‰‹่‡ชไฝ“ใฏใ‚ˆใ•ใใ†ใชใฎใงใ€ๅ€‹ไบบใงไฝฟใฃใŸใ‚Šใ€ใ‚ตใƒผใƒ“ใ‚นใจใ—ใฆ้‹็”จใ—ใชใ„ใ‚‚ใฎใชใฉใซใฏไฝฟใฃใฆใ„ใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚

Terragrunt

Terragruntใฏไป–ใฎ็ฎก็†ๆ–นๆณ•ใจใฏๅฐ‘ใ—ๆฏ›่‰ฒใŒ้•ใฃใฆใ„ใฆใ€ใพใšใ‚คใƒณใ‚นใƒˆใƒผใƒซใŒๅฟ…่ฆใงใ™ใ€‚ใพใŸ่จ˜่ฟฐใฎไป•ๆ–นใ‚‚็‹ฌ็‰นใชใ‚‚ใฎใซใชใฃใฆใ„ใ‚‹ใฎใงใ€ใใฎ็†่งฃใ‚‚ๅฟ…่ฆใซใชใ‚Šใพใ™ใ€‚

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช

.
โ”œโ”€โ”€ bucket_5
โ”‚   โ””โ”€โ”€ terragrunt.hcl
โ”œโ”€โ”€ bucket_6
โ”‚   โ””โ”€โ”€ terragrunt.hcl
โ”œโ”€โ”€ modules
โ”‚   โ””โ”€โ”€ s3-bucket
โ”‚       โ”œโ”€โ”€ main.tf
โ”‚       โ””โ”€โ”€ variables.tf
โ””โ”€โ”€ root.hcl

ใ‚ณใƒžใƒณใƒ‰

# ็’ฐๅขƒๅ˜ไฝ“
terragrunt init
terragrunt apply

# ็’ฐๅขƒๅ…จไฝ“
terragrunt run-all init
terragrunt run-all apply

Terragruntใ‚‚ๆง‹ๆˆใ‚„ใ‚ณใƒžใƒณใƒ‰ใฏใ‚ทใƒณใƒ—ใƒซใงใ™ใ€‚ๅ…ฑ้€šๅŒ–ใ•ใ‚ŒใŸใ‚‚ใฎใฏroot.hclใ€ๅ›บๆœ‰ใฎๅค‰ๆ•ฐใชใฉใฏterragrunt.hclใซๆ›ธใ„ใฆใ„ใพใ™ใ€‚ใพใŸใ€run-allใง็’ฐๅขƒไธ€ๆ‹ฌๆ“ไฝœใ‚‚ใงใใŸใ‚Šใ—ใพใ™ใ€‚

ใŸใ ใ€ใ‚ณใƒผใƒ‰ใฎไธญ่บซใŒๅฐ‘ใ—็‹ฌ็‰นใชใฎใงๅฎŸ้š›ใซใฟใฆใฟใพใ—ใ‚‡ใ†ใ€‚

root.hcl
remote_state {
  backend = "local"
  config = {
    path = "${path_relative_to_include()}/terraform.tfstate"
  }
}

# ใƒ—ใƒญใƒใ‚คใƒ€ใƒผใ‚ญใƒฃใƒƒใ‚ทใƒฅใฎๅ…ฑๆœ‰่จญๅฎš
terraform {
  extra_arguments "plugin_cache" {
    commands = [
      "init",
      "plan",
      "apply",
      "destroy",
    ]
    
    env_vars = {
      TF_PLUGIN_CACHE_DIR = "${get_parent_terragrunt_dir()}/.terraform-plugin-cache"
    }
  }
}

generate "versions" {
  path      = "versions.tf"
  if_exists = "overwrite"
  contents  = <<-EOT
    terraform {
      required_version = "= 1.14.0"
      
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "6.23.0"
        }
      }
      
      backend "local" {}
    }
  EOT
}

generate "provider" {
  path      = "provider.tf"
  if_exists = "overwrite"
  contents  = <<-EOT
    provider "aws" {
      region  = "ap-northeast-1"
      profile = "test-profile"
    }
  EOT
}
terragrunt.hcl
include "root" {
  path = find_in_parent_folders("root.hcl")
}

terraform {
  source = "../modules/s3-bucket"
}

inputs = {
  name = "5"
}

ใŠใ‚ใ‹ใ‚Šใ„ใŸใ ใ‘ใŸใงใ—ใ‚‡ใ†ใ‹ใ€‚EOTใŒใ‚ใฃใŸใ‚Šใ—ใฆๅฐ‘ใ—ใ‚ฏใ‚ปใŒใ‚ใ‚Šใพใ™ใ€‚ใพใŸใ€providerใƒใ‚คใƒŠใƒชใฎๅ…ฑๆœ‰ใซใฏใ€ใ‚ณใƒกใƒณใƒˆใ‚ขใ‚ฆใƒˆใฎ# ใƒ—ใƒญใƒใ‚คใƒ€ใƒผใ‚ญใƒฃใƒƒใ‚ทใƒฅใฎๅ…ฑๆœ‰่จญๅฎš็ฎ‡ๆ‰€ใฎ่จ˜่ฟฐใŒๅฟ…่ฆใงใ—ใŸใ€‚

ไปฅไธŠใงใ™๏ผ็ต่ซ–ใฏๅ†’้ ญใซ่จ˜่ฟฐใ—ใŸใฎใงใ“ใ“ใพใง่ชญใ‚“ใ ใ‚‰ใ€ๆ”นใ‚ใฆ็ต่ซ–ใ‚’่ชญใ‚“ใงใ„ใŸใ ใ‘ใ‚Œใฐใจๆ€ใ„ใพใ™ใ€‚

ๆœฌ่จ˜ไบ‹ใง่จ˜่ผ‰ใ—ใŸ็ฎก็†ๆ–นๆณ•ใ‚’็†่งฃใ—ใฆใ€่‡ชๅˆ†ใฎ็’ฐๅขƒใซ้ฉๅˆ‡ใชstate็ฎก็†ๆ–นๆณ•ใ‚’้ธๆŠžใ—ใพใ—ใ‚‡ใ†:clipboard:

โ€ป ่ฃœ่ถณ / Terraform Stacks

HCP Terraformใงใ‚ใ‚Œใฐใ€Terraform Stacksใจใ„ใ†ใฎใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ๅ‚่€ƒใพใงใซใ€‚

20
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

@hiyanger's pickup articles

hiyanger

@hiyanger

@iret | 24-25 Japan AWS Top Engineer / 24-25 AWS Community Builder / 23-25 AWS All Certifications / 25 HashiCorp Ambassador | ้‹ๅ–ถ #jawsug_tochigi #cloud_shokudo
iret
ใ‚ขใ‚คใƒฌใƒƒใƒˆใฏใ€ใ‚ทใ‚นใƒ†ใƒ ใƒปใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใฎ้–‹็™บใ€ใ‚ฐใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏใƒปUI/UXใƒ‡ใ‚ถใ‚คใƒณๅˆถไฝœใ‹ใ‚‰ใ‚คใƒณใƒ•ใƒฉใฎๆง‹็ฏ‰ใƒป้‹็”จใพใงใ‚’ใƒฏใƒณใ‚นใƒˆใƒƒใƒ—ใงๆไพ›ใ—ใฆใ„ใพใ™ใ€‚ ๅฎŸ็ธพใƒป็ตŒ้จ“ใŒ่ฑŠๅฏŒใชใƒ‡ใ‚ถใ‚คใƒŠใƒผใ‚„ใ‚ทใ‚นใƒ†ใƒ ใ‚จใƒณใ‚ธใƒ‹ใ‚ขใŒใ€ใ‚ใ‚‰ใ‚†ใ‚‹ๅด้ขใ‹ใ‚‰ใŠๅฎขๆง˜ใฎ่ชฒ้กŒใซๅ‘ใๅˆใ„ใ€ใŠๅฎขๆง˜ใซๅฏ„ใ‚ŠๆทปใฃใŸใ‚ตใƒผใƒ“ใ‚นใ‚’ๆไพ›ใ—ใฆใ„ใพใ™ใ€‚

Today's trending articles

katohiro_fi

ITๆฅญ็•Œใซ่”“ๅปถใ™ใ‚‹ใ€ŽใƒŠใƒณใƒ‹ใƒ‡ใƒขPMใ€ ใใ‚Œใ€ๆœฌๅฝ“ใซใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใƒžใƒใ‚ธใƒกใƒณใƒˆ๏ผŸ

2026ๅนด!ๅˆใ‚ขใ‚ฆใƒˆใƒ—ใƒƒใƒˆใ‚’ใ—ใ‚ˆใ†
minorun365

Amplify ๏ผ† AgentCoreใง็ถญๆŒ่ฒปๆฟ€ๅฎ‰๏ผ ็Ž‹้“ใƒ•ใƒซใ‚นใ‚ฟใƒƒใ‚ฏใชAIใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’็ฐกๅ˜ๆง‹็ฏ‰ใ—ใ‚ˆใ†

Comments

No comments

Let's comment your feelings that are more than good

Being held Article posting campaign

20
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address