体验云函数

腾讯云
入门
0 个任务
剩余 2 个名额

你还可以 创建 或者 使用已有 云主机不限时上机

实验内容

无服务器云函数(Serverless Cloud Function)是腾讯云提供的无服务器(serverless)执行环境,您无需购买和管理服务器,而只需使用平台支持的语言编写核心代码并设置代码运行的条件,代码即可在腾讯云基础设施上弹性、安全地运行。本实验带你使用 SCF,轻松生成缩略图。

首次可免费使用云主机 1 小时 ,到期后云主机将被重置并退库,若想保留成果请及时留用。

实验资源

云服务器

软件环境

CentOS 7.2 64 位

目录

# 体验无服务器云函数 > 参考文档:https://cloud.tencent.com/document/product/583/9733 ## 准备腾讯云 API 调用工具 > <time>10min ~ 15min</time> 我们使用 API 命令行工具来管理并运行无服务器云函数(SCF),下面先来安装配置该工具。 ### 安装 Python 和 PIP Python 环境是腾讯云命令行工具运行时的必要环境。腾讯云的 CentOS 镜像已经包含 Python 的发行版本,可以用下面的命令查看: ```sh python -V ``` 下面,我们需要安装 Python 的包管理工具 PIP: ```sh yum install -y python-pip ``` > <checker type="output-contains" command="pip --version" hint="请安装 PIP"> > <keyword regex="pip" /> > </checker> ### 安装腾讯云 API 命令行工具 命令行工具已经发布到 PIP 中,可以直接用 PIP 进行安装: ```sh pip install tccli ``` > <checker type="output-contains" command="tccli --version" hint="请安装 tccli 工具"> > <keyword regex="\\d" /> > </checker> 命令行工具同时提供了一个自动补全的功能,使用下面的命令进行启用 [:question][auto-enable]: ```sh complete -C "$(which tccli_completer)" tccli ``` > <bubble for="auto-enable"> > 把下面的命令[添加到 .bashrc][edit-bashrc] 中可以在每次登陆后自动启用: > </bubble> > <edit for="edit-bashrc" file="/root/.bashrc" /> ### 配置 API 密钥 配置命令行工具使用的密钥: ```sh tccli configure ``` 工具会要求您提供: * TencentCloud API secretId: 粘贴您的 `SecretId` [:question][api-key] * TencentCloud API secretKey: 粘贴您的 `SecretKey` [:question][api-key] * region: 输入 `ap-guangzhou` [:question][region-help] * output:输入 `json` 配置完成后,测试下使用 CLI 拉取云主机列表: ```sh tccli cvm DescribeInstances ``` > <bubble for="api-key"> > 密钥信息请[到控制台查看](https://console.cloud.tencent.com/capi),如您还没有密钥,请创建一个。 > </bubble> > <bubble for="region-help"> > 如果是自有机器实验,请使用机器所在的地域 > </bubble> > <checker type="output-contains" command="cat /root/.tccli/configure" hint="配置 CLI 工具输出格式为 json"> > <keyword regex="output = json" /> > </checker> > <checker type="output-contains" command="cat /root/.tccli/credentials" hint="配置 CLI 工具默认凭据(SecretId)"> > <keyword regex="qcloud_secretid = \\w{36}" /> > </checker> > <checker type="output-contains" command="cat /root/.tccli/credentials" hint="配置 CLI 工具默认凭据(SecretKey)"> > <keyword regex="qcloud_secretkey = \\w{32}" /> > </checker> 如果工具成功返回,请进入下一步,如失败,请[到 /root/.tccli 目录检查配置][locate-configure]是否正确。 > <locate for="locate-configure" path="/root/.tccli" hint="tccli 工具配置目录"></locate> ## 与 SCF 的初体验 > <time>15min ~ 20min</time> 我们使用云 API 来创建一个无服务器云函数(后文统一称为 SCF),并且调用它, SCF 公测期间免费。 ### 创建函数目录 我们第一个 SCF 叫做 hello-scf,下面我们创建一个目录来存放它: ```sh mkdir -p /data/hello ``` > <checker type="output-contains" command="ls -la /data" hint="请创建目录 /data/hello"> > <keyword regex="hello" /> > </checker> ### 编写 Hello SCF 的内容 [创建 hello.py][create-hello-py],内容如下: ```python /// <example verb="create" file="/data/hello/hello.py" /> print('Start Hello World function') def main_handler(event, context): print("value1 = " + event['key1']) print("value2 = " + event['key2']) return event['key1'] #return the value of key "key1" ``` > <locate for="create-hello-py" path="/data/hello" hint="右击创建 hello.py"></locate> > <checker type="output-contains" command="cat /data/hello/hello.py" hint="请在 hello.py 完成 main_handler 方法"> > <keyword regex="main_handler" /> > </checker> ### 部署 Hello SCF 使用 [CreateFunction API][about-create-function] 来创建并部署一个 SCF: ```sh tccli scf CreateFunction \\ --FunctionName "hello" \\ --Code '{"ZipFile":"'$(cd /data/hello && zip -r - * | base64 | tr -d "\n")'"}' \\ --Handler "hello.main_handler" \\ --Description "My first scf" ``` 部署成功后,会有 `Success` 的返回,我们也可以使用 [ListFunctions][about-list-functions] 来查询自己账号下面有哪些 SCF: ```sh tccli scf ListFunctions ``` > <bubble for="about-create-function"> > CreateFunction 云 API 的详细说明,可[参考此处](https://cloud.tencent.com/document/product/583/18586)。 > </bubble> > <bubble for="about-list-functions"> > ListFunctions 云 API 的详细说明,可[参考此处](https://cloud.tencent.com/document/product/583/18582)。 > </bubble> > <checker type="output-contains" command="tccli scf ListFunctions" hint="请创建名为 hello 的 SCF"> > <keyword regex="functionName.+hello" /> > </checker> ### 运行 Hello SCF 现在,可以[到控制台查看您的 SCF 函数](https://console.cloud.tencent.com/scf)。在控制台点击名为 `hello` 的 SCF,然后点击界面右上角的 `测试` 按钮来测试该函数。 ## 用 SCF 处理缩略图生成任务 > <time>20min ~ 40min</time> 接下来,我们使用 SCF 来处理一些现实中更有意义的工作。比如,我们使用 SCF 为上传到 COS 的图片生成缩略图版本。 ### 准备 COS 仓库 本步骤可参考: * [视频 - 准备 COS 仓库][prepare-cos] 我们需要准备两个 COS 仓库,一个用于保存上传的图片,一个用于保存生成的缩略图,COS 提供了一定的免费额度超出额度将产生小额费用。 这个操作需要[到 COS 的控制台完成](https://console.cloud.tencent.com/cos4/bucket),步骤如下: 点击 `创建 Bucket`,使用下面的配置: * 名称:填写 `img` * 地域:选择 `华南` 点击 `返回`,再次点击 `创建 Bucket`,使用下面的配置: * 名称:填写 `imgresized` * 地域:选择 `华南` > <video for="prepare-cos" platform="qq" vid="n05281qi8ur" name="视频 - 准备 COS 仓库"></video> 准备好 COS 仓库后,请点击下一步。 ### 安装 SCF 任务需要的运行时库 使用 yum 安装下面的库: ```sh yum install python-devel gcc libjpeg-devel zlib-devel python-virtualenv -y ``` > <checker type="output-contains" command="yum list installed" hint="安装 python-devel"> > <keyword regex="python-devel" /> > </checker> > <checker type="output-contains" command="yum list installed" hint="安装 gcc"> > <keyword regex="gcc" /> > </checker> > <checker type="output-contains" command="yum list installed" hint="安装 libjpeg-devel"> > <keyword regex="libjpeg" /> > </checker> > <checker type="output-contains" command="yum list installed" hint="安装 zlib-devel"> > <keyword regex="zlib-devel" /> > </checker> > <checker type="output-contains" command="yum list installed" hint="安装 python-virtualenv"> > <keyword regex="python-virtualenv" /> > </checker> 安装完成后,可进入下一步。 ### 创建 SCF 工作目录 ```sh mkdir -p /data/thumbnail ``` > <checker type="output-contains" command="ls -la /data" hint="请创建目录 /data/thumbnail"> > <keyword regex="thumbnail" /> > </checker> ### 编写 Thumbnail SCF 的内容 [创建 credential.py][create-credential-py],内容请参考: ```python /// <example verb="create" file="/data/thumbnail/credential.py" /> # -*- coding: utf-8 -*- # 此处的 API 信息请替换为您的信息,可到 https://console.cloud.tencent.com/capi 获取 appid = 1250000000 # 请替换为您的 APPID secret_id = u'YOUR_SECRET_ID' # 请替换为您的 SecretId secret_key = u'YOUR_SECRET_KEY' # 请替换为您的 SecretKey region = u'ap-guangzhou' ``` 注意替换 [credential.py][edit-credential-py] 中的 API 凭据为您的 API 凭据,可[到控制台查看](https://console.cloud.tencent.com/capi)。 > <edit for="edit-credential-py" file="/data/thumbnail/credential.py" /> [创建 thumbnail.py][create-thumbnail-py],内容如下: ```python /// <example verb="create" file="/data/thumbnail/thumbnail.py" /> # -*- coding: utf-8 -*- import uuid import json import os import logging from PIL import Image import PIL.Image import credential import commands import datetime from qcloud_cos import CosConfig from qcloud_cos import CosS3Client from qcloud_cos import CosServiceError from qcloud_cos import CosClientError import sys import logging print('Loading function') logging.basicConfig(level=logging.INFO, stream=sys.stdout) appid = credential.appid secret_id = credential.secret_id secret_key = credential.secret_key region = credential.region token = '' config = CosConfig(Secret_id=secret_id, Secret_key=secret_key, Region=region, Token=token) client = CosS3Client(config) logger = logging.getLogger() def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def delete_local_file(src): logger.info("delete files and folders") if os.path.isfile(src): try: os.remove(src) except: pass elif os.path.isdir(src): for item in os.listdir(src): itemsrc=os.path.join(src,item) delete_file_folder(itemsrc) try: os.rmdir(src) except: pass def main_handler(event, context): logger.info("start main handler") for record in event['Records']: try: bucket = record['cos']['cosBucket']['name'] + '-' + str(appid) key = record['cos']['cosObject']['key'] key = key.replace('/'+str(appid)+'/'+record['cos']['cosBucket']['name']+'/','',1) download_path = '/tmp/{}'.format(key) upload_path = '/tmp/resized-{}'.format(key) print("Key is " + key) print("Get from [%s] to download file [%s]" %(bucket, key)) # download image from cos try: response = client.get_object(Bucket=bucket,Key=key,) response['Body'].get_stream_to_file(download_path) except CosServiceError as e: print(e.get_error_code()) print(e.get_error_msg()) print(e.get_resource_location()) logger.info("Download file [%s] Success" % key) logger.info("Image compress function start") starttime = datetime.datetime.now() #compress image here resize_image(download_path, upload_path) endtime = datetime.datetime.now() logger.info("compress image take " + str((endtime-starttime).microseconds/1000) + "ms") #upload the compressed image to resized bucket response = client.put_object_from_local_file( Bucket= record['cos']['cosBucket']['name'] + 'resized' + '-' + str(appid), LocalFilePath= upload_path.decode('utf-8'), Key= key.decode('utf-8') ) #delete local file delete_local_file(str(download_path)) delete_local_file(str(upload_path)) return "Success" except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure the object exists and your bucket is in the same region as this function.'.format(key, bucket)) raise e ``` > <locate for="create-credential-py" path="/data/thumbnail" hint="右击创建 credential.py"></locate> > <locate for="create-thumbnail-py" path="/data/thumbnail" hint="右击创建 thumbnail.py"></locate> > <checker type="output-contains" command="ls -la /data/thumbnail" hint="创建 credential.py"> > <keyword regex="credential.py" /> > </checker> > <checker type="output-contains" command="ls -la /data/thumbnail" hint="创建 thumbnail.py"> > <keyword regex="thumbnail.py" /> > </checker> > <checker type="output-contains-no" command="cat /data/thumbnail/credential.py" hint="更新 AppId 为您的 AppId"> > <keyword regex="1250000000" /> > </checker> > <checker type="output-contains-no" command="cat /data/thumbnail/credential.py" hint="更新 SecretId 为您的 SecretId"> > <keyword regex="YOUR_SECRET_ID" /> > </checker> > <checker type="output-contains-no" command="cat /data/thumbnail/credential.py" hint="更新 SecretKey 为您的 SecretKey"> > <keyword regex="YOUR_SECRET_KEY" /> > </checker> > <checker type="output-contains" command="cat /data/thumbnail/thumbnail.py" hint="在 thumbnail.py 实现 main_handler 方法"> > <keyword regex="main_handler" /> > </checker> 完成后,可进入下一步。 ### 准备 Thumbnail SCF 部署环境 创建并使用一个虚拟环境: ```sh virtualenv ~/shrink_venv source ~/shrink_venv/bin/activate ``` 在虚拟环境下安装 Pillow 和 COS SDK: ```sh pip install Pillow pip install -U cos-python-sdk-v5 ``` > <checker type="output-contains" command="ls -la /root" hint="创建并使用虚拟环境 shrink_venv"> > <keyword regex="shrink_venv" /> > </checker> > <checker type="output-contains" command="ls -la /root/shrink_venv/lib/python2.7/site-packages" hint="在虚拟环境安装 Pillow"> > <keyword regex="Pillow" /> > </checker> > <checker type="output-contains" command="ls -la /root/shrink_venv/lib/python2.7/site-packages" hint="在虚拟环境安装 COS SDK"> > <keyword regex="cos_python_sdk_v5" /> > </checker> 完成后,进入下一步。 ### 准备 Thumbnail SCF 部署包 把虚拟环境中的 lib 和 lib64 相关内容添加到压缩包: ```sh cd $VIRTUAL_ENV/lib/python2.7/site-packages zip -r /data/thumbnail.zip cos_python_sdk* zip -r /data/thumbnail.zip qcloud_cos zip -r /data/thumbnail.zip PIL zip -r /data/thumbnail.zip Pillow* zip -r /data/thumbnail.zip dicttoxml* ``` 把 Thumbnail SCF 源码添加到压缩包: ```sh cd /data/thumbnail zip -r /data/thumbnail.zip * ``` > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 cos_python_sdk,请确认已经正确添加文件"> > <keyword regex="cos_python_sdk" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 qcloud_cos,请确认已经正确添加文件"> > <keyword regex="qcloud_cos" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 PIL,请确认已经正确添加文件"> > <keyword regex="PIL" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 Pillow,请确认已经正确添加文件"> > <keyword regex="Pillow" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 dicttoxml,请确认已经正确添加文件"> > <keyword regex="dicttoxml" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 thumbnail.py,请确认已经正确添加文件"> > <keyword regex="thumbnail.py" /> > </checker> > <checker type="output-contains" command="unzip -l /data/thumbnail.zip" hint="压缩包未包含 credential.py,请确认已经正确添加文件"> > <keyword regex="credential.py" /> > </checker> ### 部署 Thumbnail SCF <!--跟上面一样,我们使用 CreateFunction API 来创建并部署一个 SCF: ```sh tccli scf CreateFunction \\ --functionName "thumbnail" \\ --code "@$(base64 /data/thumbnail.zip)" \\ --handler "thumbnail.main_handler" \\ --description "Cos thumbnail generator" ​```--> 本步骤可参考: * [视频 - 在控制台部署 SCF][deploy-scf-in-console] > <video for="deploy-scf-in-console" platform="qq" vid="z0528q2g8gb" name="视频 - 在控制台部署 SCF"></video> 由于 Thumbnail SCF 的部署包太大,无法使用命令行部署。我们把准备好的部署包下载到本地通过控制台进行部署。 * 在 [thumbnail.zip][save-deploy-zip] 上右击,点击保存到本地。 * 打开 [SCF 控制台](https://console.cloud.tencent.com/scf) * 点击 `新建`,创建一个 SCF * 函数名填写 `thumbnail`,点击 `下一步` * 代码输入种类选择 `本地上传 zip 包` * 执行方法填写为 `thumbnail.main_handler` * 函数代码包选择刚才保存到本地的 `thumbnail.zip`,点击 `下一步` * 触发器先不配置,点击 `完成` > <locate for="save-deploy-zip" path="/data/thumbnail.zip" hint="右击,保存到本地"></locate> > <checker type="output-contains" command="tccli scf GetFunction --functionName=thumbnail" hint="部署 thumbnail.zip 到 SCF"> > <keyword regex="main_handler" /> > </checker> 部署完成后,请点击下一步。 ### 测试 Thumbnail SCF 本步骤可参考: * [视频 - 测试 SCF][test-scf-in-console] > <video for="test-scf-in-console" platform="qq" vid="z0528agf481" name="视频 - 在控制台部署 SCF"></video> 进入 [COS 控制台](https://console.cloud.tencent.com/cos4/bucket),打开之前创建的 `img` bucket,上传一张本地的照片到根目录,如 `photo.png`。 进入 [SCF 控制台](https://console.cloud.tencent.com/scf),打开 `thumbnail` 函数,点击右上角的测试按钮。 选择 COS 事件模板进行修改。注意要改动的部分是 `cosBucket` 和 `cosObject`,包括: * cosBucket.name 需要修改为上面创建的 `img` * cosBucket.appid 需要修改为您的 AppId [:question][query-appid] * cosObject.key 需要修改为您上传的图片的名称(如上面的 `/photo.png`) > <bubble for="query-appid"> > AppId 可[在控制台查询](https://console.cloud.tencent.com/capi) > </bubble> 修改完成后,点击 `测试` 查看函数运行日志。 进入 [COS 控制台](https://console.cloud.tencent.com/cos4/bucket),打开之前创建的 `imgresized` bucket,查看缩略图是否已经生成。 ### 配置 Thumbnail SCF 触发器 本步骤可参考: * [视频 - 添加 COS 触发器][add-cos-trigger] > <video for="add-cos-trigger" platform="qq" vid="i0528ejlu2l" name="视频 - 添加 COS 触发器"></video> 进入 [SCF 控制台](https://console.cloud.tencent.com/scf),打开 `thumbnail` 函数,点击 `触发方式` 选项卡。 * 点击 `添加触发方式` * 选择 `COS 触发` * COS Bucket 选择 `img` * 事件类型选择 `全部创建` * 点击保存 完成后,进入 [COS 控制台](https://console.cloud.tencent.com/cos4),再上传一张图片到 `img` bucket,观察 SCF 是否自动运行,并在 `imgresized` bucekt 观察是否已经生成了缩略图。 > <checker type="output-contains" command="tccli scf GetFunction --functionName=thumbnail" hint="为 SCF 设置 COS 触发器"> > <keyword regex="triggerDesc.+ObjectCreated" /> > </checker> ## 完成 > <time>5min</time> ### 更多资料 恭喜,您已经完成了跟 SCF 的美妙旅程。参考下面的资料可以了解更多关于本实验涉及到的云产品: * [SCF 产品文档](https://cloud.tencent.com/document/product/583) * [COS 产品文档](https://cloud.tencent.com/document/product/436) * [云 API](https://cloud.tencent.com/document/api) 及[命令行工具](https://cloud.tencent.com/document/product/440/6176) ```