首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在下一次应用中有条件地创建terraform资源并停止删除

如何在下一次应用中有条件地创建terraform资源并停止删除
EN

Stack Overflow用户
提问于 2021-09-14 15:51:33
回答 1查看 279关注 0票数 0

在这个场景中,我需要确保是否存在aws lambda,如果存在,就停止使用terraform创建它,因此我使用count进行条件呈现,如下所示:

代码语言:javascript
复制
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中变量terraform apply的值是not_exists,因此count的值变为1,这是正确的。

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

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

我怎么才能阻止这一切?有人能帮帮我吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-09-14 16:04:16

根本不需要计算资源。默认计数为1。如其文件所述:

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

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

我认为你误解了Terraform的一个核心原则,那就是它是声明性的。

这意味着,如果它只创建了一次资源,那么后续运行的apply将不会创建相同形状的另一个资源,除非资源定义发生了更改,使其无法就地更新,然后它将破坏现有资源并在其位置创建一个新资源。

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

代码语言:javascript
复制
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]
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69180930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档