问题描述
在使用AWS S3时,已经成功地在对象上传(PUT)时触发了事件,但是当对象被下载(GET)时没有触发任何事件。用户希望在每次下载对象时收到通知,以便能够将任何给定对象的下载限制为最多10次。用户想知道如何实现这一点。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据AWS S3的当前功能,目前没有针对GET请求的事件类型。但是,可以通过以下步骤实现类似的功能:
1. 创建一个应用程序/lambda函数,其唯一目的是从S3存储桶中检索对象。该应用程序将被授予对S3存储桶的独占权限。
2. 应用程序会记录S3资源被访问的次数。
3. 如果超过下载限制,应用程序返回403或其他你想要的响应。
基本上,创建一个“中间件”,其唯一目的是从你的网站/应用程序到S3的访问,并跟踪请求的次数。
虽然上述解决方案满足了你的要求,但它容易受到常见攻击,如DDoS或IP欺骗。如果采用这种方法,请考虑采取其他安全措施(例如,只有经过身份验证的用户才能调用应用程序的S3 GET请求)。
方案2
使用脚本或工具来管理对象的下载次数可能会增加复杂性,并且需要确保安全性。
另一种方法是编写脚本或使用工具来控制对象的下载次数。你可以在你的Web应用程序中生成带有签名的URL,并跟踪为给定对象生成的签名URL的数量。在生成签名URL达到10次后,拒绝进一步的访问。
这种方法相对更安全、更便宜且更容易控制。
以下是一个示例脚本,可以生成带有签名的URL并跟踪下载次数:
import boto3
s3 = boto3.client('s3')
def generate_signed_url(bucket, key):
# 生成带有签名的URL
signed_url = s3.generate_presigned_url(
'get_object',
Params={
'Bucket': bucket,
'Key': key
},
ExpiresIn=3600 # URL的有效期
)
# 记录下载次数
record_download(bucket, key)
return signed_url
def record_download(bucket, key):
# 记录下载次数的逻辑
pass
# 使用示例
bucket = 'your_bucket_name'
key = 'your_object_key'
signed_url = generate_signed_url(bucket, key)
print(signed_url)
在上面的示例中,我们使用AWS SDK for Python(Boto3)生成带有签名的URL,并在生成URL后记录下载次数。你可以根据自己的需求修改和扩展这个示例。
请注意,这种方法需要你在Web应用程序中生成带有签名的URL,并确保在生成URL后记录下载次数。你还需要根据自己的需求来实现记录下载次数的逻辑。
以上是两种实现在AWS S3中触发SNS通知当对象被访问(下载)的解决方案。根据你的具体需求和环境,选择适合你的方案。