尝试使用Boto3调用Lamba时发生InvalidSignatureException

时间:2019-07-12 13:29:06

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

我正在以“ 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.)

2 个答案:

答案 0 :(得分:1)

AWS Glue为您创建的每个Glue作业提供一个在虚拟实例上运行的Spark环境。
时间同步问题很可能是由于胶粘作业的基础实例无法通过NTP请求当前时间造成的。

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

  

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

     

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

如评论中所确认,分配给粘合连接的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

答案 1 :(得分:1)

尽管我很欣赏@Martin Loper的回答,因为它解释了问题的原因,但我无法从胶粘作业中删除连接,因为它是与数据库进行通信所必需的,而且我也无法在NAT中添加NAT VPC,因为这是安全性要求。 当我在工作开始时使用它时,我的问题就解决了:

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

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

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