【问题标题】:InvalidSignatureException while trying to Invoke Lamba using Boto3尝试使用 Boto3 调用 Lamba 时出现 InvalidSignatureException
【发布时间】:2019-07-12 13:29:06
【问题描述】:

我正在使用“RequestResponse”调用类型调用 aws lambda 函数并收到此错误:

我已经搜索过其他aws SDK支持的解决方案,但找不到python boto3的任何解决方案。

编辑:我正在使用 AWS Glue python shell 作业来运行我的代码,所以我无法控制系统时间。

Traceback (most recent call last):

File "/tmp/glue-python-libs-dgQjkA/audit_api_handler.py", line 532, in get_jobs_by_job_types
return self.get_api_response(method, params)
File "/tmp/glue-python-libs-dgQjkA/audit_api_handler.py", line 591, in get_api_response
LogType='Tail', Payload=json.dumps(post_data).encode())
File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions
.
ClientError
:
An error occurred (InvalidSignatureException) when calling the Invoke operation: Signature expired: 20190712T122841Z is now earlier than 20190712T122841Z (20190712T123341Z - 5 min.)

【问题讨论】:

  • 你检查本地系统时间是否正确?
  • @MartinLöper 我正在使用 AWS Glue python shell,所以我想我显然无法控制系统时间。
  • 您对启动粘合作业的子网(例如 NACL)的传出(或传入)流量是否有无状态限制?
  • @MartinLöper 我的胶水作业使用胶水连接,将其限制为 VPC。出于安全考虑,该 VPC 没有任何 NAT。删除该连接显然解决了我的问题。我只是在想这是否是因为胶水作业无法将其时间与现实世界同步。
  • @MartinLöper Glue 连接用于访问驻留在 VPC 中且没有任何公共 IP 地址的数据库。 Glue 连接是让 Glue 作业连接到此类数据库的配置。然而,它将粘合作业限制在 VPC 网络中。

标签: python amazon-web-services boto3 aws-glue


【解决方案1】:

虽然我很欣赏@Martin Loper 的回答,因为它解释了问题的原因,但我无法从粘合作业中删除连接,因为它需要与数据库通信,而且我也无法在VPC,因为它是一项安全要求。 当我在工作开始时使用它时,我的问题得到了解决:

boto3.setup_default_session(region_name="us-east-1")

它确保每个 boto3 客户端都使用 us-east-1 作为其区域。

更新: 虽然它的频率要低得多,但这个问题仍然存在。

【讨论】:

  • 很高兴您找到了解决此问题的更好方法!你知道为什么会这样吗?
  • 我的看法是 Glue Jobs 最初并不知道他们内部的区域。虽然没有互联网访问权限,但他们也无法同步时间,因此有时当发生时间不匹配时,aws 服务器无法判断它是否是有效的 boto3 客户端调用。手动添加区域可能会也可能不会同步时间,但会确保 aws 服务器识别其调用者以及它必须消耗的资源的区域。
【解决方案2】:

AWS Glue 为您创建的每个 Glue 作业预置在虚拟实例上运行的 Spark 环境。
时间同步问题很可能是由于胶水作业的底层实例无法通过 NTP 请求当前时间。

正如 cmets 中所阐明的,粘合作业具有配置为访问数据存储的连接。对于此配置,AWS 文档 [1] 声明:

如果作业需要在您的 VPC 子网中运行(例如,从私有子网中的 JDBC 数据存储转换数据),AWS Glue 会设置弹性网络接口,使您的作业能够安全地连接到您的 VPC 中的其他资源。
[...] 没有分配公共 IP 地址。 [...]

如果您的工作需要访问 VPC 资源和公共互联网,则 VPC 需要在 VPC 内具有网络地址转换 (NAT) 网关。

正如 cmets 中所确认的,分配给粘合连接的 VPC 缺少 NAT 网关(用于数据存储访问)导致 boto3 时间同步问题。
AWS Glue 为 VPC 的给定子网内的粘合连接创建一个单独的 ENI,并通过此 ENI 路由底层实例的所有流量。如果 ENI 无法将流量路由到外部世界,则时间显然无法同步。

注意:让我感到困惑的是,另一方面,AWS EC2 不需要公共互联网访问来进行时间同步(如文档 [2] 中所述)。因此,要么他们没有使用 EC2 来托管底层实例,要么没有按照文档进行配置。也许这个论坛上的 AWS 人可以告诉我们更多信息??

参考文献

[1]https://docs.aws.amazon.com/glue/latest/dg/start-connecting.html
[2]https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2021-11-03
    相关资源
    最近更新 更多