我有这样的场景,我需要确保如果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已经通过其他方式存在,需要停止创建它
我该如何预防?有人能帮帮我吗?
谢谢。
完全不要对资源进行计数。默认的计数是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]
}