函数计算配置中心

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 由于多个函数计算中都会执行数据库操作,而一旦数据库更改则需要修改全部函数计算。所以将数据库配置存入OSS中以便统一进行管理。

一. 新建OSS配置文件存储仓库

1. 进入OSS控制台,新建bucket【fc-config】

新建bucket

2. 创建一个子账户,用于读取OSS上的文件

  • 进入【RAM访问控制】-【用户】-【新建用户】
    新建用户
  • 为子账户分配权限
    分配权限
  • 为子账户创建AccessKey
    创建AccessKey

3. 编写测试文件

在本地创建一个【fc-test-config.json】文件,写入一些测试内容:

{
    "host": "127.0.0.1",
    "port": 3306,
    "username": "test",
    "password": "123456"
}

4. 上传测试文件

上传测试文件

二、编写配置中心代码

1. 使用模板生成

fun init -n fc-config https://github.com/l616769490/python3-http-example.git

使用模板生成

2. 编写代码

import json
import oss2

def handler(environ, start_response):
    # 获取请求体
    try:
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):
        request_body_size = 0

    request_body = environ['wsgi.input'].read(request_body_size)

    status, response = getConfigByName(str(request_body, encoding = "utf-8"))

    response_headers = [('Content-type', 'application/json')]
    start_response(status, response_headers)

    # 返回数据
    return [json.dumps(response).encode()]

def getConfigByName(fileName):
    utils = OSSUtils('这里替换成你的AccessKeyId', '这里替换成你的AccessKeySecret')
    return utils.getConfigByName(fileName, 'fc-config')

_ENDPOINT = 'https://oss-cn-shanghai.aliyuncs.com'

class OSSUtils:
    """ 封装OSS中的常用操作
    """

    def __init__(self, accessKeyId, accessKeySecret):
        """ 
        :param accessKeyId 阿里云accessKeyId
        :param accessKeySecret 阿里云accessKeySecret
        """
        self.accessKeyId = accessKeyId
        self.accessKeySecret = accessKeySecret
    
    def getConfigList(self, bucketName, dirName = ''):
        """ 获取配置列表 
        :param bucketName bucket名
        :param dirName 文件夹名
        """
        auth=oss2.Auth(self.accessKeyId, self.accessKeySecret)
        bucket = oss2.Bucket(auth, _ENDPOINT, bucketName)

        files = []
        for obj in oss2.ObjectIterator(bucket, dirName, ''):
            if obj.key != dirName:
                files.append(obj.key)
        return '200', files
    
    def getConfigByName(self, fileName, bucketName, dirName = ''):
        """ 获取配置
        :param fileName:配置文件名
        :param bucketName bucket名
        :param dirName 文件夹名
        :return: status, data status:成功返回200,失败返回404; data:成功返回数据,失败返回错误信息
        """
        auth=oss2.Auth(self.accessKeyId, self.accessKeySecret)
        bucket = oss2.Bucket(auth, _ENDPOINT, bucketName)

        objectName = dirName + fileName

        status = '200'
        data = ''
        try:
            remote_stream = bucket.get_object(objectName)
            data = str(remote_stream.read(), encoding = 'utf-8')
        except Exception as err:
            return err.status, err.message

        return status, data
    
    def updateConfig(self, data, bucketName, dirName = ''):
        """ 修改或者新增配置文件
        :param data{fileName, data}: fileName:文件名; data:文件内容
        :param bucketName bucket名
        :param dirName 文件夹名
        :return: status, data status:成功返回200,失败返回500; data:成功返回数据,失败返回错误信息
        """
        status = '200'
        data = ''
        if (data == None):
            data = '新增或修改失败'
            return status, data
        
        fileName = data['fileName']
        configData = data['data']

        try:
            auth=oss2.Auth(self.accessKeyId, self.accessKeySecret)
            bucket = oss2.Bucket(auth, _ENDPOINT, bucketName)
            objectName = dirName + fileName
            bucket.put_object(objectName, configData)

            data = '操作成功'
        except Exception as err:
            return err.status, err.message

        return status, data

三、测试

测试截图

四、其他函数计算中调用

1. 新建一个无触发器的普通函数计算【fc-config-test】,代码如下:

# -*- coding: utf-8 -*-
import requests
import datetime
import json

_HEADER = {
        'Content-Type' : 'application/json; charset=utf-8',
        'Date' : (datetime.datetime.now()-datetime.timedelta(hours=8)).strftime("%a, %d %b %Y %H:%M:%S GMT") 
    }

_CONF_HOST = '修改为你的配置中心地址'

def getDataForStr(host, data):
    """ 获取配置文件
    :param data:请求内容,字符串
    """
    r = requests.post(host, headers = _HEADER, data = data.encode())
    return r

def handler(event, context):
  conf = json.loads(getDataForStr(_CONF_HOST, 'fc-test-config.json').text)
  return conf

2. 执行

执行结果

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
15天前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
16天前
|
运维 Serverless 数据处理
函数计算产品使用问题之配置了预留实例,如果请求超时实例是否会退出
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1月前
|
运维 Java Serverless
Serverless 应用引擎产品使用合集之是否提供工具来给OSS配置HTTPS证书
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
运维 Serverless Nacos
Serverless 应用引擎产品使用合集之在访问量过大的情况下,函数配置的cpu和内存会自动扩容吗
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
运维 关系型数据库 MySQL
Serverless 应用引擎产品使用合集之如何配置MySQL的白名单IP
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之CDN如何配置IP限制
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
|
15天前
|
数据采集 移动开发 监控
函数计算操作报错合集之返回时报错:{"ErrorCode":"AccessDenied","ErrorMessage":"unauthorized method 'POST'"},该如何配置
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
15天前
|
运维 Serverless API
函数计算产品使用问题之遇到配置丢失的问题,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
15天前
|
存储 运维 监控
函数计算产品使用问题之如何将函数计算的临时硬盘大小配置到50GB
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。