在AWS CodeBuild中使用`sam build`是否可行/推荐?

8
这个问题源自这个问题。现在我对那里出了什么问题有了更好的理解,并且有了一个可行但不完美的解决方案,我正在提交一个更加专注的后续问题(我在StackOverflow上还是个新手-请告诉我这是否违反了礼仪,我应该跟进原始问题)。 此页面建议:“您可以使用AWS CodeBuild构建、本地测试和打包无服务器应用程序”。但是,当我在我的buildspec.yml中包含sam build命令时,我会得到以下日志输出,表明sam未安装在CodeBuild映像上:
[Container] 2018/12/31 11:41:49 Running command sam build --use-container 
sh: 1: sam: not found 

[Container] 2018/12/31 11:41:49 Command did not exit successfully sam build --use-container exit status 127 
[Container] 2018/12/31 11:41:49 Phase complete: BUILD Success: false 
[Container] 2018/12/31 11:41:49 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: sam build --use-container. Reason: exit status 127 

此外,如果我使用pip install aws-sam-cli安装SAM,并在CodeBuild中运行sam build --use-container,会出现错误。虽然sam build本身成功了,但由于它没有安装测试依赖项,我仍然需要使用pip install -r tests/requirements-test.txt -t .才能在CodeBuild中运行测试。此外,这篇文章表明"具有本地编译程序的包"需要使用--use-container
这让我想知道是否我正在尝试做错了什么。 在AWS的CI/CD工作流程中,构建SAM服务的推荐方法是什么
4个回答

6

2019年10月18日 - 更新(确认@Spiff上面的答案):

显然Codebuild现在可以与SAM无缝协作,这就是我在使用pandaspsycopg2-binary的lambda函数中所需要在buildspec.yml中的全部内容:

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.7

  pre_build:
    commands:
      - python -m unittest discover tests

  build:
    commands:
      - sam build

  post_build:
    commands:
      - sam package --output-template-file packaged.yaml --s3-bucket my-code-pipeline-bucketz

artifacts:
  type: zip
  files:
    - packaged.yaml

干杯


4
请查看以下适用于我在使用AWS SAMAWS CodeBuild以及cloudformation.ymlbuildspec.yaml
phases:
  build:
    commands:
      - pip install --user aws-sam-cli
      - USER_BASE_PATH=$(python -m site --user-base)
      - export PATH=$PATH:$USER_BASE_PATH/bin
      - sam build -t cloudformation.yml
      - aws cloudformation package --template-file .aws-sam/build/template.yaml --s3-bucket <TARGET_S3_BUCKET> --output-template-file cloudformation-packaged.yaml
      - aws s3 cp ./cloudformation-packaged.yaml <TARGET_S3_BUCKET>/cloudformation-packaged.yaml   

在结果中,我会得到一个部署包和TARGET_S3_BUCKET中打包的cloudformation模板。
对于./src文件夹中的每个函数,我都有一个requirements.txt文件,其中包含所有依赖项,但我不会手动运行pip install -r requirements.txt

1
嘿Lech!感谢你的示例。鉴于这只安装了您的源要求(而不是测试要求-例如requests-mockpytest等),那么在构建期间如何运行测试?此设置是否允许您使用“具有本地编译程序的软件包”(通常需要sam build --use-container)?您为什么要将“cloudformation-packaged.yaml”文件导出到S3,而不是直接在CodePipeline的“部署”阶段中引用它? - scubbo
大家好,问题都很好! :) 1. 我不在这里进行测试,我只使用CodeBuild进行构建。如果您想要进行测试,那么我建议您运行pip。2. 至于移动打包文件,我猜您可以使用CodeDeploy来完成,但由于我的文件夹结构非常特定和不寻常,所以我最终使用AWS CLI手动完成了此操作 :) - Lech Migdal
明白了,谢谢!我会等待一个更完整和/或普遍适用的答案,但看到别人的设置对我很有帮助,谢谢! - scubbo
@LechMigdal 只是好奇,您没有使用 sam package 命令而是使用 cfn package/s3 copy 命令的原因是什么? - abbottdev
问候!这对我非常有效,但我在想。有没有办法避免每次运行构建步骤时安装AWS SAM CLI?这似乎非常低效。 - Tommy
嘿@LechMigdal,你为什么不使用sam package命令作为你的最后一步呢? - Stefano Messina

2
如果您想在CodeBuild中运行sam build命令,您必须先安装aws-sam-cli(可能是在buildspec.yml文件的install阶段中),例如运行pip install aws-sam-cli命令或类似命令。
sam build命令中使用--use-container选项将导致该命令拉取类似于AWS Lambda执行环境的Docker镜像,然后从该Docker镜像运行容器以pip install(如果您的lambda是用Python编写的)您的函数依赖项以创建lambda部署包。这将确保lambda函数将使用与AWS Lambda实际运行时环境兼容的本地编译库。
因此,如果您在CodeBuild中运行sam build命令并指定--use-container选项,则还需要确保您的CodeBuild构建项目使用的Docker镜像必须支持Docker运行时。
最简单的方法是使用CodeBuild构建环境中命名为aws/codebuild/standard:2.0的Docker镜像。在buildspec.ymlinstall阶段的runtime-versions属性中启用Docker运行时。此外,您可能需要启用CodeBuild项目的PrevilegedMode,以便从构建环境连接到Docker守护程序。

0
截至2019年10月,我使用sam buildcodebuild部署无服务器应用程序时没有任何问题。
首先,对于pip install aws-sam-cli,不需要使用--user。实际上,包含--user似乎是sam不在路径中的唯一原因。
此外,只要没有构建本地库(如psycopg),也不需要使用--use-container

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接