首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用缓存的boto3客户端和Lambda提供的并发刷新凭据?

如何使用缓存的boto3客户端和Lambda提供的并发刷新凭据?
EN

Stack Overflow用户
提问于 2021-10-15 11:33:28
回答 2查看 647关注 0票数 2

遵循最佳实践利用执行环境重用来提高功能的性能。,我正在研究在使用Lambda提供的并发时缓存boto3客户端是否有任何负面影响。boto3客户端通过@lru_cache装饰器进行缓存,并且是延迟初始化的。现在,需要关注的是,boto3客户端的底层凭据不会被刷新,因为提供的并发性将使执行环境存活一段未知的时间。此生存期可能比Lambda环境注入的临时凭据的持续时间长。

我找不到医生解释这个案子是怎么处理的。在上述情况下,有人知道Lambda环境是如何处理凭证刷新的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-15 12:43:40

如果您使用硬编码凭据:

您有一个比“重用”凭据更大的安全问题,应该立即删除它们,

来自文档

不将文字访问键放在应用程序文件中。如果您这样做了,则如果您将项目上传到公共存储库,则会产生意外暴露凭据的风险。 不包括项目区域中包含凭据的文件。

执行角色替换它们。

如果使用的是执行角色,则为

您没有为任何AWS调用手动提供任何凭据。SDK的凭据自动来自Lambda函数的执行角色。

即使Boto3角色凭据是跨调用共享的(没有人确定),会有什么问题呢?

让亚马逊来处理角色认证--这根本不是你的责任。

我更担心应用程序代码存在安全缺陷,而不是使用执行角色凭据自动对SDK请求进行身份验证。

票数 1
EN

Stack Overflow用户

发布于 2021-10-15 17:48:31

他们不是。

Boto3文档在描述凭据链方面做得不太好,但是CLI文档显示了各种凭证来源(而且因为CLI是用Python编写的,所以它提供了权威的文档)。

与从实例元数据中检索基于角色的凭据的EC2和ECS不同,Lambda在环境变量中提供凭据。Lambda运行时在启动时设置这些环境变量,而对Lambda运行时的每次调用都使用相同的值。

并发Lambdas接收单独的凭证集,就像对STS AssumeRole进行并发显式调用一样。

提供的并发机制有点棘手。您可能认为相同的Lambda运行时“永远”存在,但实际上并非如此:如果您重复使用提供的并发调用Lambda,您将看到它在某一时刻创建了一个新的CloudWatch日志流。这表明Lambda已经启动了一个新的运行时。Lambda将在新运行时停止向旧运行时发送请求之前完成对新运行时的初始化,因此不会出现冷启动延迟。

更新:

这里有一个Python,它演示了我前面所说的内容。作为初始化代码(在处理程序之外)的一部分,它记录第一次初始化时的时间,然后每当调用时间戳时报告时间戳。它还记录"AWS“环境变量的当前内容,以便查看其中是否有任何变化。

代码语言:javascript
运行
复制
import json
import os
from datetime import datetime

print("initializing environment")
init_timestamp = datetime.utcnow()

def lambda_handler(event, context):
    print(f"environment was initialized at {init_timestamp.isoformat()}")
    print("")
    print("**** env ****")
    keys = list(os.environ.keys())
    keys.sort()
    for k in keys:
        if k.startswith("AWS_"):
            print(f"{k}: {os.environ[k]}")

将其配置为提供的并发性,然后使用此shell命令每45秒调用一次:

代码语言:javascript
运行
复制
while true ; do date ; aws lambda invoke --function-name InvocationExplorer:2 --invocation-type Event --payload '{"foo": "irrelevant"}' /tmp/$$ ; sleep 45 ; done

让它运行一个小时或更长时间,您将得到两个日志流。第一个流如下所示(显示开始和结束,省略数百条消息):

代码语言:javascript
运行
复制
2021-10-19T16:19:32.699-04:00   initializing environment
2021-10-19T16:30:57.240-04:00   START RequestId: a27f6802-c7e6-4f70-b890-2e0172d46780 Version: 2
2021-10-19T16:30:57.243-04:00   environment was initialized at 2021-10-19T16:19:32.699455 
...
2021-10-19T17:07:24.853-04:00   END RequestId: dd9a356f-7928-4bf9-be56-86f4c5e1bb64
2021-10-19T17:07:24.853-04:00   REPORT RequestId: dd9a356f-7928-4bf9-be56-86f4c5e1bb64 Duration: 1.00 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 39 MB 

如您所见,Lambda是在16:19:32初始化的,当时我启用了提供的并发。第一次请求是在16:30处理的。

但是我想调用的是日志流中的最后一个请求,在17:07:24,或者在Lambda初始化后大约48分钟。

第二个日志流是这样开始的:

代码语言:javascript
运行
复制
2021-10-19T17:04:08.739-04:00   initializing environment
2021-10-19T17:08:10.276-04:00   START RequestId: 6b15ba7c-91e2-4f91-bb6c-99b9877f1ebf Version: 2
2021-10-19T17:08:10.279-04:00   environment was initialized at 2021-10-19T17:04:08.739398 

因此,正如您所看到的,它是在第一个流中的最终请求之前几分钟初始化的,但是在第一个流之后开始处理调用。

当然,这是没有保证的行为。这就是Lambda今天的工作方式,将来可能会改变。但改变是不可能的:当前的植入行为符合文档,任何更改都有违反客户代码的风险。

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

https://stackoverflow.com/questions/69584082

复制
相关文章

相似问题

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