You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:27