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.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)
请建议如何解决该问题。
谢谢
简而言之,问题是:
问题归结为: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 文件
| 归档时间: |
|
| 查看次数: |
2400 次 |
| 最近记录: |