AWS CloudFormation обновляет лямбда-код для использования последней версии в корзине S3 - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь создать шаблон CloudFormation, поддерживающий Lambda Function и проект AWS CodeBuild, для встраивания исходного кода .netcore в развернутый zip-файл в корзине S3.Вот подробности:

  • Использование моно-репо GitHub с несколькими функциями Lambda в качестве различных проектов в решении .netcore
  • Каждая функция Lambda (также известный как проект .netcore) имеет CloudFormationФайл YAML, генерирующий стек, содержащий саму функцию Lambda и проект CodeBuild.
  • Проект CodeBuild инициируется из веб-ловушки GitHub, которая получает код из подпроекта GitHub и использует свой buildspec.yaml для управления тем, как должна происходить сборка.
  • buildspec использует .netcore для построения проекта, затем архивирует и копирует выходные данные в целевую корзину S3
  • Лямбда-функция указывает на корзину S3 для исходного кода

Этовсе работает просто отлично.Я борюсь с тем, как обновить функцию Lambda, чтобы использовать обновленный скомпилированный исходный код в корзине S3.

Вот подмножество шаблона CloudFormation :

Resources:
Lambda:
    Type: AWS::Lambda::Function
    Properties:
        FunctionName: roicalculator-eventpublisher
        Handler: RoiCalculator.Serverless.EventPublisher::RoiCalculator.Serverless.EventPublisher.Function::FunctionHandler
        Code:
            S3Bucket: deployment-artifacts
            S3Key: RoiCalculatorEventPublisher.zip
        Runtime: dotnetcore2.1

CodeBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Name: RoiCalculator-EventPublisher-Master
    Artifacts:
      Location: deployment-artifacts
      Name: RoiCalculatorEventPublisher.zip
      Type: S3
    Source:
      Type: GITHUB
      Location: https://github.com/XXXXXXX
      BuildSpec: RoiCalculator.Serverless.EventPublisher/buildspec.yml

Вот подмножество buildspec.yaml :

phases:
install:
    runtime-versions:
        dotnet: 2.2
    commands:
      dotnet tool install -g Amazon.Lambda.Tools
  build:
    commands:
      - dotnet restore
      - cd RoiCalculator.Serverless.EventPublisher
      - dotnet lambda package --configuration release --framework netcoreapp2.1 -o .\bin\release\netcoreapp2.1\RoiCalculatorEventPublisher.zip
      - aws s3 cp .\bin\release\netcoreapp2.1\RoiCalculatorEventPublisher.zip s3://deployment-artifacts/RoiCalculatorEventPublisher.zip

Вы можете увидеть одно и то же имя артефакта (RoiCalculatorEventPublisher.zip) и корзину S3(Аргументы развертывания) используются в buildspec (для генерации и копирования) и в шаблоне CloudFormation (для источника функции Lambda).

Поскольку я перезаписываю код приложения в корзине S3, используя то же имя файла, которое использует Lambda,почему Lambda не обновляется последним кодом?

Как работают номера версий?Возможно ли иметь «системную переменную», содержащую имя артефакта (имя файла + номер версии) и доступ к той же «системной переменной» в buildspec И Шаблон CloudFormation?

В чем секрет использования шаблона CloudFormation для генерации исходного кода (через buildspec) с использованием CodeBuild, а также для обновления функции Lambda, которая использует сгенерированный код?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019
  • Я использую aws scp вместо aws cp, и у меня никогда не было этой проблемы.
  • Я работаю над проектом с серверной архитектурой с несколькими лямбдами, где у нас есть несколько папок с толькофайл python и файл require.txt внутри него.
  • Обычно каталог и лямбда называются одинаково для удобства, например.папка email_sender будет иметь Python-файл как email_sender.py и requirement.txt, если он понадобится.
  • В сборке кода после установки зависимостей, я просто показываю ниже, как мы архивируем
      echo "--- Compiling lambda zip: ${d}.zip"
      d=$(tr "_" "-" <<< "${d}")
      zip -q -r ${d}.zip . --exclude ".gitignore" --exclude "requirements.txt" --exclude "*__pycache__/*" > /dev/null 2>&1
      mv ${d}.zip ../../${CODEBUILD_SOURCE_VERSION}/${d}.zip

  • И при копировании в корзину s3 мы используем scp следующим образом
aws s3 sync ${CODEBUILD_SOURCE_VERSION}/ ${S3_URI} --exclude "*" --include "*.zip" --sse aws:kms --sse-kms-key-id ${KMS_KEY_ALIAS} --content-type "binary/octet-stream" --exact-timestamps

0 голосов
/ 26 сентября 2019

К сожалению, если вы не измените «S3Key» на ресурсе «AWS :: Lambda :: Function» при каждом обновлении, CloudFormation не увидит это как изменение (оно не будет искать изменения внутри заархивированного кода).

Опции :

Вариант 1) Обновлять ключ S3 при каждой загрузке

Вариант 2) Рекомендуется использовать AWS SAM для создания шаблона Lambda, а затем использоватьКоманда «cloudformation package» для упаковки шаблона, которая заботится о создании уникального ключа для S3 и загрузке файла в корзину.Подробности здесь: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-deploying.html

Редактировать 1:

В ответ на ваш комментарий позвольте мне добавить некоторые детали подхода SAM:

Для использованияCloudFormation как инструмент развертывания для вашей лямбда-функции в вашем конвейере.Основная идея развертывания лямбда-функции заключается в следующем:

1) Создайте шаблон SAM вашей лямбда-функции

2) Базовый шаблон SAM выглядит следующим образом:

    AWSTemplateFormatVersion: '2010-09-09'
    Transform: 'AWS::Serverless-2016-10-31'
    Resources:
    FunctionName:
        Type: 'AWS::Serverless::Function'
        Properties:
            Handler: index.handler
            Runtime: nodejs6.10
            CodeUri: ./code

3) Добавьте каталог «code» и сохраните файлы лямбда-кода в этом каталоге

4) Установите SAM Cli [1]

5) Запустите команду для упаковки и загрузки:

$ sam package --template-file template.yaml --output-template packaged.yaml --s3-bucket {your_S3_bucket}

6) Развертывание пакета:

$ aws cloudformation deploy --template-file packaged.yaml --stack-name stk1 --capabilities CAPABILITY_IAM

Вы можете сохранить код шаблона (шаг 1-2) в CodeCommit / Github и выполнить шаги 4-5 в шаге CodeBuild.Для шага 6 я рекомендую сделать это с помощью действия CloudFormation в CodePipeline, который в качестве входного артефакта передает файл «packaged.yaml».

См. Также [2].

Ссылки:

[1] Установка AWS SAM CLI в Linux - https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html

[2] Построение конвейера непрерывной доставки для лямбда-приложения с AWS CodePipeline - https://docs.aws.amazon.com/en_us/lambda/latest/dg/build-pipeline.html

...