云服务器内容精选

  • Java函数接口定义 Java函数接口定义:作用域 返回参数 函数名(函数参数,Context参数) 作用域:提供给FunctionGraph调用的用户函数必须定义为public。 返回参数:用户定义,FunctionGraph负责转换为字符串,作为HTTP Response返回。对于返回参数对象类型,HTTP Response该类型的JSON字符串。 函数名:用户定义函数名称。 函数参数:用户定义参数,当前函数仅支持一个用户参数。对于复杂参数,建议定义为对象类型,以JSON字符串提供数据。FunctionGraph调用函数时,解析JSON为对象。 Context:runtime提供函数执行上下文,其接口定义在SDK接口说明。 Java函数的函数执行入口参数格式为:[包名].[类名].[执行函数名],请参考函数执行入口进行配置。
  • Java的initializer入口介绍 函数工作流 服务目前支持以下Java运行环境。 Java 8 (runtime = Java8) Java 11(runtime = Java11) Initializer格式为:[包名].[类名].[执行函数名] 示例:创建函数时指定的initializer为com.huawei.Demo.my_initializer,那么FunctionGraph会去加载com.huawei包,Demo类中定义的my_initializer函数。 在函数工作流服务中使用Java实现initializer接口,需要定义一个java函数作为initializer入口,以下为initializer的简单示例。 public void my_initializer(Context context) { RuntimeLogger log = context.getLogger(); log.log(String.format("ak:%s", context.getAccessKey())); } 函数名 my_initializer需要与实现initializer接口时的initializer字段相对应。 context参数 context参数中包含一些函数的运行时信息,例如:request id、临时AccessKey、function meta等。
  • Java函数接口定义 Java函数接口定义:作用域 返回参数 函数名(函数参数,Context参数) 作用域:提供给FunctionGraph调用的用户函数必须定义为public。 返回参数:用户定义,FunctionGraph负责转换为字符串,作为HTTP Response返回。对于返回参数对象类型,HTTP Response该类型的JSON字符串。 函数名:用户定义函数名称。 函数参数:用户定义参数,当前函数仅支持一个用户参数。对于复杂参数,建议定义为对象类型,以JSON字符串提供数据。FunctionGraph调用函数时,解析JSON为对象。 Context:runtime提供函数执行上下文,其接口定义在SDK接口说明。 Java函数的函数执行入口参数格式为:[包名].[类名].[执行函数名],请参考函数执行入口进行配置。
  • Java的initializer入口介绍 函数工作流服务目前支持以下Java运行环境。 Java 8 (runtime = Java8) Java 11(runtime = Java11) Initializer格式为:[包名].[类名].[执行函数名] 示例:创建函数时指定的initializer为com.huawei.Demo.my_initializer,那么FunctionGraph会去加载com.huawei包,Demo类中定义的my_initializer函数。 在函数工作流服务中使用Java实现initializer接口,需要定义一个java函数作为initializer入口,以下为initializer的简单示例。 public void my_initializer(Context context) { RuntimeLogger log = context.getLogger(); log.log(String.format("ak:%s", context.getAccessKey())); } 函数名 my_initializer需要与实现initializer接口时的initializer字段相对应。 context参数 context参数中包含一些函数的运行时信息,例如:request id、临时AccessKey、function meta等。
  • 示例 metadata: description: This is an example application for FunctionGraph. author: Serverless team homePageUrl: https://www.huaweicloud.com/product/functiongraph.html version: 1.0.0 components: - name: helloworld type: Huawei::FunctionGraph::Function properties: region: cn-east-4 codeUri: https://test-wkx.obs.cn-north-4.myhuaweicloud.com/helloworld.zip projectID: 0531e14952000f742f3ec0088c4b25cf handler: index.handler runtime: Python3.9 memorySize: 256 timeout: 60 userData: key1: value1 key2: value2 encryptedUserData: '{"nonce": "ZEUOREFaiahRbMz+K9xQwA==", "header": "aGVhZGVy", "ciphertext": "SCxXsffvpU1BF2Ci8a2RedNQ", "tag": "a+EYRVPOsQ+YpQkMuFg1wA=="}' initializerTimeout: 30 initializerHandler: index.init_handler strategyConfig: concurrency: 80 concurrentNum: 20
  • 详解 函数配置在cam.yaml的properties属性下,当前支持的函数配置详解如下: 参数 是否必须 是否更新 描述 region 是 否 调用函数所在region。 codeUri 是 否 函数代码地址。该值为函数代码包在OBS上的地址。 projectID 是 否 租户Project ID。 handler 是 是 函数执行入口。 runtime 是 否 FunctionGraph函数的执行环境支持Node.js6.10、Python2.7、Python3.6、PHP7.3、Java8、Node.js 8.10、C#.NET Core 2.0、C#.NET Core 2.1。 Python2.7: Python语言2.7版本。 Python3.6: Python语言3.6版本。 PHP7.3: Php语言7.3版本。 Java8: Java语言8版本。 Node.js6.10: Nodejs语言6.10版本。 Node.js8.10: Nodejs语言8.10版本。 C#(.NET Core 2.0): C#语言2.0版本。 C#(.NET Core 2.1): C#语言2.1版本。 C#(.NET Core 3.1): C#语言3.1版本。 Custom: 自定义运行时。 memorySize 是 是 函数内存,单位M。 枚举值: 128、256、512、768、1024、1280、1536、1792、2048、2560、3072、3584、4096 timeout 是 是 函数运行超时时间,单位秒,范围3~900秒。 userData 否 是 用户自定义的name/value信息,在函数中使用的参数。 encryptedUserData 否 是 用户自定义的name/value信息,用于需要加密的配置。 initializerTimeout 否 是 初始化超时时间,超时函数将被强行停止,范围1~300秒。 initializerHandler 否 是 函数初始化入口,规则:xx.xx,必须包含“. ”。 举例:对于node.js函数:myfunction.initializer,则表示函数的文件名为myfunction.js,初始化的入口函数名为initializer。 concurrentNum 否 是 函数单实例并发数。 concurrency 否 是 单函数最大实例数,0禁用函数,-1无限制,例100,该函数最大实例数100(普通实例+预留实例)。 当前cam.yaml不支持VPC、委托、磁盘挂载和动态内存配置的更新,如果函数需要使用VPC、委托或者磁盘挂载和动态内存请在函数界面手动配置,在使用函数更新流水线时会保留VPC、委托、磁盘挂载和动态内存配置,不会覆盖掉。 为了避免在cam.yaml中明文显示函数的加密配置-encryptedUserData,该CICD使用了AES对称加密的GCM模式对encryptedUserData明文内容进行加密,加密输出配置为cam.yaml中encryptedUserData项对应的值。在functions仓库和“函数更新流水线”中encryptedUserData的值以密文传输,在最后部署更新函数时解密更新,所以在执行“函数更新流水线”时需提供AES加密时使用的Key。示例如下: encryptedUserData明文: '{"password":"123"}' 使用AES-GCM加密后: {"nonce": "ZEUOREFaiahRbMz+K9xQwA==", "header": "aGVhZGVy", "ciphertext": "SCxXsffvpU1BF2Ci8a2RedNQ", "tag": "a+EYRVPOsQ+YpQkMuFg1wA=="},其中ciphertext为加密后的密文。
  • 安装KooCLI命令行工具 安装KooCLI命令行工具 远程登录购买的 ECS云服务器 ,执行如下命令安装KooCLI: curl -sSL https://hwcloudcli.obs.cn-north-1.myhuaweicloud.com/cli/latest/hcloud_install.sh -o ./hcloud_install.sh && bash ./hcloud_install.sh 图2 安装命令行工具 初始化KooCLI命令行工具 使用如下命令初始化KooCLI命令行工具: hcloud configure init 需要输入Access Key ID、Secret Access key和Region Name,获取方法请参见3、4。 图3 初始化KooCLI命令行工具 获取访问密钥(Access Key ID和Secret Access key) 如果您有登录密码,可以登录控制台,可以在我的凭证中获取自己的访问密钥AK/SK。请参见:新增访问密钥。可以下载得到AK/SK文件,文件名一般为:credentials.csv。如下图所示,文件包含了用户名称(User Name),AK(Access Key Id),SK(Secret Access Key)。 图4 credentials.csv文件内容 如果您没有登录密码,不能登录控制台,在访问密钥异常丢失或者需要重置时,可以请账号管理员在 IAM 中生成您的访问密钥,并发送给您。请参见:管理IAM用户访问密钥。 获取Region Name 请参见:地区和终端节点。 图5 获取区域
  • HTTP终端节点 此设置指定当有人通过GET请求访问函数API终端节点时,应运行first函数。您可以在部署服务后运行serverless info命令来获取终端节点的URL。 以下是一个例子: # serverless.yml functions: hello: handler: index.hello events: - apigw: env_id: DEFAULT_ENVIRONMENT_RELEASE_ID env_name: RELEASE req_method: GET path: /test name: API_test 请参考有关函数执行入口的文档,了解用于此类事件的入口函数签名。
  • 示例 简单的函数调用 serverless invoke --function functionName 本示例将调用部署的函数,并在终端中输出调用的结果。 带数据的函数调用 serverless invoke --function functionName --data '{"name": "Bob"}' 此示例将使用提供的数据调用函数,并在终端中输出调用的结果。 带传递数据的函数调用 serverless invoke --function functionName --path lib/event.json 此示例将在调用指定/部署的函数时传递lib/event.json文件(相对于服务的根目录的相对路径)中的JSON数据。 event.json示例: { "key": "value" }
  • 示例 从GitHub URL安装服务 serverless install --url https://github.com/zy-linn/examples/tree/v3/legacy/huawei-nodejs 本示例将从GitHub下载huawei-nodejs服务的.zip文件,在当前工作目录下创建一个名为huawei-nodejs的新目录,并将文件解压到该目录下。 使用新服务名称从GitHub URL安装服务 serverless install --url https://github.com/zy-linn/examples/tree/v3/legacy/huawei-nodejs--name my-huawei-service 此示例执行过程如下: 从GitHub下载huawei-nodejs服务的.zip文件。 在当前工作目录中创建名为my-huawei-service的新目录。 在此目录中解压文件。 如果根服务中存在serverless.yml,则将服务重命名为my-huawei-service。 从GitHub URL中的目录安装服务 serverless install --url https://github.com/zy-linn/examples/tree/v3/legacy/huawei-nodejs 本示例将从GitHub下载huawei-nodejs服务。
  • 示例 创建新服务 serverless create --template-url https://github.com/zy-linn/examples/tree/v3/legacy/huawei-nodejs --name my-special-service 此示例将为服务生成Node.js运行时。华为作为提供商,该运行时将在当前工作目录中生成。 在(新)目录中创建指定名称的服务 serverless create --template-url https://github.com/zy-linn/examples/tree/v3/legacy/huawei-nodejs --path my-new-service 此示例将为服务生成Node.js运行时。华为作为提供商,该运行时将在my-new-service目录中生成;如不存在该目录,则会自动生成。在其他情况下Serverless将使用已经存在的目录。 此外,Serverless将根据您提供的路径将服务重命名。在此示例中,服务将重命名为my-new-service。
  • 从环境变量中引用变量 要引用环境变量中的变量,请在serverless.yml中使用${env:someProperty}语法,如下: service: new-service provider: name: huawei runtime: Node.js14.18 credentials: ~/.fg/credentials # path must be absolute environment: variables: ENV_FIRST: ${env:TENCENTCLOUD_APPID} plugins: - serverless-huawei-functions functions: hello: handler: index.hello
  • 打包配置 有时,您可能希望对函数产物以及它们的打包方式有更多的控制。 您可以使用patterns配置来更多地控制打包过程。 Patterns 您可以定义将从结果产物中排除/包括的全局模式。如果您希望排除文件,可以使用前缀为“!”的全局模式,如:!exclude-me/**。Serverless Framework将运行全局模式,以便您始终可以重新包含以前排除的文件和目录。 示例 排除所有node_modules,然后专门使用exclude重新包含的特定模块(在本例中为node-fetch): package: patterns: - '!node_modules/**' - 'node_modules/node-fetch/**' 排除handler.js以外的所有文件: package: patterns: - '!src/**' - src/function/handler.js 如果要排除目录,请不要忘记使用正确的全局语法,可参考如下: package: patterns: - '!tmp/**' - '!.git/**'
  • 配置 事件属于每个函数,可以在serverless.yml的events属性中找到。 # serverless.yml functions: first: # Function name handler: index.http # Reference to file index.js & exported function 'http' events: - apigw: env_id: DEFAULT_ENVIRONMENT_RELEASE_ID env_name: RELEASE req_method: GET path: /test name: API_test 目前,每个函数只支持一个事件定义。
  • 内存大小和超时 函数的memorySize和timeout可以在提供商或函数层面指定。提供商层面的定义允许所有函数共享此配置,而函数层面的定义意味着此配置仅对当前函数有效。 如果未指定,默认memorySize为256MB,timeout为30s。 # serverless.yml provider: memorySize: 512 timeout: 90 functions: first: handler: first second: handler: second memorySize: 256 timeout: 60