使用 AWS CDK 创建多个堆栈时,可能需要在这些堆栈之间共享 Lambda 函数。然而,在尝试共享 Lambda 函数时,您可能会遇到问题。目前,AWS CDK 不支持将同一个 Lambda 函数添加到多个堆栈中的 CloudFormation 模板。
解决方法是将 Lambda 函数作为构造函数的参数传递给堆栈。这相当于在不同的堆栈中创建两个 Lambda 函数,然后将它们合并成一个。
下面是一个包含共享Lambda函数的AWS CDK TypeScript示例(注意:该代码片段需要aws-cdk-lib和aws-cdk-lib-lambda包):
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as snsSubs from 'aws-cdk-lib/aws-sns-subscriptions';
import * as sqs from 'aws-cdk-lib/aws-sqs';
export class SharedLambdaStack extends cdk.Stack {
public readonly sharedFunction: lambda.Function;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Create the shared Lambda function
this.sharedFunction = new lambda.Function(this, 'SharedFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'index.handler',
code: lambda.Code.fromAsset(`${__dirname}/shared-lambda`),
memorySize: 256,
timeout: cdk.Duration.seconds(30),
});
}
}
interface SqsS3StackProps extends cdk.StackProps {
readonly sharedFunction: lambda.Function;
}
export class SqsS3Stack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props: SqsS3StackProps) {
super(scope, id, props);
// Create an S3 bucket
const bucket = new s3.Bucket(this, 'Bucket');
// Create an SNS topic
const topic = new sns.Topic(this, 'Topic');
// Subscribe an SNS topic to the shared Lambda function
topic.addSubscription(new snsSubs.LambdaSubscription(props.sharedFunction));
// Create an SQS queue
const queue = new sqs.Queue(this, 'Queue');
// Subscribe an SQS queue to the shared Lambda function
props.sharedFunction.addEventSource