如何在Cloudfront Lambda @ Edge函数中访问S3存储桶对象?

时间:2019-01-07 23:14:36

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

我有一个Lambda函数,该函数与我的Cloudfront发行版关联。

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

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

任何人都知道如何在边缘lambda函数中访问与Cloudfront发行版相关的S3存储桶吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您需要授予与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 :{<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)
  })
}