web-dev-qa-db-ja.com

Terraformで動的リソース名を使用するにはどうすればよいですか?

複数の開発環境と本番環境で同じTerraformテンプレートを使用したいと思います。

私のアプローチ:私が理解しているように、リソース名は一意である必要があり、Teraformはリソースの状態を内部的に格納します。したがって、リソース名に変数を使用しようとしましたが、サポートされていないようです。エラーメッセージが表示されます。

$ terraform plan
var.env1
  Enter a value: abc

Error asking for user input: Error parsing address 'aws_sqs_queue.SqsIntegrationOrderIn${var.env1}': invalid resource address "aws_sqs_queue.SqsIntegrationOrderIn${var.env1}"

私のterraformテンプレート:

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn${var.env1}" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

私のアプローチは間違っているか、構文です。何か案は?

13
hey

環境ごとに異なる workspace を使用することをお勧めします。これにより、次のように構成を指定できます。

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

AWSでの名前の競合を避けるために、環境に応じて(たとえば、名前に含めることにより)、「aws_sqs_queue」リソースの名前を作成してください。

3
bitbrain

リソース名の内部を補間することはできません。 @ BMW がコメントで述べたように、代わりにSqsIntegrationOrderInを内部に含み、env変数を受け取るterraformモジュールを作成する必要があります。その後、モジュールを2回使用できますが、衝突することはありません。 同様の質問 もご覧ください。

3