如何动态授予AWS Lambda函数访问资源的权限?

时间:2016-08-23 08:21:48

标签: amazon-web-services dynamic resources aws-lambda policy

我在AWS中创建了一个lambda函数,用于根据查询访问资源。

例如:我想通过API网关为客户FOO查询dynamoDB表FOO_BAR。

请求进来,我确定了其所需的表FOO,我希望能够将策略应用于我当前的lambda函数/会话,该函数/会话将授予对FOO_BAR表的访问权。

我的问题是:为了使lambda函数能够查询表FOO_BAR,在创建lambda函数时配置的执行角色需要具有读访问权限,并且我不想授予对此角色的任何通配符访问权限

使用的API通过自定义授权程序,我在这里应用了一个访问API的策略;我也希望我能让我的lambda函数继承自定义Authorizer生成的策略。

您是否可以动态授予lambda函数访问资源的权限?

谢谢!

2 个答案:

答案 0 :(得分:0)

您的Lambda函数无法继承自定义授权程序的权限。

您可以在Lambda函数中授予权限或生成新的IAM凭据,并通过单独的客户端实例将其用于DynamoDB调用。

我不确定您的方法是否比通配符提供任何安全优势。授予自身权限的功能具有完全相同的安全级别。

答案 1 :(得分:0)

您可以使用AWS.STS承担角色功能

/**
 * 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
                });
            }
        })
    });

}

这将返回凭据

        Credentials.AccessKeyId,
        Credentials.SecretAccessKey,
        Credentials.SessionToken