我希望使用lambda中的account-1中AWSJavaScriptSDK的copyObject方法将对象从account-2中的桶复制到其他桶中。现在,它的工作方式是允许account-1中的lambda角色使用account-2中的s3桶策略在s3中写入s3。问题是,在account-2中,我们有很多桶,我们希望避免每次创建一个写入或读取其中一个桶的lambda时,对每个桶都添加权限。
我正在尝试让account-1中的lambda承担在account-2中写入和读取的权限,如下所示。
account-2 I具有一个名为s3-account-2-full-access的角色,它具有AmazonS3FullAccess策略和以下信任关系:“版本”:"2012-10-17",“声明”:{“效果”:“允许”,“主体”:{ "AWS":"arn:aws:iam::11111111111:role/lambda-account-1-role“},”操作“:"sts:AssumeRole",”条件“:{} }
account-1 I有一个带有以下策略的lambda-account-1-role。“版本”:"2012-10-17",“声明”:{ "Sid":"VisualEditor0",“效果”:“允许”,“行动”:"sts:AssumeRole",“资源”:"arn:aws:iam::22222222222:role/s3-account-2-full-access“}
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;
};这里的问题是,我在AccessDenied过程中得到了错误的copyObject。也许我误解了什么,但我不知道如何才能将对象从帐户1复制到帐户2,而不需要编辑帐户2中的桶策略。
发布于 2020-07-09 12:03:39
您需要使用您刚刚获得的假定角色权限来执行S3,我认为您缺少它:)
var s3 = new AWS.S3(accessparams2);加分如下:
在每个lambda执行中,您要承担角色并实例化performance
.promise()方法,因此您可能可以执行如下操作,以避免getCrossAccountCredentials函数中的丑陋承诺/回调(就像对s3调用那样):https://stackoverflow.com/questions/62811782
复制相似问题