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



我有这样的场景,我需要确保如果awslambda存在,如果存在,停止创建它与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已经通过其他方式存在,需要停止创建它

我该如何预防?有人能帮帮我吗?

谢谢。

完全不要对资源进行计数。默认的计数是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]
}

相关内容

  • 没有找到相关文章

最新更新