在nodejs中,我可以有每个子文件夹都托管一个AWS Lambda函数的子文件夹吗?

时间:2019-01-14 13:39:25

标签: node.js amazon-web-services jenkins aws-lambda aws-serverless

我正在尝试在AWS上实现无服务器应用程序。我想知道一种组织代码的好方法。假设我想在git repo下组织多个lambda函数,每个lambda函数及其相关代码都在其自己的子文件夹中。

这是我尝试过的,每个lambda函数的单独子文件夹:

(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中,我通过使用其父目录指定Handler来部署Lambda函数

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)除了编写脚本来执行“ cd $ {dir} && npm install”之外,是否有一种方法可以在每个子文件夹下为nodejs代码进行npm安装

(3)如果以上是一个令人讨厌的想法,您能告诉我您会怎么做吗?

事先感谢您。

2 个答案:

答案 0 :(得分:2)

  1. 您用于处理多种功能的方法是currently suggested方法。

  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

这使我可以通过.gitignore来保持本地目录/代码存储库的干净(没有node_modules文件夹),但是在部署之前要先安装依赖项。请注意,必须包含package-lock.json文件,以避免使用不同的程序包版本出错。

  1. 如上所述,这与我当前使用的设置相同。到目前为止,我所看到的唯一缺点是无法在不更新所有功能的情况下更新单个功能,但是由于设置环境的方式(所有功能共享相同的版本号),因此只能更改一个功能仍然需要更改其他内容。

答案 1 :(得分:2)

了解您正在使用SAM,但是如果您愿意考虑使用serverless framework,那么您就可以通过一个命令在CI / CD管道中对其进行管理。所有Lambda都将单独部署,并且每个功能在node_modules中具有该功能所需的依赖项

您将需要在package.json devDependencies中添加以下内容。

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

serverless-plugin-optimize用于优化Lambda代码及其依赖项。

注意:使用serverless-plugin-optimize时,必须确保将所有require(..)放置在处理程序中的module.exports上方。

您还将需要serverless framework,可以在全局安装它。

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
}

部署

您可以使用一个命令部署所有Lambda,并从存储库根目录运行它。

serverless deploy --stage prod -vprod是stage / env的名称

如果构建成功,则可以在Lambda控制台中找到功能。

  • DevOpsBackup-prod-backupS3
  • DevOpsBackup-prod-backupEbs