如何创建可复用CloudFormation模板部署Lambda函数并兼容现有IAM、VPC、SG
可复用Lambda函数的CloudFormation模板(支持现有资源)
核心设计思路
通过CloudFormation的**参数(Parameters)**接收现有资源的标识(ARN/ID),让模板无需创建新的IAM角色、VPC子网或安全组,直接复用已有资源,实现跨环境的复用性。
完整模板示例
AWSTemplateFormatVersion: '2010-09-09' Description: 可复用Lambda函数模板,支持引用现有IAM角色、VPC、安全组 Parameters: LambdaFunctionName: Type: String Description: Lambda函数名称 LambdaRuntime: Type: String Description: Lambda运行时环境(例如:python3.11) Default: python3.11 LambdaHandler: Type: String Description: Lambda处理程序路径(例如:index.lambda_handler) LambdaCodeS3Bucket: Type: String Description: 存放Lambda代码包的S3桶名称 LambdaCodeS3Key: Type: String Description: Lambda代码包在S3中的键路径 ExistingIAMRoleARN: Type: String Description: 现有IAM角色的ARN,需具备Lambda执行权限 ExistingVpcSubnetIds: Type: List<String> Description: 现有VPC子网ID列表(如果Lambda需要部署在VPC内) Default: [] ExistingSecurityGroupIds: Type: List<String> Description: 现有安全组ID列表(如果Lambda需要部署在VPC内) Default: [] Resources: ReusableLambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Ref LambdaFunctionName Runtime: !Ref LambdaRuntime Handler: !Ref LambdaHandler Code: S3Bucket: !Ref LambdaCodeS3Bucket S3Key: !Ref LambdaCodeS3Key Role: !Ref ExistingIAMRoleARN VpcConfig: Fn::If: - IsInVpc - SubnetIds: !Ref ExistingVpcSubnetIds SecurityGroupIds: !Ref ExistingSecurityGroupIds - !Ref AWS::NoValue Environment: Variables: # 可根据需求添加环境变量,同样支持参数传入 ENVIRONMENT: !Ref AWS::StackName Conditions: IsInVpc: Fn::Not: - Fn::Equals: - !Join ["", !Ref ExistingVpcSubnetIds] - ""
关键细节说明
- 参数化现有资源:
ExistingIAMRoleARN直接传入已有角色ARN,ExistingVpcSubnetIds和ExistingSecurityGroupIds支持传入多个子网/安全组ID,适配VPC内或VPC外的部署场景。 - 条件判断VPC部署:通过
IsInVpc条件,当未传入子网ID时自动跳过VpcConfig配置,模板同时支持VPC内和无VPC的Lambda部署。 - 代码包灵活配置:通过S3存储代码包,避免模板内嵌代码,进一步提升复用性。
使用示例(AWS CLI)
aws cloudformation deploy \ --stack-name my-reusable-lambda \ --template-file lambda-reusable-template.yaml \ --parameter-overrides \ LambdaFunctionName=MyReusableFunc \ LambdaHandler=index.handler \ LambdaCodeS3Bucket=my-code-bucket \ LambdaCodeS3Key=lambda-code.zip \ ExistingIAMRoleARN=arn:aws:iam::123456789012:role/ExistingLambdaRole \ ExistingVpcSubnetIds=subnet-123456,subnet-7890ab \ ExistingSecurityGroupIds=sg-abc123
内容的提问来源于stack exchange,提问作者Dara kiran
相关产品推荐
相关产品推荐

