云服务器内容精选

  • python模板 主调函数: # funcName: pythoncaller from functionsdk import Function def newStateRouter(event, context): func = Function(context, "pythonstateful", "test1") instanceID = func.get_instance_id() return instanceID def bindStateRouter(event, context): func = Function(context) # bind func.get_instance("pythonstateful", "test1") instanceID = func.get_instance_id() return instanceID def invoke(event, context): func = Function(context) # bind func.get_instance("pythonstateful", "test1") obj = func.invoke("{\"key\":\"value\"}") result = obj.get() return result def terminate(event, context): func = Function(context) # bind func.get_instance("pythonstateful", "test1") obj = func.terminate() result = obj.get() return result 父主题: Python
  • 使用限制 单账号跟踪的事件可以通过 云审计 控制台查询。多账号的事件只能在账号自己的事件列表页面去查看,或者到组织追踪器配置的OBS桶中查看,也可以到组织追踪器配置的 CTS /system日志流下面去查看。 用户通过云审计控制台只能查询最近7天的操作记录。如果需要查询超过7天的操作记录,您必须配置转储到 对象存储服务 (OBS)或 云日志 服务(LTS),才可在OBS桶或LTS日志组里面查看历史事件信息。否则,您将无法追溯7天以前的操作记录。 云上操作后,1分钟内可以通过云审计控制台查询管理类事件操作记录,5分钟后才可通过云审计控制台查询数据类事件操作记录。
  • 添加事件源 OBS桶及函数创建以后,可以为函数添加事件源,添加OBS事件源是通过创建OBS触发器实现的,步骤如下。 用户进入fss_examples_dew函数详情页,在“触发器”页签,单击“创建触发器”,弹出“创建触发器”界面。 触发器类型选择“存储(OBS)”,填写触发器配置信息,如图1所示。 桶选择创建OBS桶中创建的“input_bucket”桶。 事件选择“Post”、“Put”。 图1 创建OBS触发器 单击“确定”,完成触发器创建。 OBS触发器创建以后,当有文件上传或更新至dew-bucket-input桶时,生成事件,触发函数执行。 父主题: 函数+DEW:加解密文件
  • 如何通过版本和别名实现绑定APIG触发器的HTTP函数的灰度升级? 基于latest创建版本V1、V2,创建别名alias绑定对应版本V1,权重100%,为alias创建APIG触发器。 图1 发布新版本V2和V2 图2 创建alias别名并绑定V1版本 图3 在alias下创建触发器 函数支持别名和版本分别创建APIG触发器,APIG触发器名称默认为API_{函数名}{版本名},请求Path默认是/{函数名}-{版本名} 。 同一个APIG触发器(URL Path)不能同时存在于别名和它的对应版本下。比如V1版本和alias别名存在绑定关系,在V1创建触发器,默认名称为API_testapigV1,再在alias别名下创建触发器,默认名称也为API_testapigV1,且调用URL相同。此时返回V1版本下的触发器列表查看,发现已无API_testapigV1触发器。 回到latest版本别名界面,编辑alias,灰度版本选择V2,调整权重,实现V1到V2的灰度升级。 权重用于分派接收到的流量给后端版本,具体数值视业务情况自定义。 图4 编辑别名 创建V3版本,编辑alias,对应版本设置为V2,灰度版本选择V3,调整权重,实现V2到V3的灰度升级。 图5 创建V3版本 图6 编辑别名 不能基于latest重复发布相同版本,必须修改配置或代码等信息后发布新版本。 不能删除绑定了触发器的别名。 父主题: 函数配置
  • ZIP工程包示例 Nods.js工程ZIP包目录示例 Example.zip 示例工程包 |--- lib 业务文件目录 |--- node_modules npm三方件目录 |--- index.js 入口js文件(必选) |--- package.json npm项目管理文件 PHP工程ZIP包目录示例 Example.zip 示例工程包 |--- ext 扩展库目录 |--- pear PHP扩展与应用仓库 |--- index.php 入口PHP文件 Python工程ZIP包目录示例 Example.zip 示例工程包 |--- com 业务文件目录 |--- PLI 第三方依赖PLI目录 |--- index.py 入口py文件(必选) |--- watermark.py 实现打水印功能的py文件 |--- watermark.png 水印图片 Java工程ZIP包目录示例 Example.zip 示例工程包 |--- obstest.jar 业务功能JAR包 |--- esdk-obs-java-3.20.2.jar 第三方依赖JAR包 |--- jackson-core-2.10.0.jar 第三方依赖JAR包 |--- jackson-databind-2.10.0.jar 第三方依赖JAR包 |--- log4j-api-2.12.0.jar 第三方依赖JAR包 |--- log4j-core-2.12.0.jar 第三方依赖JAR包 |--- okhttp-3.14.2.jar 第三方依赖JAR包 |--- okio-1.17.2.jar 第三方依赖JAR包 Go工程ZIP包目录示例 Example.zip 示例工程包 |--- testplugin.so 业务功能包 C#工程ZIP包目录示例 Example.zip 示例工程包 |--- fssExampleCsharp2.0.deps.json 工程编译产生文件 |--- fssExampleCsharp2.0.dll 工程编译产生文件 |--- fssExampleCsharp2.0.pdb 工程编译产生文件 |--- fssExampleCsharp2.0.runtimeconfig.json 工程编译产生文件 |--- Handler 帮助文件,可直接使用 |--- HC.Serverless.Function.Common.dll 函数工作流 提供的dll 定制运行时 Example.zip 示例工程包 |--- bootstrap 可执行引导文件
  • 打包规范说明 函数除了支持在线编辑代码,还支持上传ZIP、JAR、引入OBS文件等方式上传代码,函数工程的打包规范说明如表1所示。 表1 函数工程打包规范 编程语言 JAR包 ZIP包 OBS文件 Node.js 不支持该方式 假如函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的是:入口函数是程序执行的入口,确保解压后,入口函数所在的文件位于根目录。 如果函数工程引入了第三方依赖,可以将第三方依赖打成ZIP包,在函数代码界面设置外部依赖包;也可以将第三方依赖和函数工程文件一起打包。 将工程打成ZIP包,上传到OBS存储桶。 PHP 不支持该方式 假如函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的是:入口函数是程序执行的入口,确保解压后,入口函数所在的文件位于根目录。 如果函数工程引入了第三方依赖,可以将第三方依赖打成ZIP包,在函数代码界面设置外部依赖包;也可以将第三方依赖和函数工程文件一起打包。 将工程打成ZIP包,上传到OBS存储桶。 Python 2.7 不支持该方式 假如函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的是:入口函数是程序执行的入口,确保解压后,入口函数所在的文件位于根目录。 如果函数工程引入了第三方依赖,可以将第三方依赖打成ZIP包,在函数代码界面设置外部依赖包;也可以将第三方依赖和函数工程文件一起打包。 将工程打成ZIP包,上传到OBS存储桶。 Python 3.6 不支持该方式 假如函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的是:入口函数是程序执行的入口,确保解压后,入口函数所在的文件位于根目录。 如果函数工程引入了第三方依赖,可以将第三方依赖打成ZIP包,在函数代码界面设置外部依赖包;也可以将第三方依赖和函数工程文件一起打包。 将工程打成ZIP包,上传到OBS存储桶。 Java 8 如果函数没有引用第三方件,可以直接将函数工程编译成Jar包。 如果函数引用第三方件,将函数工程编译成Jar包后,将所有依赖三方件和函数jar包打成ZIP包。 将工程打成ZIP包,上传到OBS存储桶。 Go 1.x 不支持该方式 必须在编译之后打zip包,编译后的二进制文件必须与执行函数入口保持一致,例如二进制名称为Handler,则执行入口为Handler。 将工程打成ZIP包,上传到OBS存储桶。 C# 不支持该方式 必须在编译之后打zip包,必须包含“工程名.deps.json”,“工程名.dll”,“工程名.runtimeconfig.json”,“工程名.pdb”和“HC.Serverless.Function.Common.dll”文件。 将工程打成ZIP包,直接上传到OBS存储桶。 定制运行时 不支持该方式 打zip包,必须包含“bootstrap”可执行引导文件。 将工程打成ZIP包,直接上传到OBS存储桶。
  • Redis健康检查 Redis健康检查的作用是判断Redis服务端是否正常工作,使用health_check_interval配置对Redis进行定时健康检查,该配置单位为秒,默认值为0不进行健康检查,代码如下: retry = Retry(ExponentialBackoff(), 3) pool = BlockingConnectionPool(host=redis_host, port=redis_port, password=redis_password, max_connections=50, timeout=3, socket_timeout=2, socket_connect_timeout=2, retry=retry, retry_on_error=[BusyLoadingError, ConnectionError, TimeoutError], health_check_interval=60, decode_responses=True) 如果业务量大建议不使用该配置,进而减少开销。 父主题: 代码解读
  • 云日志服务(LTS)管理函数日志 FunctionGraph支持开通云日志服务(LTS),使用更丰富的函数日志管理功能。开通云日志服务后,FunctionGraph会自动创建1个日志组(functiongraph开头),创建函数后,会默认生成一个日志流(函数名称开头)。 您也可以针对某个函数自行关联日志组和日志流,管理函数日志,即进行函数调用后,调用日志会保存到指定的日志组和日志流下。具体操作请参见配置日志组及日志流。 默认创建的20个日志流,您无法自定义。您可以在函数的“日志”页签下,按“F12”,找到query接口里的日志流ID,再到lts里找到对应的日志流ID。 若在LTS控制台误删函数日志组,之前的日志数据不可找回,FunctionGraph服务不感知该操作。此时您可以通过修改函数常规设置中的描述信息,保存后触发重建函数日志组。 开通云日志服务(LTS)管理函数日志。 FunctionGraph V1版本开通:在“日志”页签,单击“使用 云日志服务(LTS) 管理函数日志”,页面直接切换至LTS管理函数日志的页面。 FunctionGraph V1版本支持“切换旧版”,将会停用云日志服务(LTS) ,并切换为 应用运维管理 服务( AOM ) 管理函数日志。 函数运行过程中产生的日志管理费用将按需收取。 FunctionGraph V2版本开通:在“日志”页签,直接单击“点击开通”。继续单击“确认”,右上角弹出“开通成功”。 FunctionGraph V2版本当前只支持使用LTS管理函数日志。 设置查询条件。 请求列表:支持设置请求ID、调用结果(执行成功、执行失败)、原因分析(初始化失败、加载失败、系统错误、调用超时、内存超限、磁盘超限、代码异常)。 请求日志:支持关键字、请求ID、实例ID。 表1 调用结果 调用结果 说明 执行成功 函数执行成功打印的日志。 执行失败 函数执行失败打印的日志,包函调用超时、内存超限、磁盘超限、代码异常四种情况。 若想查看调用超时的日志信息,请将“日志类型”切换为调用超时,另外3种执行失败下的日志类型查看方法相同。 表2 原因分析 原因分析 说明 初始化失败 函数初始化失败打印的日志。 加载失败 runtime加载用户函数文件失败打印的日志 系统错误 内部错误。 调用超时 函数调用时间超过配置的“执行超时时间”打印的日志。 内存超限 函数内存大小超过配置的“内存”大小打印的日志。 磁盘超限 磁盘超出限制大小打印的日志。 代码异常 代码出现异常情况打印的日志。 支持的时间条件:最近1小时、最近1天、最近3天及自定义。 您可以单击“到LTS进行 日志分析 等更多操作”,前往LTS控制台管理函数日志。 用户普通实例的初始化阶段的日志大小限制为(10MB),超过大小限制的日志进行滚动更新,为您保留最新的日志。
  • 预留实例计费规则 预留实例的创建和释放由用户管理,根据预留实例的执行时长计费。通过预留实例,用户能够预热函数,从而彻底消除冷启动对延时的影响。 当用户调用API创建预留实例时,在预留实例创建成功后开始计费。 当用户调用API释放预留实例时,新的请求不会再路由到该预留实例上,因此该预留实例将在限定的时间内被释放,预留实例释放时停止计费。 图1 预留实例生命周期 如上图1所示,计费时长为T1~T4。 预留实例计量粒度为秒,不足一分钟,按照一分钟计费。超过一分钟,按照实际执行时长计费。 例如预留实例执行时长为51秒,按照1分钟计费。执行时长为61秒,则计费时长仍然为61秒。 执行时间费用的单位为GB-秒,指函数内存规格为1GB时,执行1秒的费用。
  • 适用计费项 函数工作流实际费用是由请求次数费用、执行时间费用、函数流节点执行次数、GPU计量时间、磁盘计量时间、闲置内存计量时间和其他费用构成,各计费项按需计费说明请参见表1。 表1 计费项说明 计费项 说明 请求次数费用 在您使用函数的过程中会产生请求次数费用,请求次数是所有函数的请求总数。 执行时间费用(非预留实例) 执行时间费用包含两个变量:函数分配的内存大小和执行时长。以下介绍计算资源消耗的方式: 函数计算资源消耗是函数所选内存和函数执行时长的乘积,执行时长是从函数代码开始执行的时间算起到其返回或终止的时间为止,计量的粒度是1毫秒,不足1毫秒按1毫秒计费。 执行时间费用(预留实例) 执行时间费用包含两个变量:函数分配的内存大小和执行时长。以下介绍计算资源消耗的方式: 函数计算资源消耗是函数所选内存和函数执行时长的乘积,执行时长是从预留实例创建成功后开始算起到用户调用API释放预留实例为止。如果预留实例存活时长不足1分钟,将按照1分钟计算,超过1分钟的部分,按照秒的粒度向上取整计算。 节点执行次数费用(函数流) 函数流中除开始、结束和异常分支节点外,其他节点都要统计执行次数计费。 GPU计量时间费用 根据您配置函数的GPU规格和函数执行时长计费,输入值必须在0GB到10GB之间,执行时长的计量粒度是1毫秒。 磁盘计量时间费用 根据您配置函数的磁盘规格和函数执行时长计费,磁盘超出512MB的部分才计费,输入值必须在512MB到10GB之间,执行时长的计量粒度是1毫秒。 闲置内存计量时间费用 在配置预留实例时可开启,表示预留实例在无调用的时候暂停CPU,节省资源,降低费用成本。详情请参见预留实例管理。 其他费用 在您使用函数工作流服务过程中,如果搭配使用了其它华为云服务,如OBS、 SMN 等,则您需要为该服务支付额外的费用,具体费用请参考价格详情。
  • 计费周期 华为云函数工作流 FunctionGraph 按照实际使用量付费,没有最低消费。计费模式采用累计分档计费,按天结算,即每日3点后对前一日使用量进行扣费。例如,2023-05-11 00:00:00至2023-05-11 23:59:59期间产生的费用,通常会在2023-05-12 03:00:00左右完成扣费。 函数响应事件通知或调用(包括控制台的测试调用)开始执行时记为一次请求,请求次数是所有函数的请求总数。 未使用预留实例情况下,执行时间是从函数代码开始执行的时间算起到其返回或终止的时间为止。计量粒度是1毫秒,不足1毫秒按1毫秒计费。例如,函数A执行了0.5毫秒、函数B执行了2.3毫秒,则计算函数资源消耗时,函数A执行时间按照1毫秒计费、函数B执行时间按照3毫秒计费。 使用预留实例情况下,执行时间是从实例创建成功后开始算起到用户调用API释放预留实例为止。计量粒度是1秒,不足1分钟按1分钟计算,超过一分钟的部分,按照秒的粒度向上取整计算,比如运行时间为51秒,将按60秒计算;运行时间为60.5秒,则按61秒计算,以此类推。
  • SDK接口 Context类中提供了许多上下文方法供用户使用,其声明和功能如表1所示。 表1 Context类上下文方法说明 方法名 方法说明 getRequestID() 获取请求ID。 getRemainingTimeInMilliSeconds () 获取函数剩余运行时间。 getAccessKey() 获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。 说明: 当前函数工作流已停止维护Runtime SDK 中getAccessKey接口,您将无法使用getAccessKey获取临时AK。 getSecretKey() 获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。 说明: 当前函数工作流已停止维护Runtime SDK 中getSecretKey接口,您将无法使用getSecretKey获取临时SK。 getSecurityAccessKey() 获取用户委托的SecurityAccessKey(有效期24小时),使用该方法需要给函数配置委托。 getSecuritySecretKey() 获取用户委托的SecuritySecretKey(有效期24小时),使用该方法需要给函数配置委托。 getSecurityToken() 获取用户委托的SecurityToken(有效期24小时),使用该方法需要给函数配置委托。 getUserData(string key) 通过key获取用户通过环境变量传入的值。 getFunctionName() 获取函数名称。 getRunningTimeInSeconds () 获取函数超时时间。 getVersion() 获取函数的版本。 getMemorySize() 分配的内存。 getCPUNumber() 获取函数占用的CPU资源。 getPackage() 获取函数组。 getToken() 获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。 getLogger() 获取context提供的logger方法,返回一个日志输出类,通过使用其info方法按“时间-请求ID-输出内容”的格式输出日志。 如调用info方法输出日志: logg = context.getLogger() logg.info("hello") getAlias 获取函数的别名 getToken()、getAccessKey()和getSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。
  • Node.js的initializer入口介绍 FunctionGraph目前支持以下Node.js运行环境: Node.js6.10 (runtime = Node.js6) Node.js8.10 (runtime = Node.js8) Nodejs10.16(runtime = Node.js10) Nodejs12.13(runtime = Node.js12) Node.js14.18(runtime = Node.js14) Node.js16.17(runtime = Node.js16) Node.js18.15(runtime = Node.js18)
  • 执行结果 执行结果由3部分组成:函数返回、执行摘要和日志。 表2 执行结果说明 参数项 执行成功 执行失败 函数返回 返回函数中定义的返回信息。 返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType":"", } errorMessage:Runtime返回的错误信息 errorType:错误类型 执行摘要 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 日志 打印函数日志,最多显示4KB的日志。 打印报错信息,最多显示4KB的日志。
  • 函数定义 PHP 7.3函数的接口定义如下所示: function handler($event, $context) 入口函数名($handler):入口函数名称, 需和函数执行入口处用户自定义的入口函数名称一致。 执行事件($event):函数执行界面由用户输入的执行事件参数, 格式为JSON对象。 上下文环境($context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。 函数执行入口: index.handler。 函数执行入口格式为“[文件名].[函数名]”。例如创建函数时设置为index.handler,那么FunctionGraph会去加载index.php中定义的handler函数。