【问题标题】:AWS CDK: Lambda resource based policy for a function with an aliasAWS CDK:具有别名的函数的基于 Lambda 资源的策略
【发布时间】:2022-03-08 04:44:54
【问题描述】:

我正在使用 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 但我不确定别名是否也有与版本相同的问题。

【问题讨论】:

  • 我做到了,但他们都没有解决我面临的问题。我已经添加了我自己对帮助我解决问题的问题的答案。

标签: amazon-web-services aws-lambda amazon-iam aws-cdk


【解决方案1】:

以下为别名生成预期的跨账户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',
});

【讨论】:

  • 你是如何测试它的?您是否尝试使用实时别名从另一个 AWS 账户实际拨打电话?我检查了 lambda 配置选项卡下的权限,我没有看到任何添加到实时别名的权限
  • @PodGen4 我的回答使用 CDK 的 Testing Constructs 来断言 CloudFormation 模板中存在权限。您可以手动检查 CDK 是否发挥了作用:在堆栈的.template.json(在cdk.out)中搜索AWS::Lambda::Permission 资源。此测试在部署之前进行。
  • @PodGen4 部署堆栈后,AWS::Lambda::Permission 资源应列在 CloudFormation 控制台(堆栈 > 资源)中。在 Lambda 控制台中,首先选择别名(检查 > Alias:live 是面包屑)。权限应列在基于资源的策略部分中。
  • 我没有使用 CDK 的测试构造,而是直接部署到 AWS 账户。并且使用 this.alias.addPermission(...) 并没有在 CFN 堆栈中创建别名权限。我检查了相关 CFN 堆栈的输出选项卡,但找不到基于别名的权限。
【解决方案2】:

我尝试了其他答案,但是我没有看到在 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"

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2023-02-09
    • 2020-02-17
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多