1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

terraform管理下にないインフラをterraformingしようとする場合に遭遇しやすい(?)Plan error : Resource 'data.terraform_remote_state.not_immutable' does not have attribute 'vpc-xxx-yyy' for variable 'data.terraform_remote_state.not_immutable.vpc-xxx-yyy'

Posted at

TL;DR

terraform管理下にないインフラをterraformingしようとする場合、
いわゆるStagingなどと呼ばれる環境で本番稼働環境を再現してから、本番環境に適用したいと思うわけです。
VPCやSubnetのような、壊すと大変なnot immutableなりソースはterraform importを駆使して、現行環境を壊さないよう、そーーーっとterraform管理下に引き込みます。(いずれQiita書く)
そしていざimmutableなりソースを--targetオプションを使いながら、ひとつひとつ本番環境に適用する際に遭遇しがちな下記エラー

$ terraform plan -out=apply.plan --target=module.compute.hoge.fuga

..(snip)..

Error: Error running plan: 1 error(s) occurred:

* module.compute.var.vpc-xxx-yyy: Resource 'data.terraform_remote_state.not_immutable' does not have attribute 'vpc-xxx-yyy' for variable 'data.terraform_remote_state.not_immutable.vpc-xxx-yyy'

を(強引に)解決するお話。

issueもあがっております。
https://github.com/hashicorp/terraform/issues/12316

環境

$ terraform version
Terraform v0.10.8

ディレクトリ構成

Terraform Best Practices in 2017

immutableなリソースから、VPCなどのnot immutableなリソースのremote stateを参照しています。

backend.tf
data "terraform_remote_state" "not_immutable" {
  backend = "s3"
  config {
    bucket = "bucket_name"
    key    = "env:/${terraform.env}/tfstate/not_immutable/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

対処方法

必要なresource定義を、手で書く or Stagingなどのterraform化検証環境のtfstateからコピペして、リソースIDを本番環境のものに書き換える

まずは最新のtfstateをremoteからpull。

$ terraform state pull > ./terraform.tfstate.d/$(terraform workspace show)/terraform.tfstate

./terraform.tfstate.d/$(terraform workspace show)/terraform.tfstate
に必要なリソースを追記。

terraform.tfstateより抜粋
            "resources": {
                "data.terraform_remote_state.not_immutable": {
                    "type": "terraform_remote_state",
                    "depends_on": [],
                    "primary": {
                        "id": "2017-11-15 02:25:07.174946468 +0000 UTC",
                        "attributes": {
                            "backend": "s3",
            ..(snip)..
                            "config.%": "3",
                            "config.bucket": "bucket_name",
                            "config.key": "env:/prod/tfstate/not_immutable/terraform.tfstate",
                            "config.region": "ap-northeast-1",
                            "environment": "default",
                            "id": "2017-11-15 02:25:07.174946468 +0000 UTC",
                            "vpc-xxx-yyy.%": "5",
### 今回はここから
                            "vpc-xxx-yyy.subnet-private-a": "subnet-pra",
                            "vpc-xxx-yyy.subnet-private-c": "subnet-prc",
                            "vpc-xxx-yyy.subnet-public-a": "subnet-pua",
                            "vpc-xxx-yyy.subnet-public-c": "subnet-puc",
                            "vpc-xxx-yyy.vpc_id": "vpc-xxx-yyy-id"
### ここまでのresource idを本番環境のものに書き換えました。
                        },
                        "meta": {},
                        "tainted": false
                    },
                    "deposed": [],
                    "provider": ""
                }
            },

tfstateをremoteへpush。

$ terraform state push ./terraform.tfstate.d/$(terraform workspace show)/terraform.tfstate

そして再度terraform plan。

$ terraform plan -out=apply.plan --target=module.compute.hoge.fuga

..(snip)..

Plan: X to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

This plan was saved to: apply.plan

To perform exactly these actions, run the following command to apply:
    terraform apply "apply.plan"

エラーは消えました。
めでたしめでたし。

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?