web-dev-qa-db-ja.com

Terraform環境固有の変数

環境/ワークスペースが何であるかに基づいてTerraformに変数を設定する方法があるかどうか誰かが知っていますか?できれば

  • var名前空間(つまり、外部データソースではない)にデータを入力します。
  • ラッパーは必要ありません
    • tf(){ terraform --var-file=$(get_tf_env).tfvarsのように
  • 追加の手動ステップ(つまり、terraform envの実行によってトリガーされないステップ)なしで、テラフォームenv/workspaceを変更することで有効になりますか?
8
Rory Browne

Var名前空間にデータを入力し、ラッパーを必要とせず、ワークスペースを変更することで有効になります。

variable "AMI_id" {
  type = "map"

  default = {
    stg = "AMI-foo28929"
    prd = "AMI-bar39b12"
  }
}

image_id = "${lookup(var.AMI_id, terraform.workspace)}"
8
AlexT

Terraformワークスペース

ワークスペースは、Terraform状態の名前付きコンテナーです。複数のワークスペースがある場合、Terraform構成の単一のディレクトリを使用して、インフラストラクチャリソースの複数の異なるセットを管理できます。

Terraformリリースの0.9ラインでは、この概念は「環境」として知られていました。 Terraform自体とTerraformを使用する組織の両方で、「環境」という単語の過負荷によって引き起こされた混乱に関するフィードバックに基づいて、0.10で名前が変更されました。

現在のワークスペースを参照すると、ワークスペースに基づいて動作を変更するのに役立ちます。たとえば、デフォルト以外のワークスペースの場合、小さいクラスターサイズをスピンアップすると便利な場合があります。例えば:

resource "aws_instance" "example" {
  count = "${terraform.workspace == "default" ? var.default : var.min}"

  # ... other arguments
}
4
strongjz

Terraformプロジェクトに「スタック」ベースのアプローチを採用して、「スタック」とワークスペースごとのリモート状態(別名環境)を構成および管理できるようにすることをお勧めします。これにより、リスクの観点から変更の爆発範囲が制限され、ワー​​クフローが簡素化され、よりクリーンで保守性の高いコードベースが提供されます。

あなたの一日をより良くするものは何ですか?

  • プラットフォームとその可動部品について推論できる、客観的にシンプルなデザイン。 (別名スタック)
  • 変更によるリスクを制限しながら柔軟性を提供する実装。 (別名、爆風半径を制限する)
  • 今日の価値を提供し、長期にわたって勢いをつけながら改善を続けるソリューション。 (別名パターン、ワークフロー)

ここにグッドプラクティスのクイックリストがあります

  • 「ワークスペース」全体の「スタック」の「状態」を個別に管理する

  • 「ワークスペース」全体で一貫した「構成」のために「スタック」を実装する

  • 優れた「パターン」と「ワークフロー」を使用して、客観的でシンプルに保ちます。

スタックベースのアプローチを使用したTerraformプロジェクトの例

/
  /scripts
     <Shell scripts>
     <terraform wrapper functions>

  /stacks
    /application_1   # Provisions Application 1 and its dependencies
    /application_2   # Provisions Application 2 and its dependencies
    /application_n   # Provisions Application N and its dependencies
        backend.tf       # Remote State
        data.tf          # Data Sources
        stack.tf         # Stack Variables and Defaults
        aws_resource.tf 
        ...
        ...    
    /network    # Provisions VPC, Subnets, Route Tables, Route53 Zones
    /security   # Provisions Security Groups, Network ACLs, IAM Resources
    /storage    # Provisions Storage Resources like S3, EFS, CDN

  global.tf     # Global Variables
  dev.tfvars    # Development Environment Variables
  tst.tfvars    # Testing Environment Variables
  stg.tfvars    # Staging Environment Variables
  prd.tfvars    # Production Environment Variables
  terraform.sh  # Wrapper Script for Executing Terraform (Workflow)

もう少し考えます

実装が大きくなるにつれて、将来の要件を既存のスタックに組み込むか、共有の依存関係である場合は新しいスタックとして組み込むことがはるかに簡単になります。

Terraformでは、リモート状態をデータソースとして使用できます。スタックごとに独自の出力変数を構成すると、エクスポートされたリソース属性を構成して使用するのがはるかに簡単になります。

スタックレベルで変数と適切なデフォルトを定義できるようにプロジェクトを設定すると、開発、テスト、本番などのさまざまな環境の要件を満たすために、必要に応じてワークスペースレベルでそれらをオーバーライドできます。構成の一貫性とリモート状態は、環境ごとに個別に管理されます。

これらは、AWSプラットフォームを管理するためにTerraformを使用した経験を向上させるために、私たちが開発してチームに展開したプラクティスの一部です。

乾杯!

1
KnownTraveler

私が知っているTerraformでそれを行うネイティブな方法はありません。周りを検索すると、多くの人がTF構成へのエントリポイントのフォルダー構造が異なることがわかります。フォルダーごとに、tfvarsファイルの値が異なる可能性があります。 0.10で導入された Terraform Workspaces を使用する方法のいくつかを取得する可能性のある1つのオプション。

OctopusDeploy を使用して提案しているものと同様の何かを実装しました。これまで使用したことがない場合、Octopusは環境固有の変数の管理に適しています。環境ごとに、デフォルトのtfvarsファイルとOctopus内の対応する変数値のリストがあります。

Tfvars内のすべての変数を反復処理し、同じ名前のOctopus変数を探し、見つかった場合はそれを置き換える基本的な手順があります。

Terraform tfvarsファイル(必要な値)とOctopusの変数値(実際の値)をうまく分離できるので、これは適切な作業方法であることがわかりました。

例えば。を含むtfvarsファイルがある場合

instance_size = "Medium"

そして、私はOctopus内に、ステージングとプロダクションの2つの環境を持っています。 'instance_size'という変数をOctopusに追加し、環境ごとに異なる値を設定できます(たとえば、それぞれ「Big」と「Biggest」)。

私が作成したステップテンプレートは、「instance_size」に対応する値を見つけるので、ステージングのために実行すると、次のようになります。

instance_size = "Big"

と生産のために

instance_size = "Biggest"
1
Fermin