0

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

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

我不想使用对存储桶的 http 调用来访问存储桶对象,因为它会给云端响应带来一些延迟。

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

非常感谢。

4

1 回答 1

3

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

每个 Lambda 函数都有一个与之关联的 IAM 角色(执行角色)。您在创建 Lambda 函数时指定 IAM 角色。您授予此角色的权限决定了 AWS Lambda 在担任该角色时可以执行的操作。

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

您可以通过创建策略并将它们附加到 IAM 身份(用户、用户组或角色)或 AWS 资源来管理 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<account><bucket-name>需要替换为正确的值。

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

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)
  })
}
于 2019-01-08T00:01:48.300 回答