您如何动态授予 AWS Lambda 函数访问资源的权限?
How can you dynamically grant permissions to an AWS Lambda function to access resources?
我在 AWS 中创建了一个 lambda 函数,用于基于查找访问资源。
例如:我想通过 API 网关为客户 FOO 查询 dynamoDB table FOO_BAR。
收到请求,我确定了它的 table FOO 是必需的,我希望能够对我当前的 lambda function/session 应用一个策略,该策略将授予对 FOO_BAR table.
我的问题是:为了使 lambda 函数能够查询 table FOO_BAR,创建 lambda 函数时配置的执行角色需要具有读取权限,而我不想授予此角色任何通配符访问权限。
使用的 API 通过自定义授权方,我在这里应用了访问 API 的策略;我也希望我能让我的 lambda 函数也继承自定义授权器生成的策略。
能否动态授予 lambda 函数访问资源的权限?
谢谢!
您的 Lambda 函数无法从您的自定义授权方继承权限。
您可以在 Lambda 函数内授予权限或生成新的 IAM 凭据,并通过单独的客户端实例将它们用于 DynamoDB 调用。
我不确定您的方法是否比通配符提供任何安全优势。给自己授予权限的函数具有完全相同的安全级别。
您可以使用AWS.STS assumeRole 函数
/**
* Assume Role for cross account operations
*/
assumeRole() {
let policy = {
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::356035958081:role/xyzRole"
}
};
let params = {
RoleArn: 'arn:aws:iam::356035958081:role/xyzRole',
RoleSessionName: 'awssdk',
Policy: JSON.stringify(policy)
};
console.info("Assuming Role with params:", params);
let sts = new AWS.STS();
return new Promise((resolve, reject) => {
sts.assumeRole(params, (error, data) => {
if (error) {
console.log(`Could not assume role, error : ${JSON.stringify(error)}`);
reject({
statusCode: 400,
message: error["message"]
});
} else {
console.log(`Successfully Assumed Role details data=${JSON.stringify(data)}`);
resolve({
statusCode: 200,
body: data
});
}
})
});
}
这将 return 凭据
Credentials.AccessKeyId,
Credentials.SecretAccessKey,
Credentials.SessionToken
我在 AWS 中创建了一个 lambda 函数,用于基于查找访问资源。
例如:我想通过 API 网关为客户 FOO 查询 dynamoDB table FOO_BAR。
收到请求,我确定了它的 table FOO 是必需的,我希望能够对我当前的 lambda function/session 应用一个策略,该策略将授予对 FOO_BAR table.
我的问题是:为了使 lambda 函数能够查询 table FOO_BAR,创建 lambda 函数时配置的执行角色需要具有读取权限,而我不想授予此角色任何通配符访问权限。
使用的 API 通过自定义授权方,我在这里应用了访问 API 的策略;我也希望我能让我的 lambda 函数也继承自定义授权器生成的策略。
能否动态授予 lambda 函数访问资源的权限?
谢谢!
您的 Lambda 函数无法从您的自定义授权方继承权限。
您可以在 Lambda 函数内授予权限或生成新的 IAM 凭据,并通过单独的客户端实例将它们用于 DynamoDB 调用。
我不确定您的方法是否比通配符提供任何安全优势。给自己授予权限的函数具有完全相同的安全级别。
您可以使用AWS.STS assumeRole 函数
/**
* Assume Role for cross account operations
*/
assumeRole() {
let policy = {
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::356035958081:role/xyzRole"
}
};
let params = {
RoleArn: 'arn:aws:iam::356035958081:role/xyzRole',
RoleSessionName: 'awssdk',
Policy: JSON.stringify(policy)
};
console.info("Assuming Role with params:", params);
let sts = new AWS.STS();
return new Promise((resolve, reject) => {
sts.assumeRole(params, (error, data) => {
if (error) {
console.log(`Could not assume role, error : ${JSON.stringify(error)}`);
reject({
statusCode: 400,
message: error["message"]
});
} else {
console.log(`Successfully Assumed Role details data=${JSON.stringify(data)}`);
resolve({
statusCode: 200,
body: data
});
}
})
});
}
这将 return 凭据
Credentials.AccessKeyId,
Credentials.SecretAccessKey,
Credentials.SessionToken