AWS CDK:针对具有别名的函数的基于 Lambda 资源的策略

AWS CDK: Lambda resource based policy for a function with an alias

我正在使用 CDK 创建一个 lambda,一个新版本的 lambda,并将“live”别名指向最新版本的 lambda,就像这样

        const func = new lambda.Function(this, 'lambdaName', {
            // Other properties 
            description: `Generated on: ${new Date().toISOString()}`,
        });

        const version = func.addVersion(new Date().toISOString());

        const alias = new lambda.Alias(this, 'lambdaName-alias', {
            aliasName: 'live',
            version: version,
        });

现在,我想向别名 live 添加基于资源的权限,而不仅仅是主要的 lambda 函数。

我认为这会起作用,但它根本不会创建任何基于资源的权限:

     alias.addPermission('CrossAccountAccessId', {
       action: 'lambda:InvokeFunction',
       principal: new ArnPrincipal('ACOUNT_NUMBER_XXX')
     });

如何使用 AWS CDK 为别名添加权限?

我提到这个基于资源的别名权限:https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html#versioning-permissions-alias

对于 CDK 文档,我阅读了以下内容:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.Alias.html#addwbrpermissionid-permission

我认为这可能与 AWS CDK 中的一个错误有关,在该错误中,在 lambda 版本上添加基于资源的策略失败,如下所述:AWS CDK: Resource Policies are not being granted for Lambda Version 但我不确定别名是否也有同样的问题版本。

以下为别名生成预期的 cross-account lambda permission。我使用 CDK v2,尽管 v1 也可以。

addVersion 方法 is deprecated 并在 v2 中完全删除。 “相反,使用 this.currentVersion 获取对版本资源的引用,当函数配置(或代码)更改时自动重新创建该版本资源”.

const alias = func.currentVersion.addAlias('live');

// `iam.ArnPrincipal` will work (cdk does not validate the format), but, `iam.AccountPrincipal` is semantically correct in your case.
const principal = new iam.AccountPrincipal('123456789012');

这3种权限方式are equivalent:

this.alias.grantInvoke(principal);

this.alias.addPermission('CrossAccountPermission', { principal });

this.alias.addPermission('CrossAccountPermission', {
  action: 'lambda:InvokeFunction', // this is the default value
  principal,
});

权限已按预期创建。此测试通过以上 3 种方法中的任何一种:

// MyStack.test.ts
const cfnAlias = stack.alias.node.defaultChild as lambda.CfnAlias;

template.hasResourceProperties('AWS::Lambda::Permission', {
  Action: 'lambda:InvokeFunction',
  FunctionName: { Ref: stack.resolve(cfnAlias.logicalId) },
  Principal: '123456789012',
});

我尝试了其他答案,但是我没有看到在 CFN 堆栈的模板选项卡下创建别名权限。

我最终在 CDK 代码中使用了 CFN L1 原语,如下所示:

const cfnPermission = new lambda.CfnPermission(this, 'LambdaInvokeAccessRemote', {
            action: 'lambda:InvokeFunction',
            functionName: alias.functionName,
            principal: "ACCOUNT_NUMBER"
});

在那之后,我能够在 CFN 堆栈的模板选项卡下看到基于别名的权限:

LambdaInvokeAccessRemote:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName:
        Fn::Join:
          - ""
          - - Fn::Select:
                - 6
                - Fn::Split:
                    - ":"
                    - Ref: LambdaAlias273D1F4C
            - :live
      Principal: "ACCOUNT_NUMBER"