您如何动态授予 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