云服务器内容精选

  • 编辑函数程序 打开创建的函数iotdemo,复制以下坐标转换代码,仅供测试不建议用于生产用途,用户也可以根据自己的需要修改。 # -*- coding:utf-8 -*- import json import math from math import pi def handler(event, context): data = event["notify_data"]["body"] lat = data["lat"] lng = data["lng"] print(f" WGS84: ({lng},{lat})") gcj_lng, gcj_lat = transform(lng, lat) print(f" GCJ02: ({gcj_lng},{gcj_lat})") body = { "gcj_lng": gcj_lng, "gcj_lat": gcj_lat } return { "statusCode": 200, "isBase64Encoded": False, "body": json.dumps(body), "headers": { "Content-Type": "application/json" } } def transform(lon, lat): a = 6378245.0 ee = 0.00669342162296594323 dlat = transform_lat(lon - 105.0, lat - 35.0) dlon = transform_lon(lon - 105.0, lat - 35.0) rad_lat = lat / 180.0 * pi magic = math.sin(rad_lat) magic = 1 - ee * magic * magic sqrt_magic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi) dlon = (dlon * 180.0) / (a / sqrt_magic * math.cos(rad_lat) * pi) mg_lon = lon + dlon mg_lat = lat + dlat return mg_lon, mg_lat def transform_lon(x, y): ret = 300.0 + x + 2.0 * y + 0.1 * x * x + \ 0.1 * x * y + 0.1 * math.sqrt(math.fabs(x)) ret += (20.0 * math.sin(6.0 * pi * x) + 20.0 * math.sin(2.0 * pi * x)) * 2.0 / 3.0 ret += (20.0 * math.sin(pi * x) + 40.0 * math.sin(pi / 3.0 * x)) * 2.0 / 3.0 ret += (150.0 * math.sin(pi / 12.0 * x) + 300.0 * math.sin(pi / 30.0 * x)) * 2.0 / 3.0 return ret def transform_lat(x, y): ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + \ 0.1 * x * y + 0.2 * math.sqrt(math.fabs(x)) ret += (20.0 * math.sin(6.0 * pi * x) + 20.0 * math.sin(2.0 * pi * x)) * 2.0 / 3.0 ret += (20.0 * math.sin(pi * y) + 40.0 * math.sin(pi / 3.0 * y)) * 2.0 / 3.0 ret += (160.0 * math.sin(pi / 12.0 * y) + 320 * math.sin(pi / 30.0 * y)) * 2.0 / 3.0 return ret
  • 创建函数流 返回函数工作流控制台,在左侧导航栏选择“函数流”,进入函数流列表界面。 单击“创建快速函数流”,进入创建快速函数流流程。 图2 创建快速函数流 拖拽一个函数节点,单击函数节点配置元信息: 应用:默认“default”; 函数:选择上一步创建好的函数test-rotate; 版本:默认“latest”; 其他参数默认值即可。 图3 配置元信息 参数配置完成后,单击“确定”。 函数流节点创建完成后,单击右上角“保存”,配置如下函数流基本信息,完成后单击“确定”,完成函数流创建。 名称:test-rotate-workflow; 企业项目:默认“default”; 日志记录:默认“ALL”; 其他参数保持默认值。 图4 保存函数流
  • 创建程序包 本例使用Python语言实现为图片打水印的功能,有关函数开发的过程请参考Python函数开发。本例不再介绍业务功能实现的代码,样例代码目录如图1所示。 图1 样例代码目录 其中index.py为函数执行的入口文件,index.py中入口函数的代码片段如下,参数“obs_output_bucket”为打水印后的图片存储地址,需要在创建函数时配置自定义参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def handler(event, context): srcBucket, srcObjName = getObjInfoFromObsEvent(event) outputBucket = context.getUserData('obs_output_bucket') client = newObsClient(context) # download file uploaded by user from obs localFile = "/tmp/" + srcObjName downloadFile(client, srcBucket, srcObjName, localFile) outFileName, outFile = watermark_image(localFile, srcObjName) # 将转换后的文件上传到新的obs桶中 uploadFileToObs(client, outputBucket, outFileName, outFile) return 'OK'
  • 创建委托 如下示例表示:为FuntionGraph赋予Tenant Administrator权限,仅在授权区域生效。 按照如下参数设置委托,创建委托的具体步骤请参见如何创建委托。 登录统一身份认证服务(IAM)控制台。 在统一身份认证服务(IAM)的左侧导航窗格中,选择“委托”页签,单击右上方的“+创建委托”。 图1 创建委托 开始配置委托。 图2 填写基本信息 委托名称:serverless-trust。 委托类型:选择“云服务”。 云服务:选择“函数工作流 FunctionGraph”。 持续时间:选择“永久”。 描述:填写描述信息。 单击“下一步”,进入委托选择页面,在右方搜索框中搜索需要添加的权限并勾选。此处以添加Tenant Administrator权限为例。 图3 选择策略 表2 委托权限示例 权限名称 使用描述/场景 Tenant Administrator 全部云服务管理员(除IAM管理权限),拥有该权限的用户可以对企业拥有的所有云资源执行任意操作。 单击“下一步”,选择权限的作用范围。 图4 根据业务需要选择对应的权限
  • 应用场景 若您在FunctionGraph服务中使用如下场景,请先创建委托。创建委托时授予的权限类型请您根据实际业务需要进行调整,比如前期您在开发阶段授予Admin权限,后期在生产环境中建议您调整为细粒度最小使用权限,保证业务所需权限的同时,也降低权限过大的风险。具体对应授权项参见表1 常见授权项选择进行选择。 表1 常见授权项选择 场景 Admin权限 细粒度最小使用权限 说明 使用自定义镜像 SWR Admin 暂不支持 SWR Admin:容器镜像服务(SWR)管理员,拥有该服务下的所有权限。 如何创建自定义镜像,请参见使用容器镜像部署函数。 挂载SFS文件系统 SFS Administrator 暂不支持 SFS Administrator:弹性文件服务(SFS)管理员,拥有该服务下的所有权限。 如何挂载SFS文件系统,请参见添加SFS容量型文件系统。 挂载sfs turbo文件系统 SFS Administrator sfsturbo:shares:getShare(查询单个文件系统详细信息) SFS Administrator:弹性文件服务(SFS)管理员,拥有该服务下的所有权限。 sfsturbo:shares:getShare:您拥有SFS服务下查询单个文件系统信息的权限。 如何挂载挂载sfs turbo文件系统,请参见添加sfs turbo文件系统。 挂载ECS共享目录 Tenant Guest及VPC Administrator ecs:cloudServers:get(查询云服务器详情) Tenant Guest:全部云服务只读权限(除IAM权限) VPC Administrator:网络管理员 ecs:cloudServers:get:您拥有ECS服务下查询云服务器信息的权限。 如何挂载ECS共享目录,请参见添加ECS共享目录。 使用APM调用链 APM Administrator 暂不支持 APM Administrator:应用性能管理服务管理员。 该功能无需配置委托,只需您账号拥有APM服务相关权限以及函数“设置”修改权限即可配置和查询。 如何开通APM调用链,请参见调用链管理。 使用DIS触发器 DIS Administrator 暂不支持 数据接入服务(DIS)管理员,拥有该服务下的所有权限。 如何创建DIS触发器,请参见使用DIS触发器。 配置跨域VPC访问 VPC Administrator vpc:ports:delete(删除端口) vpc:ports:get(查询端口) vpc:ports:create(创建端口) vpc:vpcs:get(查询VPC) vpc:subnets:get(查询子网) 拥有VPC Administrator权限的用户可以对VPC内所有资源执行任意操作。在函数配置跨VPC访问时,则函数必须配置具备VPC管理权限的委托。 VPC细粒度最小使用权限:您拥有VPC服务下删除端口、查询端口、创建端口、查询VPC、查询子网的权限。 如何配置跨域VPC访问,请参见配置网络。 读取云解析服务(DNS)的资源 DNS ReadOnlyAccess dns:recordset:get(查询租户Record Set资源列表) dns:zone:get(查询租户zone) DNS ReadOnlyAccess:云解析服务只读权限,拥有该权限的用户仅能查看云解析服务资源。在函数配置调用DNS服务的接口解析内网域名时,则函数必须具备读取DNS资源权限的委托。 DNS细粒度最小使用权限:您拥有DNS服务下查询租户Record Set资源列表和查询租户zone的权限。 如何调用DNS服务的接口解析内网域名,请参见解析DNS内网域名。 创建OBS桶和OBS触发器 OBS Administrator obs:bucket:GetBucketLocation(获取桶区域位置) obs:bucket:ListAllMyBuckets(获取桶列表) obs:bucket:GetBucketNotification(获取桶的消息通知配置) obs:bucket:PutBucketNotification(设置桶的消息通知配置) OBS Administrator:对象存储服务管理员。 OBS细粒度最小使用权限:你拥有OBS服务下获取桶区域位置、获取桶列表、获取桶的消息通知配置、设置桶的消息通知配置的权限。 如何创建OBS触发器,请参见使用OBS触发器。
  • 场景介绍 使用磁盘挂载功能需要开放如下端口: 111、445、2049、2051、2052、20048。 对于Ubuntu系统还需再开放3个端口,获取方式请在任意目录下执行如下命令。 rpcinfo -p|grep mountd|grep tcp 具体请参见弹性文件服务会占用用户的哪些资源。 目前FunctionGraph函数支持以下文件系统配置。 SFS文件系统 弹性文件服务(Scalable File Service,SFS)提供按需扩展的高性能文件存储(NAS),可为云上多个弹性云服务器(Elastic Cloud Server,ECS),容器(CCE&CCI),裸金属服务器(BMS)提供共享访问。SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、媒体处理、文件共享、内容管理和Web服务等。 SFS Turbo文件系统 SFS Turbo分为SFS Turbo标准型(500GB~32TB)、SFS Turbo标准型-增强版(10TB~320TB)、SFS Turbo性能型(500GB~32TB)和SFS Turbo性能型-增强版(10TB~320TB)。SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。详情请参见SFS产品介绍。 ECS共享目录 ECS共享目录是通过nfs服务,把ECS上的指定目录设置为共享文件系统(详情请参见添加ECS共享目录),函数(和ECS相同的VPC配置)可以挂载对应目录进行读写等操作,实现计算资源的动态扩展。此类型适合业务不太频繁的场景。 使用文件系统挂载功能具有以下优势: 函数执行空间相比于/tmp,可以极大扩展存储空间。 多个函数之间可以共享访问已经配置好的文件系统。 ECS计算资源动态扩展,利用ECS已有的存储能力实现更大的计算能力。 您可以在/tmp路径下写临时文件,最大不能超过10,240MB。
  • 添加sfs turbo文件系统 设置委托 挂载sfs turbo文件系统需要给函数设置委托(至少拥有sfs administrator以及VPC administrator权限)。如果没有对应权限的委托,需要新创建。 设置VPC sfs turbo涉及VPC内部网络访问,添加sfs turbo文件系统前需要给函数配置sfs turbo对应的VPC。 在弹性文件服务中,获取需要挂载的文件系统的VPC和子网信息,具体操作请参见管理文件系统。 参见配置网络开启VPC访问,输入1中获取的VPC和子网。 添加挂载-SFS Turbo 添加sfs turbo和添加sfs过程相似,只要选好需要挂载的文件系统,设置好函数访问路径即可。
  • 添加ECS共享目录 添加委托 挂载ECS共享目录需要给函数设置委托(至少拥有tenant guest以及VPC administrator权限),如果没有对应权限的委托,需要新创建,详情请参见创建委托。 配置VPC 添加ECS共享目录前,也需要给函数配置ECS对应的VPC,可以到ECS详情页的“基本信息”页签中查看“虚拟私有云”。单击虚拟私有云名称,进入虚拟私有云的详情页,查看子网。 获取到这两个信息后,可以在函数配置中配置对应的VPC。 添加挂载-ECS 需要在界面上输入ECS上的共享目录路径信息和函数访问路径。 图1 填写路径信息
  • 创建程序包 本例使用Python语言实现图片压缩的功能,有关函数开发的过程请参考Python函数开发。本例不再介绍业务功能实现的代码,样例代码目录如图1所示。 图1 样例代码目录 其中index.py为函数执行的入口文件,index.py中入口函数的代码片段如下,参数“output_bucket”为压缩后的图片存储地址,需要在创建函数时配置自定义参数。 def handler(event, context): ak = context.getAccessKey() sk = context.getSecretKey() if ak == "" or sk == "": context.getLogger().error('Failed to access OBS because no temporary ' 'AK, SK, or token has been obtained. Please ' 'set an agency.') return 'Failed to access OBS because no temporary AK, SK, or token ' \ 'has been obtained. Please set an agency. ' obs_endpoint = context.getUserData('obs_endpoint') if not obs_endpoint: return 'obs_endpoint is not configured' output_bucket = context.getUserData('output_bucket') if not output_bucket: return 'output_bucket is not configured' compress_handler = ThumbnailHandler(context) records = event.get("Records", None) return compress_handler.run(records[0])
  • 请求参数代码定义示例 在FunctionGraph中开发函数,以python2.7语言为例,函数代码需要满足如下条件。 函数有明确的接口定义,如下所示: def handler (event, context) 入口函数名(handler):入口函数名称,需和函数执行入口处用户自定义的入口函数名称一致。 执行事件(event): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。 上下文环境(Context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。 执行事件(event)支持三种请求参数定义,格式为: Header中的请求参数:event["headers"]["参数名"] Query中的请求参数:event["queryStringParameters"]["参数名"] 您自定义的用户数据:event["user_data"] 函数代码获取的三种请求参数与API网关自定义认证中的参数关系如下所示: Header中的请求参数:对应自定义认证中参数位置为Header的身份来源,其参数值在您调用使用该前端自定义认证的API时传入 Query中的请求参数:对应自定义认证中参数位置为Query的身份来源,其参数值在您调用使用该前端自定义认证的API时传入 您自定义的用户数据:对应自定义认证中的用户数据,其参数值在您创建自定义认证时输入 函数的返回值不能大于1M,必须满足如下格式: { "statusCode":200, "body": "{\"status\": \"allow\", \"context\": {\"user\": \"abc\"}}" } 其中,body字段的内容为字符串格式,json解码之后为: { "status": "allow/deny", "context": { "user": "abc" } } “status”字段为必选,用于标识认证结果。只支持“allow”或“deny”,“allow”表示认证成功,“deny”表示认证失败。 “context”字段为可选,只支持字符串类型键值对,键值不支持JSON对象或数组。 context中的数据为您自定义的字段,认证通过后作为认证参数映射到API网关后端参数中,其中context中的参数名称与系统参数名称必须完全一致,且区分大小写,context中的参数名称必须以英文字母开头,支持英文大小写字母、数字、下划线和中划线,且长度为1 ~ 32个字符。 Header中的请求参数定义代码示例: # -*- coding:utf-8 -*- import json def handler(event, context): if event["headers"].get("auth")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"success" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp) Query中的请求参数定义代码示例: # -*- coding:utf-8 -*- import json def handler(event, context): if event["queryStringParameters"].get("test")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp) 用户数据定义代码示例: # -*- coding:utf-8 -*- import json def handler(event, context): if event.get("user_data")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
  • 创建函数 登录函数工作流控制台,在左侧导航栏选择“总览”,单击“创建函数”进入创建函数界面。 选择“创建空白函数”,在创建函数界面配置如下信息:函数类型选择“事件函数”、输入函数名“access-redis-demo”,选择运行时“Python3.9”,最后单击创建函数。 图1 创建函数 创建函数选择的“区域”与要访问的Redis实例所在的区域一致。 根据Redis实例类型选择示例代码覆盖函数代码详情页中index.py内的代码。 图2 替换代码 在函数代码详情页,单击“添加依赖包”,选择私有依赖包源,添加创建依赖包创建的redis-py-4.6.0依赖包。 图3 添加依赖包 在“设置”页签下修改“常规设置”,内存调整为256MB,执行超时时间为30s,然后单击保存。 图4 常规设置 在“设置”页签下配置“权限”,添加一个有VPC Administrator权限的委托,然后单击保存。 图5 配置委托 在“设置”页签下配置“网络配置”,选择待访问Redis实例所在的虚拟私有云(VPC)和子网。 图6 网络配置 在“设置”页签下添加“环境变量”,添加待访问Redis实例的redis_ip_address(Redis IP地址)和redis_password(Redis连接密码)环境变量,同时开启“redis_password”的“加密参数”功能,最后单击“保存”。 表1 环境变量说明 环境变量 说明 redis_ip_address Redis的IP地址。 redis_password Redis连接密码。 在“设置”页签下配置“高级设置”。开启“配置初始化函数”,“设置初始化超时时间”为“60s”,“函数初始化入口”为index.initializer。 图7 高级设置 父主题: 使用函数访问Redis数据库
  • 程序打包 使用Eclipse生成Jar包,步骤如下图所示,得到Table Tester.jar文件。 图5 Export 图6 选择类型 图7 发布 将函数依赖打包,方法如下。 下载程序包(fss_examples_dis_cloudtable.zip)文件,解压缩目录如图8所示。使用Table Tester.jar替换DIS Test.jar,替换文件目录后如图9所示。打ZIP包,如图10所示,得到disdemo.zip文件。 图8 文件目录 图9 替换后文件目录 图10 打ZIP包
  • 特征 在离线异步应用场景中,工作负载具有以下一个或多个特征: 执行时间长 业务的处理耗时一般在分钟~小时级,Response Time不敏感。 提交后立即返回 在触发调用后立即得到返回,从而不因长耗时处理阻塞业务主逻辑的执行。 实时感知任务状态 无 并行处理 离线GPU任务需要处理大量数据,对GPU资源供给要求高,通过API调用并行运行加快处理速度。 数据源集成 离线GPU任务对数据源的需求多种多样,处理过程中需要与多种存储产品(例如对象存储OBS)和多种消息产品(例如消息队列)进行频繁交互。
  • 约束与限制 仅支持Java函数。 如果应用函数强依赖于有状态,需要考虑使用Restore Hook进行状态刷新。 对于强依赖CPU指令集特性的函数,请先提前与客服确认。 依赖硬编码的host 环境(例如 hostname, 或者 hostip)的函数在迁移到其他主机上的时候,可能会有问题。建议避免依赖这些变量,请先提前与客服确认。 当前仅支持基于x86机器开发的应用。 该功能当前仅支持西南-贵阳一、土耳其-伊斯坦布尔。
  • 概述 华为云发布的基于进程级快照的冷启动加速方案,是一种性能优化服务,用户无需额外付费,只需进行简单的配置、少量的代码修改,即可享受到该创新方案带来的冷启动性能提升。 当用户 Java 函数打开冷启动加速的配置开关后,华为云 FunctionGraph 会预先执行函数对应的初始化代码,获取其初始化执行上下文环境的快照,并进行加密缓存。后续调用该函数并触发冷启动扩容时,会直接从提前初始化后的应用快照来恢复执行环境,而非重新走一遍初始化流程,以此达到极大提升启动性能的效果。