在 Lambda 中获取比 lambda 寿命更长的临时信用

Get temp creds in Lambda that live longer than the lambda

所以,我在 AWS lambda 函数中。我需要 return 来自 API 端点的临时凭证,以便可以从浏览器直接上传到 S3。

文件可能很大,有几百GB,所以信用点需要保存很长时间。在 lambda 中获取这些类型的凭据的最简单方法是什么?

简短的回答是您需要承担一个角色,正如我在 this blog post 中描述的那样。 post 的一个关键部分是使用会话策略将假定角色的范围限定为 S3 上的单个密钥。

但是,如果上传文件的时间超过一个小时,则该解决方案将无法像所写的那样工作,因为 Lambda 无法承担请求持续时间超过一小时的另一个角色(请参阅 role chaining), a limit that can't be increased.

这意味着您需要创建一个可以承担该角色的用户,并使该用户的长期凭证可供 Lambda 使用(通常通过 Secrets Manager)。检索到这些凭据后,使用它们创建一个 STS 客户端(你不会说你使用的是什么语言,我通常使用 Python,所以这就是显示的内容):

sts_client = boto3.client(
    'sts',
    aws_access_key_id=stored_access_key,
    aws_secret_access_key=stored_secret_key)

然后使用这些凭据,您可以担任可以写入文件的角色。在关注博文post中,base role有权限写入S3上的任何文件,session policy将assumed role限制为特定文件:

session_policy = json.dumps({
    'Version': '2012-10-17',
    'Statement': [
        {
            'Effect': 'Allow',
            'Action': 's3:PutObject',
            'Resource': f"arn:aws:s3:::{BUCKET}/{KEY}"
        }
    ]
})

response = sts_client.assume_role(
    RoleArn=ASSUMABLE_ROLE_ARN,
    RoleSessionName="example",
    Policy=session_policy,
    DurationSeconds=12 * 3600
)

# these are the credentials that you'd pass to the client application

limited_access_key = response['Credentials']['AccessKeyId']
limited_secret_key = response['Credentials']['SecretAccessKey']
limited_session_token = response['Credentials']['SessionToken']

12 小时足以通过 100 mbps 的连接传输 500 GB。如果您需要比这更多的时间,那么您将必须创建一个实际用户和 return 它的凭据。您可以将内联策略附加到该用户以限制其对单个文件的访问(与本例中的会话策略的目的相同)。但由于您在一个帐户中限制为 5,000 个 IAM 用户,因此您不希望定期执行此操作。