我需要一个组件来创建大量的CodeCommit用户。CloudFormation不支持为IAM用户添加公共SSH密钥,因此我必须创建自己的SSH密钥。CDK附带了AwsCustomResource,它完成了创建处理所需CloudFormation事件的Lambda的繁重工作。换句话说,我的代码应该是这样的:
import { User } from 'aws-cdk-lib/aws-iam';
import { AwsCustomResource } from 'aws-cdk-lib/custom-resources';
import { Construct } from 'constructs';
export interface CodeCommitUserProps {
userName: string;
emailAddress: string;
sshPublicKey: string;
}
export class CodeCommitUser extends Construct {
constructor(scope: Construct, id: string, props: CodeCommitUserProps) {
super(scope, id);
const user = new User(this, 'codecommit-' + props.userName, {
userName: 'codecommit-' + props.userName,
path: '/git/users'
});
}
const custom = new AwsCustomResource(this, ... );
}现在,如果我调用new CodeCommitUser(...)几百次,我会假设每个用户都会有一个CloudFormation事件Lambda,即使它们都是相同的。如果我需要自定义资源的多个副本,是否有方法重用AwsCustomResource创建的Lambdas?
发布于 2022-01-17 18:48:21
我假设每个用户都会有一个CloudFormation事件Lambda,即使它们都是相同的。
实际上,不是。无论CodeCommitUser实例化多少次,CDK都会创建单个lambda函数。CDK是如何管理这一点的?在CDK下,CDK为AWSCustomResource提供程序使用一个AWSCustomResource(参见github源)。保证将单例函数添加到堆栈“一次而且只有一次,而不管构造被声明多少次为堆栈的一部分”。
如果我需要自定义资源的多个副本,是否有方法重用AwsCustomResource创建的Lambdas?
再一次,重用是自动发生的。您可以通过定义了多个cdk synth-ing的堆栈向自己证明这一点。然后在cdk.out目录中查找输出的CloudFormation模板。模板只定义了一个AWS::Lambda::Function资源(假设应用程序没有在其他地方使用lambdas )。
发布于 2022-01-17 15:23:01
您可以创建自定义资源lambda并将其部署到单独的模板中。然后你可以从你想要的模板中调用它。您可以从单个模板多次调用此资源。您可以一次发送一个用户列表,或者为每个用户创建一个资源(如果您说几百个用户的话,可能不太理想)。
https://stackoverflow.com/questions/70729034
复制相似问题