如何在不使用 SAM 的情况下使用 AWS 代码部署来部署简单的 AWS lambda 函数?

Posted

技术标签:

【中文标题】如何在不使用 SAM 的情况下使用 AWS 代码部署来部署简单的 AWS lambda 函数?【英文标题】:How do i deploy a simple AWS lambda function using AWS code deploy without using SAM? 【发布时间】:2022-01-06 01:54:55 【问题描述】:

文档说我应该在调用 codedeploy 时以 .yaml 或 .json 格式指定应用程序修订。但是如何通过code deploy来部署实际的功能代码呢?

没有提供包含代码的 zip 的选项。只接受 json 和 yaml 文件。如何通过 codedeploy 实际更新/添加 lambda 函数代码?下图显示即使通过 aws 控制台,我也只能指定 yaml 或 json appspec 文件。

如何在此处实际部署我的功能代码? ![Text]()

【问题讨论】:

【参考方案1】:

您必须在 CodeDeploy (CD) 阶段之前部署它。您可以为此使用CodeBuild (CB)。因此,在您的 CI/CD 管道中,您的 CD 阶段将在 CB 阶段之后执行。 CB 阶段将部署并创建函数的一个版本,然后将其用作 CD 的输入。

【讨论】:

谢谢。我习惯于通过 codedeploy 对 EC2 进行部署,在其中我提供了一个 zip,并且我认为 lambda 代码就这么简单。 aws lambda 的 codedeploy 部署工作流程根本没有提到使用 codebuild,我真的很困惑。 docs.aws.amazon.com/codedeploy/latest/userguide/images/…【参考方案2】:

正如@Marcin 提到的,您需要通过您的代码构建规范yaml 文件更新实际功能。

有很多方法可以让 CI/CD 用于无服务器 lambda 函数。 (Cloudformation、Terraform、CodeDeploy,仅使用 CodeBuild 并更新那里的代码!)

我个人做的是使用 ECR、Docker 镜像来处理 CI/CD 过程,流程如下:

    创建 ECR 存储库 为您的 lambda 函数创建一个 docker 映像 将 docker 镜像推送到 ECR

在您的buildspec.yml 文件中:

    尝试获取 ECR 的凭据 并根据来自代码管道源部分的工件构建 lambda docker 映像 将新的 docker 镜像推送到 ECR 使用 docker 映像更新 lambda。

这是一个示例:

version: 0.2
phases:
  pre_build:
    commands:
      - echo "Build on `date`"
      - aws ecr get-login-password --region ca-central-1 | docker login --username AWS --password-stdin YOUR_ECR_ADDRESS
      - npm run test
  build:
    commands:
      - echo Building the Docker image ... | tee -a log.txt
      - docker build -t YOUR_ECR_ADDRESS/your-lambda:latest . 2>&1 | tee -a log.txt
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push YOUR_ECR_ADDRESS/your-lambda:latest
      - aws lambda update-function-code --function-name your-lambda --image-uri YOUR_ECR_ADDRESS/your-lambda:latest > /dev/null

您还可以将 cloudformation 作为最后阶段,因此您可以通过仅更改模板 yml 文件来更改功能规范,即角色、超时、内存使用等。

【讨论】:

我现在限制自己只使用 codedeploy(这只是一个原型),我创建了一个管道,用于从 github 操作更新 ec2 codedeploy,当我找不到任何类似的东西时,我感到很困惑拉姆达函数。但我想我将不得不像@Marcin 所说的那样使用 codebuild,因为 codedeploy 实际上不会处理 lambda 函数的代码部署,只会处理修订更新。

以上是关于如何在不使用 SAM 的情况下使用 AWS 代码部署来部署简单的 AWS lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 aws 凭据的情况下连接 Redshift 和 Python(在 emr 上运行)

如何在不使用 AWS 53 端点域或任何其他域的 ssl 的情况下使用多容器 docker 在 elasticbeanstalk 中启用 https?

如何在 AWS SAM Cloud-Formation 中使用 Route53 设置自定义域名

如何在不停机的情况下更改 AWS-RDS 实例类型?

如何在不重新启动集群的情况下使用 Fargate 在 AWS EKS 内传播 DNS 主机名(网络更改)和/或角色更改?

PHP-如何在不重新启动 rds 的情况下将 aws.push git 到弹性 beantalk?