serverless教程:模块化构建serverless配置文件


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

serverless教程

基本用法

将不同类型的资源分散到不同的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,
    }
  } 
}

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !
  目录