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

如何让同一AWS Lambda生成仅含GET权限的S3预签名URL?

解决方案:通过指定操作生成对应权限的预签名URL

完全不需要新建Lambda,核心点在于:预签名URL的权限由你生成时指定的具体操作(HTTP方法)决定,而非直接继承Lambda的所有权限。AWS文档里说的“预签名URL拥有签名所用策略的相同权限”,指的是生成URL的身份(这里是Lambda)必须具备该操作的权限,URL才能生效,但不是说URL会拥有Lambda的全部权限。

具体操作步骤:

  • 保持现有Lambda的IAM权限(同时包含s3:PutObject和s3:GetObject),这只是允许Lambda生成对应操作的预签名URL,不会让生成的URL同时拥有两种权限。
  • 生成预签名URL时,明确指定要执行的S3操作:
    • 生成仅具备GET权限的下载URL(以Python的boto3为例):
      import boto3
      s3_client = boto3.client('s3')
      
      def generate_get_presigned_url(bucket, key, expires=3600):
          return s3_client.generate_presigned_url(
              'get_object',
              Params={'Bucket': bucket, 'Key': key},
              ExpiresIn=expires
          )
      
    • 生成用于上传的PUT权限URL(如果需要的话):
      def generate_put_presigned_url(bucket, key, expires=3600):
          return s3_client.generate_presigned_url(
              'put_object',
              Params={'Bucket': bucket, 'Key': key},
              ExpiresIn=expires
          )
      
  • 这两个URL的权限完全独立:GET URL只能用于下载,PUT URL只能用于上传,互相不干扰。

额外建议:

  • 在Lambda代码里把两种URL的生成逻辑封装成独立函数,避免混淆,降低误生成错误权限URL的概率。
  • 如果想进一步缩小Lambda的权限范围,可以在IAM策略里明确指定允许操作的S3前缀或对象,比如只允许在my-bucket/uploads/路径下执行PutObject,在my-bucket/public/路径下执行GetObject,进一步提升安全性。

内容的提问来源于stack exchange,提问作者musaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:29:53