AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?

Posted

技术标签:

【中文标题】AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?【英文标题】:AWS API Gateway - How do I get the date/timestamp/epoch in a body mapping template? 【发布时间】:2017-05-02 20:18:37 【问题描述】:

我需要在 API 网关方法的正文映射模板中包含请求时间。是否有日期/时间变量或函数?我在template reference 中找不到任何内容。

身体映射模板示例:

Action=SendMessage&MessageBody=$util.urlEncode("""timestamp"":""TIMESTAMP_HERE"",""body-json"":$input.json('$'),""params"":""$input.params()""")

【问题讨论】:

【参考方案1】:

更新: API Gateway 刚刚添加了两个新的上下文变量http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

$context.requestTime    The CLF-formatted request time (dd/MMM/yyyy:HH:mm:ss +-hhmm).
$context.requestTimeEpoch   The Epoch-formatted request time.

API 网关目前不支持此功能。它以前在论坛上被请求过 - https://forums.aws.amazon.com/thread.jspa?messageID=697658&。我们的待办事项中有此功能,但遗憾的是我无法承诺任何时间表。

【讨论】:

感谢您的更新!我们将方法集成请求映射到 SQS - 作为一种解决方法,我们使用来自 SQS 的 First Received 时间戳 这将是一个非常有用的功能,如果您可以提供类似环境变量的东西来获取时间戳。 有人成功使用 $context.requestTime 吗?在我们的 API 网关集成中使用它时,我仍然得到一个空字符串。 @giorgioca $context.requestTimeEpoch 和 $context.requestTime 仅在 API 部署后可用。您可以通过创建一个设置为“Mock”的 Get Method 并将 Integration Response 中的 Body Mappings Template 更改为类似: "api_id" : "$context.apiId", "epoch": "$context.requestTimeEpoch", "requestTime": "$context.requestTime" 来测试这一点。部署,访问 URL。应该有你的时间。 $context.requestTimeEpoch 以毫秒为单位返回给那些寻求该精度的人。【参考方案2】:

似乎有一种方法可以从 API Gateway 请求中获取时间戳,但您需要查看 the X-Ray documentation 才能找到它:

Amazon API Gateway 网关将跟踪 ID 添加到名为 X-Amzn-Trace-Id 的标头中的传入 HTTP 请求。

(...)

trace_id 由三个用连字符分隔的数字组成。例如,1-58406520-a006649127e371903a2de979。这包括:

版本号,即1。 原始请求的时间,Unix 纪元时间,8 位十六进制数字。例如,2016 年 12 月 2 日上午 10:00(太平洋标准时间)的纪元时间为 1480615200 秒,或十六进制的 58406520。

(...)

【讨论】:

有谁知道“原始请求的时间”是否是浏览器声称已开始连接的时间?或者是 AWS 基础设施第一次看到连接的时候?换句话说,这可以用来衡量从客户端到 AWS 的网络延迟吗? 您可以使用以下代码访问标题:$input.params('X-Amzn-Trace-Id') @dtbarne - 似乎不起作用。当我尝试使用它时,我得到一个空字符串。 有人知道吗? @raRaRa 检查您的实施的其余部分。这绝对有效……我们现在在多个生产 API 中使用它。【参考方案3】:

只需在模板顶部为您希望它过期的日期设置一个时间值。然后将其作为属性添加到您的项目。例如,如果您希望商品在 60 天内过期,您将添加 5184000 秒。

#set($expireDate = $context.requestTimeEpoch + 5184000) 

  "TableName": "your-table-name",
  "Item": 
      ... other attributes
      "expireDate": "N": "$expireDate",
  

【讨论】:

这看起来您正在使用 DynamoDB TTL,也许吧?仅供参考,DynamoDB 以 为单位使用纪元时间,这是 毫秒,因此到期时间可能比预期的要长:D

以上是关于AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway 集成请求正文映射模板

HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数

从 AWS API Gateway 自定义域映射中删除映射路径

使用 VTL 的 AWS Gateway API 映射超时

将 AWS Lambda 429 错误映射到 API Gateway 2XX 响应

AWS API Gateway:由于配置错误,执行失败:输出映射不匹配且未配置默认输出映射