【问题标题】:How to conditionally create terraform resources and stop deletion in the next apply下次apply如何有条件地创建terraform资源并停止删除
【发布时间】:2021-11-09 19:45:51
【问题描述】:

我有这种情况,我需要确定 aws lambda 是否存在,如果存在,请停止使用 terraform 创建它,因此我使用 count 进行条件渲染,如下所示:

resource "aws_lambda_function" "lambda_aurora_hibernation" {

  count         = var.is_lambda_exist == "exist" ? 0 : 1

  filename      = "lambda_function.zip"
  function_name = "lambda-aurora-hibernation"
  role          = aws_iam_role.lambda_role.arn
  handler       = "lambda_function.lambda_handler"
  source_code_hash = filebase64sha256("lambda_function.zip")
  runtime = "python3.6"
}

resource "aws_lambda_permission" "lambda_aurora_hibernation_permission" {

  count     = length(aws_lambda_function.lambda_aurora_hibernation)

  statement_id  = "AllowExecutionFromCloudWatch"
  action        = "lambda:InvokeFunction"
  function_name  = aws_lambda_function.lambda_aurora_hibernation[count.index].function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.lambda_aurora_hibernation_event_rule.arn
  depends_on=[aws_lambda_function.lambda_aurora_hibernation]
}

第一个terraform apply中变量is_lambda_exist的值为not_exists,因此count的值变为1,这是正确的。

在接下来的terraform apply 中,我将is_lambda_exist 的值更改为exist,然后count 的值变为0 这将导致删除资源

我这样做的原因是有人可以手动创建资源,因此如果该 lambda 已经以其他方式存在,则需要停止创建它

如何防止这种情况发生?有人可以帮帮我吗?

谢谢。

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    根本不考虑资源。默认计数为 1。正如他们的文档中所述:

    默认情况下,一个资源块配置一个真实的基础设施对象。

    (https://www.terraform.io/docs/language/meta-arguments/count.html)

    我认为您误解了 Terraform 的核心原则,即它是声明性

    这意味着如果它已经创建了一次资源,后续运行apply 将不会创建另一个相同形状的资源,除非资源定义已更改以至于无法就地更新,然后它将销毁现有资源并在其位置创建一个新资源。

    因此,除非您将 count 设置为大于 1,否则您将永远只有一个资源。

    resource "aws_lambda_function" "lambda_aurora_hibernation" {
      filename         = "lambda_function.zip"
      function_name    = "lambda-aurora-hibernation"
      role             = aws_iam_role.lambda_role.arn
      handler          = "lambda_function.lambda_handler"
      source_code_hash = filebase64sha256("lambda_function.zip")
      runtime          = "python3.6"
    }
    
    resource "aws_lambda_permission" "lambda_aurora_hibernation_permission" {
      statement_id  = "AllowExecutionFromCloudWatch"
      action        = "lambda:InvokeFunction"
      function_name = aws_lambda_function.lambda_aurora_hibernation.function_name
      principal     = "events.amazonaws.com"
      source_arn    = aws_cloudwatch_event_rule.lambda_aurora_hibernation_event_rule.arn
      depends_on    = [aws_lambda_function.lambda_aurora_hibernation]
    }
    

    【讨论】:

    • 我这样做的原因是有人可以手动创建资源,因此如果该 lambda 已经以其他方式存在,则需要停止创建它
    • 如果发生这种情况,您可以使用terraform import 命令将资源导入您的 TF 状态:terraform.io/docs/cli/commands/import.html
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2018-06-26
    • 2021-08-28
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2020-02-03
    • 2020-05-30
    相关资源
    最近更新 更多