这个问题来自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 error。 sam build
本身可以成功,但是由于它没有安装测试依赖项,因此我仍然需要使用pip install -r tests/requirements-test.txt -t .
才能在CodeBuild中运行测试。此外,this建议--use-container
对于“具有本地编译程序的软件包”是必需的。
这使我想知道我是否正在尝试做错什么。 在AWS的CI / CD工作流程中构建SAM服务的推荐方法是什么?
答案 0 :(得分:2)
2019_10_18-更新(在上面确认@Spiff答案):
显然,Codebuild现在可以与SAM无缝协作,这就是我在buildspec.yml
中使用pandas
和psycopg2-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
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月,我使用codebuild
和sam build
部署无服务器应用程序都没有问题,
首先,--user
不需要pip install aws-sam-cli
。实际上,包含--user
似乎是sam
不在路径中的唯一原因。
此外,只要没有构建本机库(例如--use-container
psycopg