如何通过CloudFormation创建Lambda并延后部署Zip代码包?
解决CloudFormation部署Lambda时S3代码包不存在的问题
方案一:分阶段部署栈
第一步:先部署仅包含S3桶和IAM角色的模板
移除原模板中的Lambda资源,只保留桶和角色:AWSTemplateFormatVersion: '2010-09-09' Resources: HostingBucket: Type: AWS::S3::Bucket Properties: BucketName: "my-hosting-bucket" LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole部署该模板,确认桶和角色创建完成。
第二步:上传Lambda代码包到S3桶
使用AWS CLI上传代码:aws s3 cp lambda/backend.zip s3://my-hosting-bucket/lambda/backend.zip也可以通过AWS控制台手动上传文件到对应路径。
第三步:部署完整的CloudFormation模板
恢复原模板中的Lambda资源,重新部署。此时S3桶已有代码包,Lambda可正常创建。后续更新代码时,只需重新上传代码包到S3,再执行CloudFormation栈更新操作,Lambda会自动拉取最新代码。
方案二:用占位代码先创建Lambda,再更新代码
第一步:修改Lambda代码为内嵌占位代码,部署完整模板
调整Lambda的Code部分为内嵌的简单代码:AWSTemplateFormatVersion: '2010-09-09' Resources: HostingBucket: Type: AWS::S3::Bucket Properties: BucketName: "my-hosting-bucket" LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole MyFunction: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: nodejs12.x Role: !GetAtt 'LambdaExecutionRole.Arn' Timeout: 300 Code: ZipFile: | exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Placeholder function'), }; };部署该模板,Lambda会用占位代码创建成功,同时S3桶也已生成。
第二步:上传正式代码包到S3桶
执行上传命令:aws s3 cp lambda/backend.zip s3://my-hosting-bucket/lambda/backend.zip第三步:更新CloudFormation栈,恢复Lambda的S3代码配置
将Lambda的Code部分改回原配置:Code: S3Bucket: !Ref 'HostingBucket' S3Key: !Sub 'lambda/backend.zip'执行栈更新操作,Lambda会自动拉取S3中的最新代码包。后续代码更新时,重复上传代码包+栈更新操作即可。
内容的提问来源于stack exchange,提问作者Titulum
相关产品推荐
相关产品推荐

