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"
我正在使用 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"