Могу ли я использовать в nodejs подпапки, в каждой из которых находится лямбда-функция AWS? - PullRequest
0 голосов
/ 14 января 2019

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

Это то, что я пробовал, отдельные подпапки для каждой лямбда-функции:

(venv367) dummy@dummy-VirtualBox:~/workspace/serverless-apps/DEVOPS-dailybackup-ebs$ ls -l
total 28
-rw-rw-r-- 1 dummy dummy 4061 Jan 13 19:23 index.js
drwxrwxr-x 3 dummy dummy 4096 Jan 13 19:23 node_modules
-rw-rw-r-- 1 dummy dummy  352 Jan 13 19:23 package.json
-rw-rw-r-- 1 dummy dummy  392 Jan 13 19:23 package-lock.json
-rw-rw-r-- 1 dummy dummy 1220 Jan 14 00:10 README.md

(venv367) dummy@dummy-VirtualBox:~/workspace/serverless-apps/DEVOPS-dailybackup-s3$ ls -l
total 28
-rw-rw-r-- 1 dummy dummy 4061 Jan 13 19:23 index.js
drwxrwxr-x 3 dummy dummy 4096 Jan 13 19:23 node_modules
-rw-rw-r-- 1 dummy dummy  352 Jan 13 19:23 package.json
-rw-rw-r-- 1 dummy dummy  392 Jan 13 19:23 package-lock.json
-rw-rw-r-- 1 dummy dummy 1220 Jan 14 00:10 README.md

В проекте верхнего уровня у меня есть SAM template.yaml, как показано ниже

(venv367) dummy@dummy-VirtualBox:~/workspace/serverless-apps$ ls -l
total 16
drwxrwxr-x 3 dummy dummy 4096 Jan 14 05:14 00_DEVOPS-dailybackup-ebs
drwxrwxr-x 3 dummy dummy 4096 Jan 14 05:14 00_DEVOPS-dailybackup-s3
-rw-rw-r-- 1 dummy dummy  702 Jan 14 05:15 packaged.yaml
-rw-rw-r-- 1 dummy dummy 1402 Jan 13 23:45 README.md
-rw-rw-r-- 1 dummy dummy  939 Jan 14 05:15 template.yaml

В файле template.yaml я развертываю функции Lambda, указав Handler с его родительским каталогом

Resources:
    EbsBackupFunction:
        Type: AWS::Serverless::Function 
        Properties:
            Handler: DEVOPS-dailybackup-ebs/index.handler
            Runtime: nodejs8.10
            FunctionName: DEVOPS-dailybackup-ebs

    S3BackupFunction:
        Type: AWS::Serverless::Function 
        Properties:
            Handler: DEVOPS-dailybackup-s3/index.handler
            Runtime: nodejs8.10
            FunctionName: DEVOPS-dailybackup-s3

(1) Хотя я не рассматривал безсерверную инфраструктуру подробно. Есть ли лучший подход для управления безсерверными приложениями с помощью AWS SAM?

(2) Есть ли способ выполнить npm-установку для кода nodejs в каждой подпапке, кроме написания сценария для 'cd $ {dir} && npm install'

(3) Если выше - плохая идея, вы можете сказать мне, что бы вы сделали?

Ткс заранее за любую помощь.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Поймите, что вы используете SAM, но если вы открыты для рассмотрения безсерверной инфраструктуры , тогда вы можете управлять ею в своем конвейере CI / CD с помощью всего одной команды. Все Lambdas будут развернуты индивидуально, и каждая функция будет иметь зависимости в node_modules, необходимые для функции

Вам необходимо добавить следующее в package.json devDependencies.

"devDependencies": {
    "serverless-plugin-optimize": "^4.0.2-rc.1"
 }

serverless-plugin-optimize используется для оптимизации лямбда-кода и его зависимостей.

Примечание: при использовании serverless-plugin-optimize вы должны убедиться, что все require(..) размещены над module.exports в вашем обработчике.

Вам также понадобится безсерверный фреймворк , вы можете установить его глобально.

npm install -g serverless

Структура хранилища:

devops-backup/
 - node_modules/
 - package.json
 - serverless.yml
 - handlers/
   - s3.js
   - ebs.js

serverless.yml конфигурация:

service: DevOpsBackup
frameworkVersion: '>=1.2.1 <2.0.0'
provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-1
  stage: ${opt:stage} # Stage that you define when deploy using `serverless deploy --stage`
  deploymentBucket: ${env:SLS_BUCKET} # Your deployment bucket name. CI must have access to this bucket.

iamRoleStatements:
  - Effect: Allow
    Action:
      - s3:"*"
    Resource: arn:aws:s3:::<bucket_name>
  # Add more permissions as required by the functions

plugins:
  - serverless-plugin-optimize

package:
  individually: true

functions:
  backupEbs:
    handler: handlers/s3.handler
    description: Create user
  backupS3:
    handler: handlers/ebs.handler
    description: Update user

Пример s3.js

module.exports.handler = async (event) => {
 // ... your code
}

Развертывание

Вы можете развернуть все Lambdas с помощью одной команды, запустить ее из корня хранилища.

serverless deploy --stage prod -v # prod - название стадии / env

Если ваша сборка прошла успешно, вы сможете найти свои функции в лямбда-консоли.

  • DevOpsBackup-prod-backupS3
  • DevOpsBackup-prod-backupEbs
0 голосов
/ 14 января 2019
  1. Ваш метод обработки нескольких функций - это , предлагаемый в настоящее время метод.

  2. Различные подходы могут быть приняты на основе вашего инструмента CI / CD. Это мой текущий buildspec.yml для использования с AWS CodeBuild:

version: 0.2
phases:
  pre_build:
    commands:
      - for d in lambdas/*/; do npm --prefix $d install $d; done
  build:
    commands:
      - |
        aws cloudformation package \
          --template-file template.yml \
          --s3-bucket "<bucket name>" \
          --s3-prefix sam \
          --output-template-file packaged.yml
  post_build:
    commands:
      - |
        aws cloudformation deploy \
          --template-file packaged.yml \
          --stack-name "<stack name>" \
          --capabilities CAPABILITY_NAMED_IAM

Это позволяет мне поддерживать мой локальный каталог / репозиторий кода в чистоте (без папки node_modules) через .gitignore, но перед установкой устанавливаются зависимости. Обратите внимание, что включение вашего package-lock.json файла необходимо, чтобы избежать ошибок с различными версиями пакета.

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