首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform :由等号("=")引入的属性值。

Terraform :由等号("=")引入的属性值。
EN

Stack Overflow用户
提问于 2022-09-12 12:36:29
回答 2查看 59关注 0票数 0

我正在开发一个terraform脚本,它使用HTTPS/POST请求将API集成到DynamoDB。基本目标是插入DynamoDB表中API请求正文中传递的记录。我使用attributes(BusinessUnitId定义集成,并在那里传递请求模板,其中应该包括两个aws_api_gateway_integration和Frequency).My脚本,如下所示-

代码语言:javascript
复制
resource aws_api_gateway_integration schedule_post_integration {
  rest_api_id             = aws_api_gateway_rest_api.schedule.id
  resource_id             = aws_api_gateway_resource.schedule_resource.id
  http_method             = aws_api_gateway_method.schedule_post_method.http_method
  type                    = "AWS"
  integration_http_method = "POST"
  uri                     = "arn:aws:apigateway:${var.target_region}:dynamodb:action/PutItem"
  credentials             = aws_iam_role.schedule_api_dynamodb_role.arn
  request_templates       = {
    "application/json" = EOF
    {
        "TableName" : "${var.environment_id}-AccountService-NotesToDatalakeSchedule",
        "Item" : {
            "BusinessUnitId" : {
                "N" : "$input.path('$.BusinessUnitId')"
            },
            "Frequency" : {
                "N" : "$input.path('$.Frequency')"
            }
        }
    }
  }
}

我找不到一个正确的语法来指示应该如何在request_templates中传递。在部署过程中它会抛出错误-

代码语言:javascript
复制
2022-09-12T11:51:22.6623262Z ##[error][1m[31mError: [0m[0m[1mMissing attribute value[0m
2022-09-12T11:51:22.6626316Z ##[error][0m  on api-gateway.tf line 47, in resource "aws_api_gateway_integration" "schedule_post_integration":
2022-09-12T11:51:22.6628770Z ##[error]  35:   request_templates       = {
2022-09-12T11:51:22.6630845Z ##[error]  36:     "application/json" = EOF
2022-09-12T11:51:22.6632935Z ##[error]  37:     {
2022-09-12T11:51:22.6636136Z ##[error]  38:         "TableName" : "${var.environment_id}-AccountService-NotesToDatalakeSchedule",
2022-09-12T11:51:22.6638305Z ##[error]  39:         "Item" : {
2022-09-12T11:51:22.6642274Z ##[error]  40:             "BusinessUnitId" : {
2022-09-12T11:51:22.6645424Z ##[error]  41:                 "N" : "$input.path('$.BusinessUnitId')"
2022-09-12T11:51:22.6647529Z ##[error]  42:             },
2022-09-12T11:51:22.6649461Z ##[error]  43:             "Frequency" : {
2022-09-12T11:51:22.6651639Z ##[error]  44:                 "N" : "$input.path('$.Frequency')"
2022-09-12T11:51:22.6653642Z ##[error]  45:             }
2022-09-12T11:51:22.6655505Z ##[error]  46:         }
2022-09-12T11:51:22.6657282Z ##[error]  47:     }
2022-09-12T11:51:22.6659045Z ##[error]  48:   }
2022-09-12T11:51:22.6661277Z ##[error]Expected an attribute value, introduced by an equals sign ("=").

有人能帮我确认一下这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-12 12:43:13

看起来您正在尝试使用HCL 模板表达式,但是您忘记了两件关键的事情:

  1. 模板表达式以<< MARKER开头,您选择了EOF作为标记,但忘记了<<
  2. 你忘了“线上”的记号。

固定版本:

代码语言:javascript
复制
resource aws_api_gateway_integration schedule_post_integration {
  rest_api_id             = aws_api_gateway_rest_api.schedule.id
  resource_id             = aws_api_gateway_resource.schedule_resource.id
  http_method             = aws_api_gateway_method.schedule_post_method.http_method
  type                    = "AWS"
  integration_http_method = "POST"
  uri                     = "arn:aws:apigateway:${var.target_region}:dynamodb:action/PutItem"
  credentials             = aws_iam_role.schedule_api_dynamodb_role.arn
  request_templates       = {
    "application/json" = << EOF
    {
        "TableName" : "${var.environment_id}-AccountService-NotesToDatalakeSchedule",
        "Item" : {
            "BusinessUnitId" : {
                "N" : "$input.path('$.BusinessUnitId')"
            },
            "Frequency" : {
                "N" : "$input.path('$.Frequency')"
            }
        }
    }
EOF
  }
}
票数 0
EN

Stack Overflow用户

发布于 2022-09-13 18:43:43

尽管现有的其他答案对于如何使用多行模板表达式是正确的,但通常最好使用jsonencode函数来生成JSON字符串,而不是使用字符串模板,因为结果始终是有效的JSON,而不需要考虑引用、转义和逗号的正确位置。

例如:

代码语言:javascript
复制
  request_templates = {
    "application/json" = jsonencode({
      "TableName" = "${var.environment_id}-AccountService-NotesToDatalakeSchedule"
      "Item" = {
        "BusinessUnitId" = {
          "N" = "$input.path('$.BusinessUnitId')"
        }
        "Frequency" = {
          "N" = "$input.path('$.Frequency')"
        }
      }
    })
  }

这里给jsonencode的参数是一个Terraform表达式,它构造了一个对象值。文档描述了函数如何将Terraform值转换为相应的JSON数据类型,在该表中,上面的示例应该生成与您在问题中试图编写的模板等效的JSON数据结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73689378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档