Amazon web services Lambda,它使用javascript中的AWS SDK copyobject方法将对象从一个bucket复制到不同帐户中的另一个bucket
我想使用lambda中AWSJavaScriptSDK的Amazon web services Lambda,它使用javascript中的AWS SDK copyobject方法将对象从一个bucket复制到不同帐户中的另一个bucket,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我想使用lambda中AWSJavaScriptSDK的copyObject方法将对象从account-1中的bucket复制到account-2中的其他bucket。现在,它的工作原理是允许account-1中的lambda角色使用s3 bucket策略写入accountaccount-2中的bucket。问题是在account-2中,我们有很多bucket,我们希望避免每次创建写入或读取其中一个bucket的lambda时都向每个bucket添加权限 我正在尝试让account-1中的lam
copyObject
方法将对象从account-1
中的bucket复制到account-2
中的其他bucket。现在,它的工作原理是允许account-1
中的lambda角色使用s3 bucket策略写入accountaccount-2
中的bucket。问题是在account-2
中,我们有很多bucket,我们希望避免每次创建写入或读取其中一个bucket的lambda时都向每个bucket添加权限
我正在尝试让account-1
中的lambda承担具有在account-2
中写入和读取权限的角色,如下所示
account-2
中,我的角色名为s3-account-2-full-access
,具有AmazonS3FullAccess
策略和以下信任关系:
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::11111111111:role/lambda-account-1-role"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
account-1
中,我有lambda-account-1-role
,并附上以下政策
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::22222222222:role/s3-account-2-full-access"
}
]
}
这里的问题是,在
copyObject
期间,我得到了错误AccessDenied
。也许我误解了什么,但我不知道如何将对象从account-1复制到account-2,而不必编辑account-2中的bucket策略。您需要使用刚刚获得的假定角色权限执行S3,我认为您缺少它:)
作为奖励积分:
- 您在每个lambda执行中都扮演角色并实例化s3对象,这不是必需的,您可以通过处理程序函数来提高性能
- nodejs SDK用于为每个对象提供一个
方法,因此您可能可以执行以下操作,以避免在.promise()
函数中出现丑陋的承诺/回调(就像您在s3调用中所做的那样):getCrossAccountCredentials
const data=wait sts.assumeRole(sts_params).promise()代码>
accessparams2
。但具体在哪里使用?在我看来,您仍然在使用lambda角色,而不是创建var s3=new AWS.s3()时假定的角色
@RogerMP谢谢你的帮助。我刚刚在var s3=new AWS.s3()中添加了deaccessparams2
在访问S3的过程中,我仍然收到AccessDenied
。使用listObjects
方法,我可以从其他帐户读取存储桶。但是我不能使用copyObject
方法。嗨,我终于找到了解决方案。此外,在解决方案中,还有一件事是向要复制的对象添加所需的权限。例如,在我的例子中,我已经公开了对象,最后,我可以设法将对象复制到另一个帐户
const sts = new AWS.STS();
exports.handler = async (event) => {
const timestamp = (new Date()).getTime();
var sts_params = {
RoleArn: 'arn:aws:iam::22222222222:role/s3-account-2-full-access',
RoleSessionName: `id-${timestamp}`,
DurationSeconds: 3600,
};
const { Credentials } = await sts.assumeRole(sts_params).promise();
const { AccessKeyId, SecretAccessKey, SessionToken } = Credentials;
const accessparams2 = {
accessKeyId: AccessKeyId,
secretAccessKey: SecretAccessKey,
sessionToken: SessionToken,
};
var s3 = new AWS.S3(accessparams2);
var params = {
Bucket: "account-2-bucket",
CopySource: "/account-1-bucket/file.txt",
Key: "file.txt"
};
const result = await s3.copyObject(params).promise();
const response = {
statusCode: 200,
body: JSON.stringify(result),
};
return response;
};
var s3 = new AWS.S3(accessparams2);