私たちは、S3に格納されたリモート状態でterraformを使用しようとしています。terraformリモート状態
ネットワークのインフラストラクチャ(vpc、サブネット、IGW、NAT、ルートなど)とサブプロジェクトを作成する「メイン」VPCプロジェクトが存在するなど、プロジェクトが壊れています。メインのvpc(サブネット)の先頭、つまりec2ノード。
プロジェクトフォルダ/ファイル:VPCプロジェクト以外
.
├── modules/
│ └── mod-vpc/
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── projects/
│ └── top-level-project-name-goes-here/
│ ├── env-dev/
│ │ ├── globals.tf
│ │ ├── test/
│ │ │ ├── main.tf
│ │ │ └── variables.tf
│ │ └── vpc/
│ │ ├── main.tf
│ │ └── variables.tf
│ └── env-prod/
└── terraform.tfvars
、他のすべてのプロジェクトは、VPCのリモート状態からvpc_id、CIDRなどを使用しています。 ここにプロセスが定義されている方法を示します。
ステップ1:VPCを作成します。
ここでは問題なく、VPCが作成されます、そして出力はプリントアウト、およびS3バケットに格納されています
$ terraform init -backend=s3 -backend-config="region= us-west-2" -backend-config="bucket=xxx" -backend-config="key=xxx" -backend-config="acl=bucket-owner-full-control" $project_path
$ terraform remote pull
$ terraform get $project_path
$ terraform apply
...
Outputs:
cidr_block = 10.198.0.0/16
private_subnet_ids = subnet-d3f5029a,subnet-fbeb369c,subnet-7ad88622
public_subnet_ids = subnet-54f5021d
region = us-west-2
vpc_id = vpc-b31ca3d4
vpc_name = main_vpc
ステップ2:作成し、他のリソース・グループを : VPCリモート状態からの出力値を使用して、すでにプロビジョニングされたパブリックサブネット(上記の手順1のVPCプロジェクトの出力)にec2ノードを配備しようとしています。
$ terraform init -backend=s3 -backend-config="region= us-west-2" -backend-config="bucket=xxx" -backend-config="key=xxx" -backend-config="acl=bucket-owner-full-control" $project_path
$ terraform remote pull
$ terraform get $project_path
$ terraform apply
を/ tmp /プロジェクト/フォルダの内容::
ここでの手順がある/私たちのスクリプトが実行されます(最初の私たちは/ tmpに/プロジェクト/作業フォルダにすべてのファイルをコピーし、スクリプトがこのフォルダ内で実行される)コマンドプロジェクトファイル構造がどのように見えるかここでがある(を/ tmp /プロジェクト/フォルダ内):
resource "aws_instance" "test" {
instance_type = "${var.instance_type}"
ami = "${var.ami}"
subnet_id = "${data.terraform_remote_state.vpc_main.public_subnet_ids}"
vpc_security_group_ids = ["${aws_security_group.http_ext.id}"]
}
:
ここ
├── .terraform
│ ├── modules
│ │ ├── 7d29d4ce6c4f98d8bcaa8b3c0ca4f8f1 -> /pathto/modules/mod-cassandra
│ │ └── aa8ffe05b5d08913f821fdb23ccdfd95
│ └── terraform.tfstate
├── globals.tf
├── main.tf
├── terraform.tfvars
└── variables.tf
はmain.tfファイルは、このプロジェクトのためにどのように見えるかですここ
上記data.terraform_remote_stateリソースの定義は次のとおりです。(どのファイル)我々は異なる結果を得ている「data.terraform_remote_state.vpc_main」リソースを宣言どこに基づき
data "terraform_remote_state" "vpc_main" {
backend = "s3"
config {
region = "us-west-2"
bucket = "xxx"
key = "xxx/vpc.json"
}
}
:
オプション1 "test"プロジェクト(= main.tf)内の同じファイルに "data.terraform_remote_state"が宣言されていれば、すべてが正常に実行されます。
オプション2 我々は(=」globals.tf」)別のファイルにdata.terraform_remote_state.vpc_mainを移動した場合、我々は[テラフォームGET $ PROJECT_PATH]ステップの実行中にこのエラーが表示されます。
テラフォームが何らかの理由でこのdata.terraform_remote_state.vpc_mainリソースを解決することができなかったことを指摘$ terraform init -backend=s3 -backend-config="region= us-west-2" -backend-config="bucket=xxx" -backend-config="key=xxx" -backend-config="acl=bucket-owner-full-control" $project_path
$ terraform remote pull
$ terraform get $project_path
Error loading Terraform: module root: 4 error(s) occurred:
* module 'cassandra': unknown resource 'data.terraform_remote_state.vpc_main' referenced in variable data.terraform_remote_state.vpc_main.cidr_block
* module 'cassandra': unknown resource 'data.terraform_remote_state.vpc_main' referenced in variable data.terraform_remote_state.vpc_main.region
* module 'cassandra': unknown resource 'data.terraform_remote_state.vpc_main' referenced in variable data.terraform_remote_state.vpc_main.vpc_id
* module 'cassandra': unknown resource 'data.terraform_remote_state.vpc_main' referenced in variable data.terraform_remote_state.vpc_main.public_subnet_ids
。
オプション3. しかし、テスト目的のために、我々は(「globals.tf」にし、「main.tf」で)両方の宣言を有効にすると、我々は[を適用テラフォーム]の実行中にこのエラーが出ますステップ:
$ terraform init -backend=s3 -backend-config="region= us-west-2" -backend-config="bucket=xxx" -backend-config="key=xxx" -backend-config="acl=bucket-owner-full-control" $project_path
$ terraform remote pull
$ terraform get $project_path
$ terraform apply
module root: 1 error(s) occurred:
2017/01/14 14:02:50 [DEBUG] plugin: waiting for all plugin processes to complete...
• data.terraform_remote_state.vpc_main: resource repeated multiple times
これは、2つの場所で同じリソースが定義されているため、有効なエラーです。
しかし、なぜこのリソースを上記のオプション2の別のファイルに入れようとしたとき、Terraformはこのリソースを適切に解決できませんでしたか?テラフォームのドキュメント毎
すべて* .tfファイルがアルファベット順にロードされ、添付されており、テラフォームの構成は、宣言されているとして、リソース宣言の順序は、重要ではありません。
https://www.terraform.io/docs/configuration/load.html
ではないと思われます上記の場合。
ここでは「ハードコードされた」アプローチを使用できますが、この作業を行うにはTerraformに「正当な」方法がありますか?
「**ステップ1:VPCを作成してください。**」ではどのディレクトリにいますか?それは 'projects/top-level-project-name-goes-here/env-dev/vpc /'ですか? 'projects/top-level-project-name-goes-here/env-dev/test'のモジュール" cassandra "ですか? –
私たちのラッパーシェルスクリプトは、現在の "ターゲット"プロジェクト(VPCまたはCassandraなど)の内容をtmp/projectフォルダにコピーします。これはVPCの作業ディレクトリになります。step1: a) 'cp projects /.../vpc/*.*/tmp/project/'そしてb)' cd/tmp/projects'を実行した後、最初にterraformのリモート状態を取得してから、適切な「テラフォーム計画|適用|破壊」。だから最初から始めますが、作業フォルダは '/ tmp/project'です。 – gevgev
あなたのterraform_remote_stateデータソースであなたのバケットのキーをチェックしたいと思います。少なくとも私たちのもののファイル名は "terraform.tfstate"で、 ".json"のようなものではありません。 また、キーとバケットは異なることがあります。私はキーとバケットの名前を与えないためにそこに 'xxx'を入れていると思います。 – jpancoast