Как развернуть несколько лямбда-выражений в шаблоне CFN через Codepipeline? - PullRequest
0 голосов
/ 17 ноября 2018

USECASE

У меня есть стек облачной информации, в котором более 15 лямбд. Я могу развернуть стек через Codepipeline, который состоит из двух этапов CodeCommit и CodeDeploy. В этом подходе весь мой лямбда-код находится в шаблоне облачной информации (т.е. в коде inline). Из соображений безопасности я хочу изменить это Inline на S3, для которого inturn требуется S3BucketName и S3Key.

В качестве временного решения

На данный момент я архивирую каждый лямбда-файл и передаю вручную S3keyName и bucketname в качестве параметров в мой стек.

Есть ли способ сделать этот шаг через Codepipeline?

Мое предположение о CodeBuild

Я знаю, что мы можем использовать CodeBuild для него. Но до сих пор я видел, что CodeBuild используется только для создания файла package.json. Но в моем случае у меня нет никаких. И также я вижу, что можно указать команду cloudformation package для переноса моей лямбды с локального на S3, эта команда будет генерировать S3 codeuri`, но это для безсерверных приложений, где будет одна лямбда, но в моем случае у меня 15.

Что я пробовал

Я знаю, что как только вы дадите git push на codecommit, он сохранит ваш код в S3. Так что я подумал, чтобы получить S3BucketName и S3KeyName из файла, отправленного codecommit, и передать эти параметры моему шаблону CFN. Я могу получить S3BucketName, но S3KeyName Я не знаю, как это получить? И я не знаю, является ли этот испытанный apporach подходящим?

Кстати, я знаю, что могу использовать сценарий оболочки только для автоматизации этого процесса. Но есть ли способ сделать это через CODE PIPELINE ?

Обновление - пробный подход без сервера

По сути, я запускаю два действия сборки с двумя разными средами выполнения (т. Е. Узлами, Python), которые выполняются независимо. Поэтому, когда я использую подход без сервера, каждая сборка создаст файл template-export.yml с кодурой bucketlocation, это означает, что у меня будет two template-export.yml files. Одна проблема с Serverless подходом к этому должна быть create changeset, и тогда это вызовет Execute changeset. Из-за этого мне нужно merge those two template-export.yml files и запустить это create changeset действие, а затем execute changeset. Но я не знал, есть ли команда для объединения двух SAM templates. Иначе один стек template-export.yml заменит другой стек template-export.yml.

Любая помощь приветствуется Спасибо

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Если я вас правильно понимаю, вам просто нужно S3 Bucket и ключ, которые будут переданы в ваш шаблон Lambda CF. Для этого я использую объявление ParameterOverrides в своем конвейере.

По сути, конвейер представляет собой отдельный стек и получает шаблон CF, расположенный в корне моего источника. Затем он переопределяет два параметра в этом шаблоне, которые указывают его на соответствующий сегмент / ключ S3.

        - Name: LambdaDeploy
          Actions:
          - Name: CreateUpdateLambda
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Provider: CloudFormation
            Version: 1
          Configuration:
            ActionMode: CREATE_UPDATE
            Capabilities: CAPABILITY_IAM
            RoleArn: !GetAtt CloudFormationRole.Arn
            StackName: !Join
              - ''
              - - Fn::ImportValue: !Sub '${CoreStack}ProjectName'
                - !Sub '${ModuleName}-app'
            TemplatePath: SourceOut::cfn-lambda.yml
            ParameterOverrides: '{ "DeploymentBucketName" : { "Fn::GetArtifactAtt" : ["BuildOut", "BucketName"]}, "DeploymentPackageKey": {"Fn::GetArtifactAtt": ["BuildOut", "ObjectKey"]}}'

Теперь, тот факт, что у вас есть пятнадцать лямбда-функций в этом, может повредить его. Для этого у меня нет точного ответа, поскольку я на самом деле пытаюсь сделать то же самое и упаковать несколько лямбд таким образом.

0 голосов
/ 29 ноября 2018

Документация по развертыванию нескольких функций Lambda с помощью CodePipeline и CloudFormation приведена здесь: https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html

Я полагаю, что это по-прежнему будет загружать код функции в S3, но будет использовать инструменты AWS, чтобы упростить этот процесс.

...