代码之家  ›  专栏  ›  技术社区  ›  Arcones

Terraform lambda源代码\u哈希更新,代码相同

  •  1
  • Arcones  · 技术社区  · 6 年前

    我在Terraform上成功部署了一个AWS Lambda:

    resource "aws_lambda_function" "lambda" {
      filename                       = "dist/subscriber-lambda.zip"
      function_name                  = "test_get-code"
      role                           = <my_role>
      handler                        = "main.handler"
      timeout                        = 14
      reserved_concurrent_executions = 50
      memory_size                    = 128
      runtime                        = "python3.6"
      tags                           = <my map of tags>
      source_code_hash               = "${base64sha256(file("../modules/lambda/lambda-code/main.py"))}"
      kms_key_arn                    = <my_kms_arn>
      vpc_config {
        subnet_ids         = <my_list_of_private_subnets>
        security_group_ids = <my_list_of_security_groups>
      }
      environment {
        variables = {
          environment = "dev"
        }
      }
    }
    

    terraform plan 命令它说我的lambda资源需要更新,因为 source_code_hash 已更改,但我没有更新lambda Python codebase(它的版本控制在同一repo的文件夹中):

      ~ module.app.module.lambda.aws_lambda_function.lambda
      last_modified:                     "2018-10-05T07:10:35.323+0000" => <computed>
      source_code_hash:                  "jd6U44lfe4124vR0VtyGiz45HFzDHCH7+yTBjvr400s=" => "JJIv/AQoPvpGIg01Ze/YRsteErqR0S6JsqKDNShz1w78"
    

    我想这是因为每次压缩Python源代码时,源代码都会发生变化。如果Python代码中没有更改,如何避免这种情况?如果我不改变Python代码基,我的假设是否一致(我的意思是,为什么散列会改变)?

    2 回复  |  直到 6 年前
        1
  •  10
  •   Kon    6 年前

    这是因为你正在散列 但是上传 dist/subscriber-lambda.zip . Terraform将散列与文件上载到lambda时计算的散列进行比较。因为散列是在两个不同的文件上完成的,所以最终会得到不同的散列。尝试在正在上载的完全相同的文件上运行哈希。

        2
  •  6
  •   Kevin Buchs    6 年前

    我将把我的答案与@ODYN Kon提供的答案进行对比。

    现在,问题是Terraform假设您更新了zip文件。假设zip存档中只有一个目录或一个文件,可以使用Terraform数据源存档文件来创建zip文件。我有一个例子,我不能使用它,因为我需要一个目录和一个文件(jsworld:source+node\u modules/)。但你可以这样使用它:

    data "archive_file" "lambdaCode" {
      type = "zip"
      source_file = "lambda_process_firewall_updates.js"
      output_path = "${var.lambda_zip}"
    }
    

    或者,如果将“source\u file”语句替换为 source_dir = "node_modules"

    完成此操作后,可以引用zip存档文件的哈希代码以插入到 resource "aws_lambda_function" "lambda" { "${data.archive_file.lambdaCode.output_base64sha256}" 对于字段source\u hash。然后,只要zip发生变化,lambda函数就会得到更新。而且,数据源存档文件知道,只要源文件发生更改,就必须重新生成zip。

    现在,我还没有深入到你的案件的根本原因,但希望能提供一些帮助,以达到一个更好的地方。您可以通过以下方式检查地形的保存状态: tf state list tf state show <state-name> . 例如,我正在研究的一个:

    tf state show aws_lambda_function.test-lambda-networking

    源代码\u hash=2fKX9v/duluQF0H6O9+iRnID2gokhfpXIXpxyeVBUM0=

    您可以通过命令行命令比较散列。MacOS示例: sha256sum my-lambda.zip ,其中sha256sum由 brew install coreutils .

    "${base64sha256(file("my-lambda.zip"))}" . 但这仍然需要我运行tf两次。

        3
  •  6
  •   Vincent Van der Kussen    5 年前

    这对我来说是可行的,而且当代码没有更改时也不会触发Lambda函数的更新

    data "archive_file" "lambda_zip" {                                                                                                                                                                                   
      type        = "zip"                                                                                                                                                                                                
      source_dir  = "../dist/go"                                                                                                                                                                                         
      output_path = "../dist/lambda_package.zip"                                                                                                                                                                         
    }                                                                                                                                                                                                                    
    
    
    resource "aws_lambda_function" "aggregator_func" {                                                                                                                                                                   
      description      = "MyFunction"                                                                                                                                                                       
      function_name    = "my-func-${local.env}"                                                                                                                                                                  
      filename         = data.archive_file.lambda_zip.output_path                                                                                                                                                        
      runtime          = "go1.x"                                                                                                                                                                                         
      handler          = "main"                                                                                                                                                                                    
      source_code_hash = data.archive_file.lambda_zip.output_base64sha256                                                                                                                                                
      role             = aws_iam_role.function_role.arn                                                                                                                                                                  
    
    
      timeout = 120                                                                                                                                                                                                      
      publish = true                                                                                                                                                                                                     
    
      tags = {                                                                                                                                                                                                           
        environment = local.env                                                                                                                                                                                                                                                                                                                                                                    
      }                                                                                                                                                                                                                  
    }                              
    
        4
  •  1
  •   adavea    5 年前

    正如其他人所说,zip应该用在文件名和哈希中。

    我想提到的是,如果在lambda定义中使用了错误的散列函数,也会遇到类似的问题。例如,filesha256(.zip)每次都会重新创建lambda。您必须使用filebase64sha256(“file.zip”)(terraform 0.11.12+)或base64sha256(file(“file.zip”)),如源代码\u hash中所述 here