无法通过 Terraform 在 Gitlab 中为 AWS Lambda Fx 创建 Zip 文件

Ree*_*ma 5 amazon-web-services gitlab-ci aws-lambda terraform-provider-aws

我正在尝试通过 terraform 为 gitlab repo 中存在的文件创建 lambda 函数,但是我在 CICD 管道中遇到错误:

“./lambda_function.zip:没有这样的文件或目录”

包含 lambda 函数 python 文件的文件夹(src 文件夹)与包含 terraform 文件的文件夹(terraform)不同。

我的 Gitlab 项目看起来像

项目名

-src

  • lambda_function.py

-地形

  • 拉姆达.tf

lambda.tf 中的 terraform 代码是:

data "archive_file" "lambda" {
type = "zip"
source_file = "../src/lambda_function.py"
output_path = "lambda_function.zip"
Run Code Online (Sandbox Code Playgroud)

}

    resource "aws_lambda_function" "automation-lambda" 
{filename=data.archive_file.lambda.output_path
  description       = "Creating lambda"
  function_name     = "lambda_fx"
  role              = "xxxxxxxxxxxxx"  
  handler           = "lambda_function.lambda_handler"
  memory_size       =  128
  timeout           =  300
  source_code_hash  = data.archive_file.lambda.output_base64sha256
  runtime = "python3.7"
}

Run Code Online (Sandbox Code Playgroud)

请建议如何解决该问题。

谢谢

Chr*_*mas 5

简而言之,问题是:

问题归结为:terraform plan创建data.archive_file资源,稍后由terraform apply. 如果您在单独的 gitlab 管道阶段执行这两个 terraform 命令。在阶段中生成的 zip 文件plan将不可用于阶段apply。除非您将输出目录添加为工件

答案的较长版本

如果您正在使用 gitlab 管道的多个阶段,先规划一个阶段,然后应用一个阶段。这是你的问题。

“dist”zip 文件是在计划阶段创建的,因此您需要将 $PWD/dist 作为工件添加到您的管道中。然后在应用阶段,告诉管道它需要计划阶段,使工件可用于应用命令。

所以在我们的管道中,我有这样的事情:

plan_lambda:
  stage: plan
  needs:
    - init_lambda
    - validate_lambda
  script:
    - terraform -chdir=${PROJECT} plan -out=planfile ${args[@]}
  artifacts:
    paths:
      - ${PROJECT}/planfile
      # This is important, data.archive_file's are generated during plan stage, not apply, so these artifacts need to be stored
      # https://github.com/hashicorp/terraform-provider-archive/issues/39#issuecomment-1013680518
      - ${PWD}/dist
Run Code Online (Sandbox Code Playgroud)

然后在申请阶段

apply_lambda:
  stage: apply
  when: manual
  needs:
    - init_lambda
    - plan_lambda
    - apply_execution_role
  variables:
    PROJECT: lambda
  script:
    - terraform -chdir=${PROJECT} apply -auto-approve planfile
Run Code Online (Sandbox Code Playgroud)

在这里,计划阶段生成的 dist zip 文件将可用于应用阶段,您的问题应该得到解决。

如需更多信息以及引导我找到此解决方案的整个对话,请参阅 terraform github 存储库中的票证:

https://github.com/hashicorp/terraform-provider-archive/issues/39#issuecomment-1013680518

“dist”或“dist zip”文件是什么意思?

这是一些 terraform 代码,它运行yarn来安装node_modules,然后将源代码打包到zip文件中,以便您可以在AWS Lambda上部署

resource "null_resource" "run_yarn" {
  triggers  =  {
    always_run = timestamp()
  }

  provisioner "local-exec" {
    command = "yarn --cwd ${local.root_path}/app/src install"
  }
}

data "archive_file" "app_src" {
  depends_on    = [null_resource.run_yarn]
  type          = "zip"
  source_dir    = "${local.root_path}/app/src"
  output_path   = "${local.root_path}/dist/app.zip"
}
Run Code Online (Sandbox Code Playgroud)

“dist”文件是生成并上传到 AWS Lambda 的分布式 zip 文件