You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:48:03