【问题标题】:AWS Lambda Access from S3 Only with API Gateway仅使用 API Gateway 从 S3 访问 AWS Lambda
【发布时间】:2020-11-12 08:53:53
【问题描述】:

我想要完成的是允许 lambda 函数由来自指定 S3 存储桶的请求执行。 API Gateway 用于与 lambda 函数进行通信。我只需要允许使用基于 S3 存储桶的端点。

我可以设置 CORS,但这不是我打算做的。我需要的不仅仅是浏览器安全性。 我所有允许的请求必须仅来自 S3 存储桶。如何在 API Gateway 中创建这样的策略或验证?或者有没有其他方法可以完成这项任务?

我现在解释更多。所以认为我有一个具有静态网站的 S3 存储桶。我也有一个 lambda 函数。现在我的网站想要加载一些数据,所以我正在使用我的 API 网关调用 lambda 函数。 API 现已开放。没有身份验证或 CORS。如果请求仅来自特定的 S3 存储桶,我需要我的 API 网关来允许请求。我们不希望 API 只是开放的。现在 CORS 只是浏览器安全性,所以我们想要的不止这些。我为这个特定的用例搜索了很多,但找不到任何东西。

【问题讨论】:

  • 如何让 S3 代表您发出请求?不只是静态内容托管。
  • 就目前而言,您要做什么还不是很清楚。是否允许 S3 在将对象上传到该存储桶时触发特定的 Lambda 函数?是否将特定 Lambda 的调用限制为来自给定 S3 存储桶的 S3 事件,并且仅限于该存储桶? API 网关与此有什么关系?
  • @jarmod 我明确表示我正在使用 API 网关来触发我的 lambda 函数,这里不会触发 S3 事件。 S3 没有代表我发出任何请求,它是向 API 网关发送的 http 请求,我们需要 API 网关了解请求的来源。
  • 好的,“允许 lambda 函数被来自指定 S3 存储桶的请求执行”是什么意思?您是指从 S3 存储桶中的静态托管内容提供的网页吗?
  • 这就是我们使用 API 网关的原因。

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway


【解决方案1】:

S3 不是“调用”其他服务(例如 Lambda 或 API Gateway)的服务。

我相信您正在寻找的是利用 S3 事件,在这种情况下,来自 S3 的事件(如对象创建)可以触发 lambda 执行。见这里:https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

【讨论】:

  • 这不是我的问题,我知道 S3 事件,但正如我的问题中所述,我需要 API Gateway 来了解请求的来源。 API 网关必须只允许来自 S3 存储桶的请求。需要我详细说明吗?
【解决方案2】:

我想限制世界使用 lambda,但只允许从我的 S3 访问它。我再次使用 API 网关进行通信。

由于您想限制世界访问您的 lambda 函数,基本上您需要将您的 AWS Lambda 放在 VPC 中,并使您的 API Gateway 私有API Gateway 需要有一个资源策略,它是一个JSON 对象,指定可以访问AWS LambdaVPC(或一组IP 地址)。 VPC 范围之外的任何请求都将被API Gateway 阻止。

  • 创建VPC

  • 将此VPC 分配给您的 lambda 函数

  • 使用以下 S3 policy 创建一个 IAM 角色,以指定哪个存储桶可以访问您的 lambda 函数。将此角色附加到您的 lambda 函数。

    {
       "Version": "2012-10-17",
       "Statement": [
           {
             "Sid": "VisualEditor0",
             "Effect": "Allow",
             "Action": "s3:*",
             "Resource": [
                 "arn:aws:s3:::your-s3-bucket/*",
                 "arn:aws:s3:::your-s3-bucket"
             ]
          }
       ]
    }
    
  • 您需要将您的API Gateway 设为私有(您将在设置中找到此选项)并为其分配资源策略:

    {
       "Version": "2012-10-17",
       "Statement": [
           {
             "Effect": "Allow",
             "Principal": "*",
             "Action": "execute-api:Invoke",
             "Resource": "arn:aws:execute-api:{region}:{accountId}:{api-id}/*/*/*",
             "Condition": {
                 "StringEquals": {
                     "aws:sourceVpc": "vpc-1234"
                 }
              }
           }
        ]
    }
    

进行这些更改后,不要忘记重新部署您的 API Gateway

编辑:如果您想限制S3 存储桶访问,请导航到您的存储桶,它将有一个称为Bucket Policy 的东西。向其中添加以下示例存储桶策略(您需要根据您的用例对其进行编辑)。此策略将拒绝存储桶访问指定的VPC 之外的所有内容。

请参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html:

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
      {
          "Sid": "Access-to-specific-VPC-only",
          "Principal": "*",
          "Action": "s3:*",
          "Effect": "Deny",
          "Resource": ["arn:aws:s3:::yours3bucket",
                "arn:aws:s3:::yous3bucket/*"],
          "Condition": {
               "StringNotEquals": {
                  "aws:SourceVpc": "vpc-1234"
                }
           }
        }
     ]
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2017-05-01
    • 2016-01-11
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多