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

如何在Python编写的AWS Lambda函数中获取S3对象URL

解决方案

你可以根据实际业务场景选择对应方式获取触发事件对应的S3对象URL:

1. 拼接标准S3对象URL

S3事件 payload 中已经携带了拼接URL所需的全部字段,无需额外调用S3 API即可生成,适用于桶公开、或访问方已有S3对应权限的场景。
S3标准虚拟托管风格URL格式为:https://{bucket-name}.s3.{region}.amazonaws.com/{object-key}
注意事件中返回的object key是URL编码后的格式,必须先解码拿到原始key,再做安全编码(保留路径分隔符/)后拼接,否则会出现路径错误、特殊字符转义失效问题。
对应实现代码:

import urllib.parse

# 从事件中提取基础字段
record = event['Records'][0]
region = record['awsRegion']
bucket_name = record['s3']['bucket']['name']
# 解码事件中URL编码的对象key
raw_object_key = urllib.parse.unquote_plus(
    record['s3']['object']['key'], 
    encoding='utf-8'
)
# 对原始key做URL编码,保留路径分隔符,避免空格、中文等特殊字符导致URL无效
encoded_object_key = urllib.parse.quote(raw_object_key, safe='/')

# 拼接最终可访问的S3 URL
s3_object_url = f"https://{bucket_name}.s3.{region}.amazonaws.com/{encoded_object_key}"

特殊场景适配提示:如果使用中国区S3,需将域名后缀替换为amazonaws.com.cn;如果桶开启了静态网站托管、绑定了自定义域名,直接替换URL中域名部分即可,key拼接逻辑不变。

2. 生成私有对象的预签名临时访问URL

如果你的S3桶为私有属性,需要给无S3访问权限的用户提供临时访问链接,可以通过boto3 SDK生成带签名的预签名URL,可自定义链接有效期,无需手动实现签名逻辑:

import boto3
import urllib.parse

s3_client = boto3.client('s3')
record = event['Records'][0]
bucket_name = record['s3']['bucket']['name']
raw_object_key = urllib.parse.unquote_plus(
    record['s3']['object']['key'], 
    encoding='utf-8'
)

# 生成有效期为1小时的预签名访问URL,ExpiresIn单位为秒
s3_presigned_url = s3_client.generate_presigned_url(
    'get_object',
    Params={
        'Bucket': bucket_name,
        'Key': raw_object_key
    },
    ExpiresIn=3600
)

注意事项

  • 禁止直接使用事件中未解码的原始key拼接URL,比如示例中的test%2Fkey如果不解码直接拼接,会被识别为文件名为test%2Fkey的对象,而非test/key路径下的对象
  • 如果使用S3接入点、双栈端点、FIPS端点等特殊访问端点,仅需替换URL中的域名部分,bucket、region、key的提取和处理逻辑无需修改
  • 手动拼接的标准URL仅在桶策略、对象ACL、访问方权限匹配时可正常访问,私有对象无权限时直接访问会返回403错误,需使用预签名URL或提前配置访问权限

内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:51:19