如何在AWS S3中触发SNS通知当对象被访问(下载)

83次阅读
没有评论

问题描述

在使用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通知当对象被访问(下载)的解决方案。根据你的具体需求和环境,选择适合你的方案。

正文完