在CDK中,为什么Lambda函数的角色是可选的?授予权限的惯用方式是什么?

In CDK, why is a Lambda Function's Role Optional? What is the idiomatic way to grant permissions to it?

note CDK Lambda 函数的 role 属性 是 iam.IRole | undefined 类型。这让我感到惊讶 - Lambda 函数怎么可能在没有角色充当的情况下存在?

实际上,这令人沮丧,因为这意味着,而不是:

const dynamoTable = new Table(...);
const func = new Function(...);
dynamoTable.grantReadWriteData(func.role);

,我必须改为

[...]
if (typeof func.role !== 'undefined') {
  dynamoTable.grantReadWriteData(func.role);
}

(尽管至少我印象深刻的是 TypeScript 可以确定 属性 是在 if 块中定义的,如果相反,我提取 const funcRole = func.role

有没有更惯用的方法来做到这一点?

CDK代码,如果我们不传递角色,它会创建一个具有默认权限AWSLambdaBasicExecutionRoleAWSLambdaVPCAccessExecutionRole

的角色

来自文档:

Lambda functions assume an IAM role during execution. In CDK by default, Lambda functions will use an autogenerated Role if one is not provided.

The autogenerated Role is automatically given permissions to execute the Lambda function.

我们总是可以通过调用函数 addToRolePolicy 来添加额外的权限。或者通过调用对其他资源(如 dynamoDb 或日志组等)的授予权限

假设我们的 lambda 是这样创建的

const myFun = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_10_X,
  handler: 'index.handler',
  code: ...})

我们可以这样添加权限:

 myFun.role.addToRolePolicy(
        new iam.PolicyStatement({
            resources: ['*'],
            actions: [...],
        })
    );

或 假设我们想授予写入日志组的访问权限,我们可以这样做,这会将额外的内联策略附加到 lambda 角色。

const logGroup = new awsLogs.LogGroup(this, `my-fun`, {
    retention: 30,
    logGroupName: `/aws/lambda/${functionName}`,
    removalPolicy: cdk.RemovalPolicy.DESTROY,
});
logGroup.grantWrite(this.myFun);

与 DynamoDB 类似,对于 dynamoTable.grantReadWriteData 方法,我们需要传递函数本身,而不是角色。所以,

而不是

dynamoTable.grantReadWriteData(myFun.role);

我们应该做的

dynamoTable.grantReadWriteData(myFun);