我有一个Lambda函数,该函数与我的Cloudfront发行版关联。
我想通过egde @ lambda函数访问一些S3 Bucket对象。我没有找到一种方法来做到这一点,也不知道什么是最好的方法并且延迟最小。
我不想使用对存储桶的http调用来访问存储桶对象,因为这会给Cloudfront响应带来一些延迟。
任何人都知道如何在边缘lambda函数中访问与Cloudfront发行版相关的S3存储桶吗?
非常感谢。
答案 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)
})
}