前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯云SCF云函数多环境配置

腾讯云SCF云函数多环境配置

原创
作者头像
buzzfrog
修改2023-03-29 13:26:02
16.2K2
修改2023-03-29 13:26:02
举报
文章被收录于专栏:云上修行云上修行

背景

小伙伴们应该已经体验到了Serverless给我们开发带来的不曾有过的便利。那么接下来一个必然会问到的问题:我的业务开发完了,如何管理不同环境的配置呢?比如测试环境的数据库配置和正式环境的如何切换?这个领域,有一篇经典的文章《Serverless 多环境配置方案探索》见参考文档。但我探索下来,其实有更简单的方式。这里抛转引玉,给出我的解决方案,来跟大家一起学习和探讨。

注意哦,这里是多环境配置,之前我写的那篇文章,是多环境部署。

目标

多环境配置主要解决:

  1. 编译构建过程中,serverless.yml文件中的多环境配置,比如,发布到上海地区还是广州地区,命名空间是什么,内存大小、初始化时间等等;
  2. 代码运行过程中,代码文件中的多环境配置,比如,连接哪个数据库,用户名和密码是什么等等。

整体方案的处理逻辑是:在执行sls deploy阶段通过参数--stage选择不同的.env文件,导入配置信息,输入serverless.yml文件中的{env:配置Key}对应配置Key的Value,解决serverless.yml文件中的多环境配置。

通过serverless.yml文件中的inputs-environment-variables解决代码文件中的多环境配置。

environment: # 环境变量

variables: #  环境变量对象
  mysqlHost: ${env:mysqlHost}
  mysqlUser: ${env:mysqlUser}
  mysqlPassword: ${env:mysqlPassword}

代码结构及配置代码内容

以A项目为例,见下图。

A项目代码结构
A项目代码结构

.env.release和.env.test 文件中的格式为 配置Key=配置Value ,cup项目示例如下:

timeout=10
region=ap-guangzhou
memorySize=128
memoryBigSize=1024
vpcId=vpc-***
subnetId=subnet-***
mysqlHost=IP地址
mysqlUser=cup
mysqlPassword=数据库密码
serviceName=buzzfrog_cn
serviceId=service-***
cupAppId=api-***

serverless.yml中最关键的部分为:

stage: ${env.STAGE}
inputs:
  name: ${name}-${stage}-${app}
  region: ${env:region}
  namespace: ${stage}
  environment: #  环境变量
    variables: #  环境变量对象,可以将这些keyvalue传入到node.js和typescript代码中
      mysqlHost: ${env:mysqlHost}
      mysqlUser: ${env:mysqlUser}
      mysqlPassword: ${env:mysqlPassword}

cup项目的serverless.yml的示例如下:

org: buzzfrog # 组织名称。留空则则使用默认值为用户appid
app: A #(可选) 该应用名称。留空则默认取当前组件的实例名称为app名称。
stage: ${env.STAGE} #(可选) 用于区分环境信息,默认值为 dev
component: scf # (必选) 组件名称,在该实例中为scf
name: main # (必选) 组件实例名称。 

inputs:
  # name: # 云函数名称,默认为 ${name}-${stage}-${app}
  src:
    src: ./dist
    exclude:
      - .env
  type: web
  entryFile: main.js
  region: ${env:region}
  runtime: Nodejs12.16
  namespace: ${stage}
  memorySize: ${env:memoryBigSize}
  timeout: ${env:timeout}
  environment: #  环境变量
    variables: #  环境变量对象
      mysqlHost: ${env:mysqlHost}
      mysqlUser: ${env:mysqlUser}
      mysqlPassword: ${env:mysqlPassword}
  vpcConfig: # 私有网络配置
    vpcId: ${env:vpcId} # 私有网络的Id
    subnetId: ${env:subnetId} # 子网ID
  layers: #layer配置
    - name: koaNodeModules #  layer名称
      version: 4 #  版本
  events: 
    - apigw: 
        parameters:
          serviceName: ${env:serviceName}
          serviceId: ${env:serviceId}
          protocols: 
            - http
            - https
          environment: release
          endpoints: 
            - path: /A
              apiId: ${env:aAppId}
              apiName: A服务
              method: ANY
              enableCORS: false
              responseType: JSON
              isBase64Encoded: false
              isBase64Trigger: false
              serviceTimeout: 10
              function:
                isIntegratedResponse: false
                functionQualifier: $LATEST
                functionName: ${name}-${stage}-${app}
                functionType: HTTP

代码中,这样使用环境变量配置:

const mySQLPoolConnector:MySQLPoolConnector = new MySQLPoolConnector({
  host: process.env.mysqlHost,
  user: process.env.mysqlUser,
  password: process.env.mysqlPassword,
  database: 'aDatabase',
});

在执行部署时,如果需要使用.env.test,则deploy时执行

sls deploy --stage test

如果需要使用.env.release,则deploy时执行

sls deploy --stage release

以上方案,无需引入dotenv,逻辑简单,但需要使用serverless.yml文件做跳板中转环境变量配置,即,配置Key需要配置两遍的问题(每个环境的配置Value只需要配置一遍,在.env文件中)。

参考文档

Serverless 多环境配置方案探索 https://cloud.tencent.com/developer/article/1610209

腾讯云SCF云函数命令行多环境部署 https://cloud.tencent.com/developer/article/2249275

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 目标
  • 代码结构及配置代码内容
  • 参考文档
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档