Можно / рекомендуется использовать `sam build` в AWS CodeBuild?

Этот вопрос возник из этот. Теперь, когда я лучше понимаю, что там происходило не так, и нашел работоспособное, хотя и несовершенное, решение, я отправка более целенаправленных последующих действий (я все еще новичок в StackOverflow - пожалуйста, дайте мне знать, если это противоречит этикету, и я должен следить за оригиналом).

Эта страница предполагает, что " Вы используете AWS CodeBuild для создания, локального тестирования и упаковки бессерверного приложения ". Однако, когда я включаю команду sam build в свой buildspec.yml, я получаю следующий вывод журнала, предполагающий, что 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 

Более того, если я устанавливаю SAM с pip install aws-sam-cli, запуск sam build --use-container в CodeBuild дает ошибку. sam build сам по себе работает успешно, но поскольку он не устанавливает тестовые зависимости, мне все равно нужно использовать pip install -r tests/requirements-test.txt -t ., чтобы иметь возможность запускать тесты в CodeBuild. Более того, это предполагает, что --use-container требуется для «пакетов, которые содержат программы, скомпилированные в собственном коде»).

Это заставляет меня задуматься, пытаюсь ли я сделать что-то не так. Какой рекомендуемый способ создания сервисов SAM в рабочем процессе CI / CD на AWS?


person scubbo    schedule 31.12.2018    source источник


Ответы (4)


2019_10_18 - Обновление (подтверждающее ответ @Spiff выше):

Судя по всему, Codebuild теперь без проблем работает с SAM, это все, что мне нужно в buildspec.yml для лямбда-выражения с использованием pandas и psycopg2-binary:

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

Ваше здоровье

person saza    schedule 18.10.2019

См. Ниже buildspec.yaml, который работает у меня при использовании AWS SAM с AWS CodeBuild, с 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.

Для каждой функции в папке ./src у меня есть файл requirements.txt, который включает все зависимости, но я не запускаю pip install -r requirements.txt вручную.

person Lech Migdal    schedule 31.12.2018
comment
Привет, Лех! Спасибо за пример. Учитывая, что это, по-видимому, устанавливает только ваши исходные требования (а не требования к тестам, такие как requests-mock, pytest и т. Д.), Как вы запускаете тесты во время сборки? Позволяет ли эта установка использовать пакеты, содержащие программы, скомпилированные в собственном коде (что обычно требуется sam build --use-container)? Есть ли причина, по которой вы экспортируете файл cloudformation-packaged.yaml в S3, а не просто ссылаетесь на него непосредственно на этапе развертывания вашего CodePipeline? - person scubbo; 31.12.2018
comment
Всем привет, хорошие вопросы! :) 1. Я здесь не тестирую, я использую только CodeBuild для сборки. Если вы хотите провести тесты, да, я бы сказал, вам следует запустить pip. 2. Что касается перемещения упакованного файла, потенциально, я думаю, вы могли бы сделать это с помощью CodeDeploy, но поскольку у меня очень специфическая и необычная структура папок, я в конечном итоге сделал это вручную с помощью AWS CLI :) - person Lech Migdal; 31.12.2018
comment
Понял, спасибо! Тогда я подожду, чтобы принять более полный и / или общеприменимый ответ, но было полезно увидеть чужую настройку, спасибо! - person scubbo; 31.12.2018
comment
@LechMigdal просто любопытно, была ли причина, по которой вы не использовали команду sam package вместо команд копирования cfn package / s3? - person abbottdev; 25.02.2019
comment
Привет! У меня это сработало отлично, но мне интересно. Есть ли способ избежать установки AWS SAM CLI при каждом запуске этапа сборки? Это кажется довольно неэффективным. - person Tommy; 01.08.2019
comment
Привет, @LechMigdal, есть ли причина, по которой ты не используешь команду sam package на последних шагах? - person Stefano Messina; 04.09.2019

Если вы хотите запустить команду sam build в CodeBuild, сначала необходимо установить aws-sam-cli (возможно, на этапе установки buildspec.yml файл), то есть запустив команду pip install aws-sam-cli или аналогичную.

Параметр --use-container в команде sam build приведет к тому, что команда загрузит образ Docker, напоминающий среду выполнения AWS Lambda, а затем запустит контейнер из этого образа Docker в pip install (если ваша лямбда написана на Python) зависимости ваших функций для создания вашего развертывания лямбда упаковка. Это гарантирует, что лямбда-функция будет использовать собственные скомпилированные библиотеки, совместимые с реальной средой выполнения AWS Lambda.

Следовательно, если вы укажете параметр --use-container для команды sam build, выполняемой в CodeBuild, вам также необходимо убедиться, что образ Docker, используемый вашим проектом сборки CodeBuild, должен поддерживать среду выполнения Docker.

Самый простой способ - использовать среду сборки CodeBuild с именем aws/codebuild/standard:2.0 Docker image. Включение среды выполнения Docker в свойстве runtime-versions на этапах установки вашего buildspec.yml. Также вам может потребоваться включить PrevilegedMode вашего проекта CodeBuild, чтобы подключиться к демону Docker из среды сборки.

person onelaview    schedule 21.05.2019

По состоянию на октябрь 2019 года у меня не было никаких проблем с развертыванием бессерверного приложения с codebuild с использованием sam build,

Во-первых, --user не нужен для pip install aws-sam-cli. Фактически включение --user кажется единственной причиной того, что sam не находится на пути.

Вдобавок --use-container также не нужен, пока не созданы собственные библиотеки, например psycopg

person Spiff    schedule 01.10.2019