我正面临着一个奇怪的情况,而运行地形应用。当运行terraform第一次申请时,我得到以下错误。填充的Terraform输出在单独的python脚本中读取,因此当api_gateway_id为null时,python脚本将失败。
module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (
):从Terraform收集数据.module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (本地-exec):回溯(最近一次调用):module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (本地-exec):文件“/home/ec2-user/bin/LAMBDA-部署”,第65行,在module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (Local):provide_env(‘LAMBDA_网关_ID’)中‘module.serverless_projects"api/admin.zip".null_resource.serverless_deployment’) module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (本地-exec):File“/home/ec2-user/bin/lambda-部署”,第57行,在provide_env module.serverless_projects"api/admin.zip".null_resource.serverless_deployment (Local):os.environkey = TERRAFORM_OUTPUTStf_output module.serverless_projects“api/admin.zip”.null_resource.serverless_deployment(Local):KeyError:'api_gateway_id‘中
当我第二次重试'terraform‘时,这个值(api_gateway_id)正在被填充,并且执行也是成功的。
main.tf
resource "aws_api_gateway_rest_api" "gw" {
name = "LambdaApiGateway"
endpoint_configuration {
types = ["PRIVATE"]
vpc_endpoint_ids = [aws_vpc_endpoint.gw.id]
}
binary_media_types = ["*/*"]
}
resource "aws_api_gateway_resource" "api" {
rest_api_id = aws_api_gateway_rest_api.gw.id
parent_id = aws_api_gateway_rest_api.gw.root_resource_id
path_part = "api"
}
不仅api_gateway_id,甚至api_gateway_root,api_gateway_resources也没有在第一次执行时被打印出来。我试过terraform init,在执行之前刷新了terraform,但是没有运气。
output.tf
output "api_gateway_id" {
value = aws_api_gateway_rest_api.gw.id
}
output "api_gateway_root" {
value = aws_api_gateway_rest_api.gw.root_resource_id
}
output "api_gateway_resources" {
value = jsonencode({
api = aws_api_gateway_resource.api.id,
})
}
resource "null_resource" "serverless_deployment" {
triggers = {
source_version = data.aws_s3_bucket_object.package_object.version_id
}
provisioner "local-exec" {
command = "lambda-deploy ${var.package_name}"
}
}
发布于 2022-11-07 16:51:43
Terraform只在应用阶段完成后才完成更新的状态快照,因此尝试从应用阶段期间采取的操作访问状态是不可靠的。
相反,我建议直接将所需的值传递给您正在运行的外部程序,或者使用命令行参数,或者使用仅为该进程设置的环境变量。
例如:
provisioner "local-exec" {
command = "lambda-deploy ${var.package_name}"
environment = {
LAMBDA_GATEWAY_ID = aws_api_gateway_rest_api.gw.id
}
}
在上面,我使用了一个环境变量名,这是我在程序生成的堆栈跟踪中提到的,尽管您可以使用任何您想要的环境变量名称,然后在用于实现这个程序的编程语言中使用任何正常的方法来访问它们。对于Python程序,您将不再需要将它们分配到os.environ
中,因为它们应该已经在那里可用了。
https://stackoverflow.com/questions/74349727
复制相似问题