Terraform更新Lambda代码发布版本时遇ResourceConflictException错误
问题原因
当你设置publish = true时,Terraform会在更新Lambda函数代码的同一操作中尝试发布新版本,但AWS Lambda的API不允许在函数代码更新过程中立即执行版本发布操作,导致出现ResourceConflictException冲突错误。
解决方案
放弃使用aws_lambda_function的publish参数,改用aws_lambda_function_version资源单独管理版本发布,让Terraform先完成函数代码更新,再执行版本创建操作,避免时序冲突。
修改后的代码示例
data "archive_file" "zip" { type = "zip" source_file = "${path.module}/lambda/hello.js" output_path = "${path.module}/lambda/hello.zip" } resource "aws_lambda_function" "hello_terraform" { filename = data.archive_file.zip.output_path source_code_hash = filebase64sha256(data.archive_file.zip.output_path) function_name = var.project_name role = aws_iam_role.lambda_role.arn handler = "hello.handler" runtime = "nodejs12.x" timeout = 10 # 移除publish参数,仅负责函数代码更新 } # 单独管理Lambda版本,依赖函数更新完成后执行 resource "aws_lambda_function_version" "hello_terraform" { function_name = aws_lambda_function.hello_terraform.function_name source_code_hash = aws_lambda_function.hello_terraform.source_code_hash } data "aws_iam_policy_document" "lambda_assume_role_policy" { statement { actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["lambda.amazonaws.com"] } } } resource "aws_iam_role" "lambda_role" { name = "${var.project_name}-lambda-role" assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json }
额外说明
- 每次修改Lambda代码后,
source_code_hash会变化,触发aws_lambda_function更新,随后aws_lambda_function_version会自动创建新版本。 - 如果需要配置版本别名,可以添加
aws_lambda_alias资源,关联上述版本资源:resource "aws_lambda_alias" "hello_terraform_prod" { name = "prod" function_name = aws_lambda_function.hello_terraform.function_name function_version = aws_lambda_function_version.hello_terraform.version }
内容的提问来源于stack exchange,提问作者Crerem
相关产品推荐
相关产品推荐

