Terraform 中的相对路径

Posted

技术标签:

【中文标题】Terraform 中的相对路径【英文标题】:Relative paths in Terraform 【发布时间】:2019-05-19 19:56:17 【问题描述】:

我正在尝试使用 terraform 创建一个 AWS lambda 函数。 我的 terraform 目录看起来像

地形 iam 策略 main.tf 拉姆达 文件/ main.tf main.tf

我的 lambda 函数存储在 /terraform/lambda/files/lambda_function.py

每当我应用 terraform 时,我都有一个“null_resource”,它会在本地机器上执行一些命令来压缩 python 文件

variable "pythonfile" 
  description = "lambda function python filename"
  type        = "string"


resource "null_resource" "lambda_preconditions" 
  triggers 
    always_run = "$uuid()"
  
  provisioner "local-exec" 
    command = "rm -rf $path.module/files/zips"
  
  provisioner "local-exec" 
    command = "mkdir -p $path.module/files/zips"
  
  provisioner "local-exec" 
    command = "cp -R $path.module/files/$var.pythonfile $path.module/files/zips/lambda_function.py"
  
  provisioner "local-exec" 
    command = "cd $path.module/files/zips && zip -r lambda.zip ."
  

我的“aws_lambda_function”资源如下所示。

resource "aws_lambda_function" "lambda_function" 
  filename         = "$path.module/files/zips/lambda.zip"
  function_name    = "$format("%s-%s-%s-lambda-function", var.name, var.environment, var.function_name)"
  role             = "$aws_iam_role.iam_for_lambda.arn"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "$base64sha256(format("%s/files/zips/lambda.zip", path.module))", length(path.cwd) + 1, -1)")"
  runtime          = "$var.function_runtime"
  timeout          = "$var.function_timeout"
  memory_size      = "$var.function_memory"

  environment 
    variables = 
      region      = "$var.region"
      name        = "$var.name"
      environment = "$var.environment"
    
  

  vpc_config 
    subnet_ids         = ["$var.subnet_ids"]
    security_group_ids = ["$aws_security_group.lambda_sg.id"]
  

  depends_on = [
    "null_resource.lambda_preconditions"
  ]

问题: 每当我更改 lambda_function.py 文件并再次应用 terraform 时,一切正常,但 lambda 函数中的实际代码不会改变。 此外,如果我删除所有 terraform 状态文件并再次应用,则新的更改会毫无问题地传播。

这可能是什么原因?

【问题讨论】:

你能准确地说“一切正常,但 lambda 函数中的实际代码没有改变”吗?因为这里似乎一切都不正常(至少,不是你所期望的)。当您对lambda_function.py 进行更改时,terraform apply 的输出是什么?它会创建一个新的拉链吗?它会更新lambda_function 资源吗? @norbjd 每当我应用新的 terraform 时,它都会创建 zip 文件并将代码上传到 lambda,而不会出现任何错误。但是,当我更改 lambda_function.py 中的代码并应用 terraform 时,预期结果将是 Lambda 控制台中函数代码的更新。但实际上,lambda_function.py 中的变化并没有传播到 lambda 函数。第二次尝试没有错误。 第二个terraform apply创建的带有更新代码的zip? @norbjd 是的,第二个应用创建了更新的 zip,但不知何故 Lambda 中的代码没有改变。我检查了 zip 里面也有更新的代码。 顺便说一句,source_code_hash 语法是错误的(右括号/括号的数量与开头的数量不同)。在第一个apply 之后,它的计算值是多少?如果在第二个 apply 之后 source_code_hash 相同,这就是不更新 lambda 的原因(因为其他计算参数相同)。 【参考方案1】:

我没有使用null_resource,而是使用archive_file 数据源,它会在检测到新更改时自动创建压缩文件。接下来我从 lambda 资源 source_code_hash 属性中的 archive_file 数据中获取了一个引用。

archive_file 数据源

data "archive_file" "lambda_zip" 
  type        = "zip"
  output_path = "$path.module/files/zips/lambda.zip"

  source 
    content  = "$file("$path.module/files/ebs_cleanup_lambda.py")"
    filename = "lambda_function.py"
  

lambda 资源

resource "aws_lambda_function" "lambda_function" 
  filename         = "$path.module/files/zips/lambda.zip"
  function_name    = "$format("%s-%s-%s-lambda-function", var.name, var.environment, var.function_name)"
  role             = "$aws_iam_role.iam_for_lambda.arn"
  handler          = "lambda_function.lambda_handler"
  source_code_hash = "$data.archive_file.lambda_zip.output_base64sha256"
  runtime          = "$var.function_runtime"
  timeout          = "$var.function_timeout"
  memory_size      = "$var.function_memory"

  environment 
    variables = 
      region      = "$var.region"
      name        = "$var.name"
      environment = "$var.environment"
    
  

  vpc_config 
    subnet_ids         = ["$var.subnet_ids"]
    security_group_ids = ["$aws_security_group.lambda_sg.id"]
  

【讨论】:

以上是关于Terraform 中的相对路径的主要内容,如果未能解决你的问题,请参考以下文章

java中的绝对路径和相对路径

java里绝对路径和相对路径的区别是啥?

html中相对路径的问题?

perl 中的相对文件路径

SoapUI 中的相对路径

javaWeb中的/路径问题