2017-10-06 5 views
0

Terraform v0.10.7モジュールのTerraformリモートステート構成

私はDevOpsチームのためにテラフォームモジュールをまとめています。私たちが使用しているコンポーネントごとに別々のモジュールがあり、異なる環境と要件のモジュールを使用してスタック全体が作成されます。次のように

ディレクトリ階層は次のとおりです。

Terraform 
    - modules 
    - module-1 (main.tf, vars.tf, outputs.tf, backend.tf) 
    - module-2 (main.tf, vars.tf, outputs.tf, backend.tf) 
    - module-3 (main.tf, vars.tf, outputs.tf, backend.tf) 
    ... 
    - environments 
    - qa (main.tf, vars.tf, outputs.tf, bakend.tf) 
    - stage (main.tf, vars.tf, outputs.tf, bakend.tf) 
    - prod (main.tf, vars.tf, outputs.tf, bakend.tf) 

backend.tf では、私はS3と/resources/mod-1/terraform.tfstate完全な階層としてバックエンドを指定しています。同じことが環境のbackend.tfにも当てはまります。

任意の環境にterraform getとを入力すると、指定されたモジュールがすべて取得され、AWSインフラストラクチャに変更が適用され、そのenvのterraform.tfstateがS3の指定された場所に保存されます。

環境に使用されているすべてのモジュールについて、terraform.tfstateも生成され、S3にプッシュされます(envに1回適用されます)。 私はterraform applyをどのモジュールにも実行していません。

私はそれらのモジュールに適用され、複数を与えないようにしたいS3からすると同時に、これらのモジュールのterraform.tfstateからいくつかのデータを使用し、環境に単一terraform applyを与えるために計画を持っています。これはどのように達成できますか?

答えて

0

まず、各環境に同じ*.tfファイルを書き直す必要はないと思います。したがって、各アプリケーションのために、あなたは、ファイル構造の下に持っている必要があり、モジュールが調達されるに依存します(あなたがAWSを使用している場合)/backend.confで

Application-1 
    - modules-1.tf 
    - modules-2.tf 
    - modules-3.tf 
    - main.tf, vars.tf, outputs.tf 
    - qa (qa/backend.conf, qa/qa.tfvars) 
    - stag (stag/backend.conf, stag/stag.tfvars) 
    - prod (prod/backend.conf, stag/prod.tfvars) 

を、あなたは

bucket = "<global_unique_bucket_name>" 
key  = "<env>/network.tfstate" 
region = "us-east-1" 
kms_key_id = "alias/terraform" 
encrypt = true 
をS3のバックエンドを定義することができます

第2に、各モジュールにバックエンドは必要ありません(私の理解が正しい場合、バックエンドはtfstateファイルを保存するために使用されます)。上記のようにバックエンドファイルは各環境に存在する必要があります。

第3に、*.tfstateファイルを各環境で定義する必要があります。私は上記のサンプルを<env>/backend.conf

に与えました。次に、テラフォームスタック、VPC /ネットワークレイヤー、データベース/エラスティックレイヤー、アプリケーションレイヤーを管理するレイヤーがあります。したがって、それに応じてスタックリソースをグループ化できます。

+0

詳細な回答ありがとうございます!しかしenvのmain.tfがなければ何を実行しますか?任意のenvの 'main.tf'ファイルはsourceを持つすべてのモジュールを持ちます。したがって、envsの 'main.tf'は、使用するモジュールのリストを持っています(他の' main.tf'モジュールとは異なります)。 はい私はAWSを使用しており、S3をバックエンドとして使用したいと考えています。しかし、バックエンドとしてS3を設定することを許さないTerraformのバグがあり、 'terraform init'の間にrootユーザーであるにもかかわらず' InvalidClientTokenId'と表示されます。 –

+0

AWS APIキーを正しく設定してください(https://www.terraform.io/docs/providers/aws/) – BMW

+0

本当ですか? AWS APIキーを適切に設定せずにどのように私がこの時点で到達したと思いますか? Terraform Git for Openの問題を参照してください。私はもしあれば回避策を​​求めた。 (https:// github。com/terraform-provider/terraform-provider-aws/issues/663#issuecomment-334495683) –

関連する問題