Terraform 地形-根据条件创建或不创建资源

Terraform 地形-根据条件创建或不创建资源,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我需要在指定的环境中创建资源。例如,若我有一个AWS Lambda还并没有准备好进行生产,那个么我需要它只存在于开发环境中。有什么好办法吗?我知道可以将count设置为0,但我不确定如何将此决定级联到其他资源 例如,我有一个AWS Lambda的资源,count设置为0 resource "aws_lambda_function" "example_lambda" { count ? local.is_production ? 0 : 1 } 如何将

我需要在指定的环境中创建资源。例如,若我有一个AWS Lambda还并没有准备好进行生产,那个么我需要它只存在于开发环境中。有什么好办法吗?我知道可以将
count
设置为0,但我不确定如何将此决定级联到其他资源

例如,我有一个AWS Lambda的资源,
count
设置为0

resource "aws_lambda_function" "example_lambda" {
  count ? local.is_production ? 0 : 1
}
如何将此决策级联到依赖于上述AWS Lambda的其他资源

假设我有一个S3存储桶,它将调用Lambda函数

resource "aws_s3_bucket" "example_bucket" {
  bucket = "bucket_name"
}

resource "aws_lambda_permission" "example_bucket_etl" {
  statement_id  = "AllowExecutionFromS3Bucket"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.example_lambda.arn
  principal     = "s3.amazonaws.com"
  source_arn    = aws_s3_bucket.example_bucket.arn
}

resource "aws_s3_bucket_notification" "bucket_notification" {
  bucket = aws_s3_bucket.example_bucket.id

  lambda_function {
    lambda_function_arn = aws_lambda_function.example_lambda.arn
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "example_bucket/"
    filter_suffix       = ".txt"
  
  lambda_function {
    lambda_function_arn = aws_lambda_function.another_lambda_function.arn
    events              = ["s3:ObjectCreated:*"]    
    filter_prefix       = "another_example_bucket/"
    filter_suffix       = ".txt"
  }
}

您可以在多个资源上使用相同的计数变量。如果代码中可能的话,一种更好、更清晰的方法是将所有资源添加到一个模块中

您可以在多个资源上使用相同的计数变量。如果代码中可能的话,一种更好、更清晰的方法是将所有资源添加到一个模块中

当您在
资源
块中使用
计数
时,这使得Terraform将其他地方对该资源的引用视为生成表示该资源的每个实例的对象列表

由于该值只是一个普通的列表值,因此您可以选择其长度,以便简洁地写下“每个X应该有一个Y”语句,或者在您的特定情况下“每个lambda函数应该有一个lambda权限”

例如:

resource "aws_lambda_function" "example" {
  count = local.is_production ? 0 : 1

  # ...
}

resource "aws_lambda_permission" "example_bucket_etl" {
  count = length(aws_lambda_function.example)

  function_name = aws_lambda_function.example[count.index].name
  # ...
}
aws\u lambda\u权限
配置中,我们首先将计数设置为
aws\u lambda\u函数的计数。示例
,它告诉Terraform我们希望这些函数的计数始终匹配。这种连接有助于Terraform了解如何解决您增加或减少计数的情况,因为它暗示生成的创建/销毁操作需要以特定的顺序发生才能有效。然后,我们使用
count.index
引用其他资源的索引,在本例中,该索引将永远为零,但再次帮助Terraform在验证期间理解我们的意图

lambda_函数
aws_s3_bucket_通知中的嵌套块需要稍微不同的策略,因为在这种情况下,我们不是为每个lambda函数创建单独的资源实例,而是在单个资源实例中生成一些动态配置块。对于这种情况,我们可以使用它作为一种宏,根据集合的元素生成多个块:

resource "aws_s3_bucket_notification" "bucket_notification" {
  bucket = aws_s3_bucket.example_bucket.id

  dynamic "lambda_function" {
    for_each = aws_lambda_function.example
    content {
      # "lambda_function" in this block is the iterator
      # symbol, so lambda_function.value refers to the
      # current element of aws_lambda_function.example.
      lambda_function_arn = lambda_function.value.arn
      # ...
    }
  }
}
这同样依赖于
aws_lambda_函数这一事实。示例
是一个对象列表,但方式不同:我们要求Terraform为
aws_lambda_函数的每个元素生成
lambda_函数
块。示例
,将
lambda_函数.value
设置为每个块对应的整个
aws_lambda_函数
对象。因此,我们可以从该对象访问
.arn
属性,以获得填充块内
lambda\u函数\u arn
参数所需的相应arn


同样,在这种情况下,只有零个或一个lambda函数对象,因此只有零个或一个
lambda_函数
块,但在这两种情况下,此模式将推广到
count
的其他值,确保所有这些将随着配置的发展保持一致。

当您在
资源
块中使用
计数
时,Terraform会将其他地方对该资源的引用视为生成表示该资源的每个实例的对象列表

由于该值只是一个普通的列表值,因此您可以选择其长度,以便简洁地写下“每个X应该有一个Y”语句,或者在您的特定情况下“每个lambda函数应该有一个lambda权限”

例如:

resource "aws_lambda_function" "example" {
  count = local.is_production ? 0 : 1

  # ...
}

resource "aws_lambda_permission" "example_bucket_etl" {
  count = length(aws_lambda_function.example)

  function_name = aws_lambda_function.example[count.index].name
  # ...
}
aws\u lambda\u权限
配置中,我们首先将计数设置为
aws\u lambda\u函数的计数。示例
,它告诉Terraform我们希望这些函数的计数始终匹配。这种连接有助于Terraform了解如何解决您增加或减少计数的情况,因为它暗示生成的创建/销毁操作需要以特定的顺序发生才能有效。然后,我们使用
count.index
引用其他资源的索引,在本例中,该索引将永远为零,但再次帮助Terraform在验证期间理解我们的意图

lambda_函数
aws_s3_bucket_通知中的嵌套块需要稍微不同的策略,因为在这种情况下,我们不是为每个lambda函数创建单独的资源实例,而是在单个资源实例中生成一些动态配置块。对于这种情况,我们可以使用它作为一种宏,根据集合的元素生成多个块:

resource "aws_s3_bucket_notification" "bucket_notification" {
  bucket = aws_s3_bucket.example_bucket.id

  dynamic "lambda_function" {
    for_each = aws_lambda_function.example
    content {
      # "lambda_function" in this block is the iterator
      # symbol, so lambda_function.value refers to the
      # current element of aws_lambda_function.example.
      lambda_function_arn = lambda_function.value.arn
      # ...
    }
  }
}
这同样依赖于
aws_lambda_函数这一事实。示例
是一个对象列表,但方式不同:我们要求Terraform为
aws_lambda_函数的每个元素生成
lambda_函数
块。示例
,将
lambda_函数.value
设置为每个块对应的整个
aws_lambda_函数
对象。因此,我们可以从该对象访问
.arn
属性,以获得填充块内
lambda\u函数\u arn
参数所需的相应arn

同样,在这种情况下,只有零个或一个lambda函数对象,因此只有零个或一个
lambda_函数
块,但在这两种情况下,此模式将推广到
count
的其他值,确保所有这些都将