在使用serverless来开发Cloud应用的时候,如果项目越来越大,就会导致serverless.yml文件过大。这时就需要对serverless.yml进行模块化定义了。简而言之,就是把不同的资源分别定义在不同的yml/js/ts文件中。

基本用法
将不同类型的资源分散到不同的yml文件中,然后在serverless.yml中引入:
service: myservice
frameworkVersion: '2'
provider:
name: 'aws'
runtime: 'nodejs14.x'
resources:
Resources: ${file(./serverless/resources.yml)}
多级定义
在YAML中无法把多种资源组合在一起,比如在/serverless.yml中引用了./serverless/resources.yml,那么就不能在resources.yml中继续引用多个其他由YAML定义的资源了。这时,可以通过js文件来解决这个问题:
const yml = require('js-yaml');
const fs = require('fs');
module.exports = async () => {
const DynamoDB = yml.load(fs.readFileSync('./DynamoDB.yml', 'utf8'));
const ES = yml.load(fs.readFileSync('./ElasticSearch.yml', 'utf8'));
const S3 = yml.load(fs.readFileSync('./S3.yml', 'utf8'));
return {
...DynamoDB,
...ES,
...S3
};
}
使用Typescript定义serverless资源
还有另外一种方法就是使用TypeScript来定义serverless资源。这种方式最大的优势就是能够充分利用TypeScript的类型检测,提高编码效率。
import type { AWS } from '@serverless/typescript';
import S3 from './serverless/S3';
import Dynamo from './serverless/DynamoDB';
import ElasticSearch from './serverless/ElasticSearch';
const serverlessConfiguration: AWS = {
service: 'myservice',
frameworkVersion: '2',
custom: {
// ...
},
plugins: ['serverless-webpack', 'serverless-offline'],
provider: {
name: 'aws',
runtime: 'nodejs14.x',
stage: 'dev',
// ...
},
// ...
resources: {
Resources: {
...Dynamo,
...S3,
ElasticSearch,
}
}
}