【问题标题】:How access S3 bucket object in cloudfront lambda@Edge Function?如何在 cloudfront lambda@Edge 函数中访问 S3 存储桶对象?
【发布时间】:2019-06-02 15:17:31
【问题描述】:

我有一个与我的云端分发相关联的 Lambda 函数。

我想在 egde@lambda 函数中访问一些 S3 Bucket 对象。我没有找到一种方法来做到这一点,也不知道什么是最好的方法并且有最小的延迟。

我不想使用对存储桶的 http 调用来访问存储桶对象,因为这会导致云端响应延迟。

有人知道我如何在边缘 lambda 函数中访问与我的云端分发相关的 S3 存储桶吗?

非常感谢。

【问题讨论】:

  • “我不想使用 http 调用访问存储桶对象” 这就是您访问存储桶中的对象的方式——S3 只使用 HTTP,而 SDK 使用 HTTP,所以不清楚你的意思是什么,所以也不清楚你实际上想要完成什么。
  • 你好@michael-sqlbot。我知道存储桶对象只能通过 http 请求访问,但我只是想知道是否有某种方法可以从云端分发的同一区域访问存储桶资源,以避免延迟和访问时间。我担心 lambda 执行请求和接收响应所需的时间,因为这会影响我的 Web 应用程序的每个传入请求,并可能影响性能。非常感谢您的回复!
  • 我仍然不清楚您实际上要解决什么问题。存储桶中有什么,您如何在 Lambda@Edge 中使用它?

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront aws-lambda-edge


【解决方案1】:

您需要向与您的 lambda 关联的 IAM 角色授予权限。来自AWS docs

每个 Lambda 函数都有一个关联的 IAM 角色(执行角色) 它。您在创建 Lambda 函数时指定 IAM 角色。 您授予此角色的权限决定 AWS Lambda 可以做什么 当它担任角色时。

要从 lambda 读取和写入 S3 存储桶,您需要将 IAM 策略附加到与您的 lambda 关联的 IAM 角色。来自AWS docs

您在 AWS 中通过创建策略并将其附加到 IAM 身份(用户、用户组或角色)或 AWS 资源。一种 策略是 AWS 中的一个对象,当它与身份或 资源,定义他们的权限。 AWS 在以下情况下评估这些策略 主体实体(用户或角色)提出请求。中的权限 策略确定是允许还是拒绝请求。最多 策略作为 JSON 文档存储在 AWS 中。 AWS 支持六种类型 策略:基于身份的策略、基于资源的策略、 权限边界、组织 SCP、ACL 和会话 政策。

使用此 IAM 策略授予对与您的 lambda 关联的 IAM 角色的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account>:role/service-role/LAMBDA_ROLE_NAME"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        }
    ]
}

OBS&lt;account&gt;&lt;bucket-name&gt; 需要替换为正确的值。

之后,下面的代码应该可以工作了:

import aws from 'aws-sdk'

export default (event, context, callback) => {
  const s3 = new aws.S3()

  s3.getObject({
    Bucket: 'name-of-bucket',
    Key: 'my-key'
  }, (err, data) => {
    if (err) {
      callback(err)
      return
    }

    const objectData = data.Body.toString('utf-8')
    console.log(objectData)
  })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2020-07-15
    • 2019-01-26
    • 2019-04-23
    • 2020-01-14
    • 2019-04-13
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多