可以/建议在AWS CodeBuild中使用“ sam build”吗?

时间:2018-12-31 11:55:47

标签: amazon-web-services aws-codebuild aws-serverless

这个问题来自this one。现在,我对这里出了什么问题有了更深入的了解,并有了一个workable, if imperfect, solution,我将提交一个更集中的后续信息(我仍然是StackOverflow的新手,请告诉我违反礼节,我应该对原文进行跟进。

This page建议“ 您使用AWS CodeBuild来构建,本地测试和打包无服务器应用程序”。但是,当我在sam build中包含buildspec.yml命令时,将得到以下日志输出,提示在CodeBuild映像上未安装sam

[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会得到an errorsam build本身可以成功,但是由于它没有安装测试依赖项,因此我仍然需要使用pip install -r tests/requirements-test.txt -t .才能在CodeBuild中运行测试。此外,this建议--use-container对于“具有本地编译程序的软件包”是必需的。

这使我想知道我是否正在尝试做错什么。 在AWS的CI / CD工作流程中构建SAM服务的推荐方法是什么

4 个答案:

答案 0 :(得分:2)

2019_10_18-更新(在上面确认@Spiff答案):

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

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

欢呼

答案 1 :(得分:1)

当在 AWS CodeBuild buildspec.yaml

中使用 AWS SAM 时,适用于我的cloudformation.yml请参见下文
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

答案 2 :(得分:1)

如果要在CodeBuild中运行sam build命令,则必须先安装 aws-sam-cli (可能在 install 阶段) buildspec.yml 文件),即通过运行pip install aws-sam-cli命令或类似命令。

--use-container命令中的

sam build选项将导致该命令提取类似于AWS Lambda执行环境的Docker映像,然后将容器从该Docker映像运行到pip install(如果您的Lambda是用Python编写的)用于创建Lambda部署包的函数依赖项。这将确保lambda函数将使用与AWS Lambda的实际运行时环境兼容的本机编译库。

因此,如果为在CodeBuild中运行的--use-container命令指定sam build选项,则还需要确保CodeBuild构建项目使用的Docker映像必须支持Docker运行时。

最简单的方法是使用名为aws/codebuild/standard:2.0 Docker映像的CodeBuild构建环境。在 buildspec.yml 安装阶段的runtime-versions属性中Enabling Docker runtime。另外,您可能需要启用PrevilegedMode的CodeBuild项目,以便从构建环境中与Docker守护程序连接。

答案 3 :(得分:0)

截至2019年10月,我使用codebuildsam build部署无服务器应用程序都没有问题,

首先,--user不需要pip install aws-sam-cli。实际上,包含--user似乎是sam不在路径中的唯一原因。

此外,只要没有构建本机库(例如--use-container

),也不需要psycopg