我正在尝试在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)如果以上是一个令人讨厌的想法,您能告诉我您会怎么做吗?
事先感谢您。
答案 0 :(得分:2)
您用于处理多种功能的方法是currently suggested方法。
可以根据您的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 :(得分: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
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 -v
#prod
是stage / env的名称
如果构建成功,则可以在Lambda控制台中找到功能。
DevOpsBackup-prod-backupS3
DevOpsBackup-prod-backupEbs