2017-01-14 8 views
4

私たちは、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に「正当な」方法がありますか?

+0

「**ステップ1:VPCを作成してください。**」ではどのディレクトリにいますか?それは 'projects/top-level-project-name-goes-here/env-dev/vpc /'ですか? 'projects/top-level-project-name-goes-here/env-dev/test'のモジュール" cassandra "ですか? –

+0

私たちのラッパーシェルスクリプトは、現在の "ターゲット"プロジェクト(VPCまたはCassandraなど)の内容をtmp/projectフォルダにコピーします。これはVPCの作業ディレクトリになります。step1: a) 'cp projects /.../vpc/*.*/tmp/project/'そしてb)' cd/tmp/projects'を実行した後、最初にterraformのリモート状態を取得してから、適切な「テラフォーム計画|適用|破壊」。だから最初から始めますが、作業フォルダは '/ tmp/project'です。 – gevgev

+0

あなたのterraform_remote_stateデータソースであなたのバケットのキーをチェックしたいと思います。少なくとも私たちのもののファイル名は "terraform.tfstate"で、 "​​.json"のようなものではありません。 また、キーとバケットは異なることがあります。私はキーとバケットの名前を与えないためにそこに 'xxx'を入れていると思います。 – jpancoast

答えて

0
設定リモート状態のためのコマンド

てみ使用:私はシェルスクリプトset-remote-tf.shとしてそれを使用して

terraform_bucket_region='eu-west-1' 
terraform_bucket_name='xxx' 
terraform_file_name="terraform.tfstate" 

export AWS_ACCESS_KEY_ID="xxx" 
export AWS_SECRET_ACCESS_KEY="xxx" 

[ -d .terraform ] && rm -rf .terraform 
[ -f terraform.tfstate.backup ] && rm terraform.tfstate.backup 
terraform remote config -backend=S3 -backend-config="region=${terraform_bucket_region}" -backend-config="bucket=${terraform_bucket_name}" -backend-config="key=${terraform_file_name}" 
terraform get