如何在AWS Lambda中获取长有效期临时凭证用于S3大文件直传
AWS Lambda生成S3长有效期上传临时凭证最简实现方案
最简单的实现方式是调用AWS STS的GetFederationToken接口生成联邦临时凭证,该方案不需要预先创建额外的IAM角色,配置流程更短,且最长可生成36小时有效期的凭证,完全满足数百GB文件分片上传的时间需求。
核心注意事项
- 直接用Lambda自身执行角色调用STS接口时,生成的临时凭证最长有效期和Lambda执行角色的会话有效期一致,默认仅1小时,无法满足大文件上传需求。要获取最长36小时的凭证,需要提前创建一个仅拥有
sts:GetFederationToken权限的IAM用户,将其AK/SK加密存储在Lambda环境变量中,用该IAM用户的身份调用STS接口。 - 凭证权限需遵循最小原则,仅开放指定S3桶指定路径的上传、分片上传相关权限,避免权限溢出。
具体实现步骤
- 第一步:创建STS调用专用IAM用户,绑定如下权限策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:GetFederationToken", "Resource": "*" } ] }
- 第二步:将该IAM用户的AK/SK配置为Lambda的加密环境变量,同时给Lambda执行角色添加对应KMS密钥的解密权限
- 第三步:在Lambda代码中调用STS接口生成临时凭证返回给前端,Python示例代码如下:
import boto3 import os import json from botocore.exceptions import ClientError def lambda_handler(event, context): # 从环境变量读取专用IAM用户的AK/SK sts_client = boto3.client( 'sts', aws_access_key_id=os.environ['STS_USER_ACCESS_KEY'], aws_secret_access_key=os.environ['STS_USER_SECRET_KEY'] ) try: # 申请临时凭证,DurationSeconds最大可设为129600(即36小时) resp = sts_client.get_federation_token( Name='s3-upload-federated-user', Policy='''{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::你的目标桶名称/上传路径前缀/*" } ] }''', DurationSeconds=86400 # 示例设为24小时,可按需调整 ) # 返回临时凭证给前端 return { "statusCode": 200, "headers": {"Access-Control-Allow-Origin": "*"}, "body": json.dumps({ "accessKeyId": resp["Credentials"]["AccessKeyId"], "secretAccessKey": resp["Credentials"]["SecretAccessKey"], "sessionToken": resp["Credentials"]["SessionToken"], "expiration": resp["Credentials"]["Expiration"].isoformat(), "bucket": "你的目标桶名称", "uploadPrefix": "上传路径前缀/" }) } except ClientError as e: return { "statusCode": 500, "body": json.dumps({"error": str(e)}) }
可选优化方案
如果不需要36小时这么长的有效期,也可以用AssumeRole方案实现,不需要额外创建IAM用户:预先创建一个具备S3上传权限的IAM角色,将该角色的最大会话有效期调整为最长12小时,同时给Lambda执行角色添加该角色的sts:AssumeRole权限即可,代码逻辑和上述示例基本一致。
内容的提问来源于stack exchange,提问作者Tutan Ramen
相关产品推荐
相关产品推荐

