2016-10-06 10 views
1

異なるプロジェクト間で使用されるterraformスクリプトを共有したいと思います。私はモジュールを作成して共有する方法を知っていますが、この設定には大きな煩わしさがあります。スクリプトのモジュールを参照してterraform applyを実行すると、モジュールリソースが存在しない場合は作成されますが、terraform destroyリソースは破壊されます。モジュール依存関係なしでterraformスクリプトを共有する方法

同じモジュールに依存する2つのプロジェクトがあり、そのうちの1つで、terraform destroyと呼びます。モジュールが別のプロジェクトで使用されているため、矛盾した状態になる可能性があります。スクリプトは、リソースを破棄できないか、リソースを破棄して他のプロジェクトに影響を与えるため、失敗する可能性があります。

私のシナリオでは、2つのプロジェクト間でネットワークスクリプトを共有したいので、ネットワークリソースを決して破壊しないようにします。プロジェクトで何らかの方法で参照する必要があるため、このリソースのみのプロジェクトを作成することはできません。そのIDを使用する方法は何であるか分かりません。

もオプションではありません。私は他のリソースを破壊する必要があるため、共有スクリプトリソースです。この構成により、terraform destroyは失敗します。

名前のようにリソースを参照する方法はありますか、あるいは私が欲しいものを達成するための他の方法がありますか?

答えて

4

私が正しくあなたを理解していれば、あなたは "シングルトン"であるいくつかのリソースRを持っています。つまり、RというインスタンスはAWSアカウントに1つしか存在できません。たとえば、「foo.com」という名前のaws_route53_zoneを1つだけ持つことができます。 Rを2つの異なる場所にモジュールとして含めると、terraform applyを実行したときにどちらか一方を作成し、terraform destroyを実行したときにどちらか一方を削除することがあります。これを避けたいのですが、出力属性をRから取得するには何らかの方法が必要です(たとえば、aws_route53_zoneリソースのzone_idリソースはAWSによって生成されるため、推測できません)。

そのような場合は、代わりにモジュールとしてRを使用して、あなたはする必要があります

  1. はテラフォームテンプレートの独自のセットで、それ自体でRを作成します。それらが/terraform/Rの下にあるとしましょう。
  2. /terraform/RRemote Stateを使用するように設定します。

    terraform remote config \ 
        -backend=s3 \ 
        -backend-config="bucket=(YOUR BUCKET NAME)" \ 
        -backend-config="key=terraform.tfstate" \ 
        -backend-config="region=(YOUR BUCKET REGION)" \ 
        -backend-config="encrypt=true" 
    
  3. は、任意の出力があなたの属性を定義します。たとえば、ここにあなたが(示されているようにあなたがバケット名/地域を記入する必要があります)S3バケットに自分のリモート状態を保存するために、これらのテンプレートを設定する方法であります出力変数としてRが必要です。たとえば:あなたは/terraform/Rterraform applyを実行すると

    output "zone_id" { 
        value = "${aws_route_53.example.zone_id}" 
    } 
    
  4. することは、それはS3バケットに、その出力などのテラフォームの状態を保存します。
  5. 出力属性がRである必要がある他のすべてのTerraformテンプレートでは、terraform_remote_state data sourceを使用してS3バケットから取り込むことができます。例えば、あなたがzone_idパラメータを作成することに必要ないくつかのテンプレート/terraform/fooを持っていたとしましょう​​(示されるように、あなたはバケット名/地域を記入する必要があります):

    data "terraform_remote_state" "r" { 
        backend = "s3" 
        config { 
        bucket = "(YOUR BUCKET NAME)" 
        key = "terraform.tfstate"  
        region = "(YOUR BUCKET REGION)" 
        } 
    } 
    
    resource "aws_route53_record" "www" { 
        zone_id = "${data.terraform_remote_state.r.zone_id}" 
        name = "www.foo.com" 
        type = "A" 
        ttl = "300" 
        records = ["${aws_eip.lb.public_ip}"] 
    } 
    
  6. terraform_remote_stateことが読み取りですデータソースのみ。つまり、そのリソースを使用するテンプレートでterraform applyまたはterraform destroyを実行すると、Rには何の効果もありません。詳細情報については

How to manage terraform stateTerraform: Up & Runningをチェックしてください。

+0

うわー!それは本当に素晴らしいアプローチです!リモート状態を取得してデータソースとして使用できるかどうかはわかりませんでした。 –

関連する問題