From 7a1e2e3b93a1e91ab66d695eaca6b3d6aa6947c7 Mon Sep 17 00:00:00 2001 From: yugasun Date: Tue, 22 Jun 2021 15:38:55 +0800 Subject: [PATCH 1/3] fix: image config parameter --- docs/configure.md | 30 ++-- example/README.md | 131 ------------------ example/{event-scf => event}/serverless.yml | 0 example/{event-scf => event}/src/index.js | 0 .../.env.example | 4 + .../Dockerfile | 0 .../README.md | 10 +- .../{image-event-scf => image-event}/build.sh | 0 .../serverless.yml | 7 +- .../src/index.js | 0 .../src/package.json | 0 example/{image-scf => image}/.env.example | 3 + example/{image-scf => image}/Dockerfile | 0 example/{image-scf => image}/README.md | 17 ++- example/{image-scf => image}/build.sh | 0 example/{image-scf => image}/serverless.yml | 6 +- example/{http-scf => image}/src/index.js | 0 .../src/package.json | 0 example/{http-scf => web}/serverless.yml | 3 - example/{image-scf => web}/src/index.js | 0 example/{image-scf => web}/src/package.json | 0 example/{http-scf => web}/src/scf_bootstrap | 0 serverless.component.yml | 2 +- src/utils.js | 27 +--- 24 files changed, 62 insertions(+), 178 deletions(-) delete mode 100644 example/README.md rename example/{event-scf => event}/serverless.yml (100%) rename example/{event-scf => event}/src/index.js (100%) rename example/{image-event-scf => image-event}/.env.example (73%) rename example/{image-event-scf => image-event}/Dockerfile (100%) rename example/{image-event-scf => image-event}/README.md (69%) rename example/{image-event-scf => image-event}/build.sh (100%) rename example/{image-event-scf => image-event}/serverless.yml (68%) rename example/{image-event-scf => image-event}/src/index.js (100%) rename example/{http-scf => image-event}/src/package.json (100%) rename example/{image-scf => image}/.env.example (73%) rename example/{image-scf => image}/Dockerfile (100%) rename example/{image-scf => image}/README.md (57%) rename example/{image-scf => image}/build.sh (100%) rename example/{image-scf => image}/serverless.yml (71%) rename example/{http-scf => image}/src/index.js (100%) rename example/{image-event-scf => image}/src/package.json (100%) rename example/{http-scf => web}/serverless.yml (80%) rename example/{image-scf => web}/src/index.js (100%) rename example/{image-scf => web}/src/package.json (100%) rename example/{http-scf => web}/src/scf_bootstrap (100%) diff --git a/docs/configure.md b/docs/configure.md index 062e363..e14db29 100644 --- a/docs/configure.md +++ b/docs/configure.md @@ -72,10 +72,9 @@ inputs: key2: value2 # tags 的key value ignoreTriggers: false # 是否忽略触发器部署 image: # 镜像配置 - registryName: serverless # 容器镜像服务名称,企业版必须 - namespace: scf_images # 命名空间 - repositoryName: nodejs_server # 镜像名称 - tagName: latest # 镜像版本 + registryId: tcr-xxx # 容器镜像服务名称,企业版必须 + imageType: personal # 镜像类型:personal - 个人,enterprise - 企业版,public - 镜像模板 + imageUri: ccr.ccs.tencentyun.com/sls-scf/nodejs_test:latest@sha256:xxx command: node index.js # 容器启动命名 args: test # 容器启动参数 events: # 触发器 @@ -500,14 +499,21 @@ value: 镜像相关配置: -| 参数名称 | 必选 | 类型 | 默认值 | 描述 | -| -------------- | ---- | ------ | -------- | :----------------------------------------------------- | -| registryName | 否 | string | | [容器镜像服务][tcr]名称,使用企业版镜像时必须 | -| namespace | 是 | string | | 命名空间 | -| repositoryName | 是 | string | | 镜像名称 | -| tagName | 否 | string | `latest` | 镜像版本 | -| command | 否 | string | | 容器启动命令,默认使用镜像中的 `Entrypoint` 或者 `CMD` | -| args | 否 | string | | 容器启动参数,默认使用惊醒中的 `CMD` | +| 参数名称 | 必选 | 类型 | 默认值 | 描述 | +| ---------- | ---- | ------ | ---------- | :----------------------------------------------------- | +| imageUri | 是 | string | | 镜像版本 URL | +| registryId | 否 | string | | [容器镜像服务][tcr] 实例 ID,使用企业版镜像时必须 | +| imageType | 否 | string | `personal` | 镜像类型,支持:personal、enterprise、public | +| command | 否 | string | | 容器启动命令,默认使用镜像中的 `Entrypoint` 或者 `CMD` | +| args | 否 | string | | 容器启动参数,默认使用惊醒中的 `CMD` | + +注意: + +`imageUri` 拼接格式为 `<仓库地址>:<镜像版本>@<镜像ID(sha256)>`,如下: + +```text +ccr.ccs.tencentyun.com/sls-scf/nodejs_test:latest@sha256:xxx +``` diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 08bd84d..0000000 --- a/example/README.md +++ /dev/null @@ -1,131 +0,0 @@ -[![Serverless Components](https://img.serverlesscloud.cn/202047/1586246008932-Tencent%20SCF_%E9%95%BF.png)](http://serverless.com) - -
- -## 组件概述 - -**腾讯云 SCF 云函数组件**通过使用 [Tencent Serverless Framework](https://github.com/serverless/components/tree/cloud),基于云上 Serverless 服务(云函数及触发器等),实现“0”配置,便捷开发,极速部署您的第一个云函数,该组件支持丰富的配置扩展,提供了目前最易用、低成本并且弹性伸缩的云函数的开发、配置及部署能力。 - -## 快速入门 - -### 前提条件 - -- 已安装 Serverless Framework(参考 [安装 Serverless Framework](https://cloud.tencent.com/document/product/1154/42990)) -- 账号开通 Serverless 相关权限(参考 [账号和权限配置](https://cloud.tencent.com/document/product/1154/43006)) - -### 操作步骤 - -#### 创建 - -- 方式一:按照 [快速部署](https://cloud.tencent.com/document/product/1154/41775) 操作,选择 SCF 项目模板进行创建。 -- 方式二:直接使用 `sls init` 命令创建。快速创建一个 nodejs 的 SCF 示例: - -``` -sls init scf-demo -``` - -> **说明**:命令中的 `scf-demo` 可以更换成其他语言模板。目前 SCF 组件支持的模板有:go1-helloworld 、nodejs1015-helloworld、php72-helloworld、python36-helloworld。 - -#### 部署 - -执行以下命令,将会弹出二维码,直接扫码授权进行部署: - -``` -sls deploy -``` - -> **说明**:如果鉴权失败,请参考 [权限配置](https://cloud.tencent.com/document/product/1154/43006) 进行授权。 - -#### 查看 - -执行以下命令,查看您部署的项目信息: - -``` -sls info -``` - -#### 移除 - -执行以下命令,移除您已经部署的项目: - -``` -sls remove -``` - -## 进阶指导 - -### serverless.yml - -执行 `sls deploy` 时,根据 serverless.yml 文件中的配置对云函数资源进行创建或更新。一份简单的 serverlesss.yml 文件如下: - -> **说明**:配置详情请参考 [全量配置文档](https://github.com/serverless-components/tencent-scf/blob/master/docs/configure.md)。 - -``` -#scf组件配置样例 -#全量配置参考https://github.com/serverless-components/tencent-scf/blob/master/docs/configure.md - -#组件信息 -component: scf # (必填) 引用 component 的名称,当前用到的是 tencent-scf 组件 -name: scfdemo # (必填) 创建的实例名称,请修改成您的实例名称 - -#组件参数 -inputs: - name: ${name}-${stage}-${app} #函数名称 - src: ./ #代码路径 - handler: index.main_handler #入口 - runtime: Nodejs10.15 # 云函数运行时的环境 - region: ap-guangzhou # 云函数所在区域 - events: # 触发器 - - apigw: # 网关触发器 - parameters: - endpoints: - - path: / - method: GET -``` - -serverless.yml 文件包含的信息: - -#### 组件信息 - -| 组件名 | 是否必选 | 说明 | -| --------- | -------- | ---------------------------------------------------------- | -| component | 必填 | component 的名称,使用`sls registry`查询您可以引入的组件。 | -| name | 必填 | 创建的实例名称,每个组件在部署时将创建一个实例。 | - -#### 参数信息 - -inputs 下的参数为组件配置参数。一个最简单 SCF 组件参数配置由以下几部分: - -| 参数名 | 说明 | -| ------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| name | 云函数名称。由于云函数又是资源 ID,为了保证资源的唯一性,建议采用 `${name}-${stage}-${app}` 变量方式。 | -| src | 代码路径。 | -| handler | 函数处理方法名称 。 | -| runtime | 云函数运行环境,目前支持: Python2.7、Python3.6、Nodejs6.10、Nodejs8.9、Nodejs10.15、Nodejs12.16、PHP5、PHP7、Go1、Java8 和 CustomRuntime。 | -| region | 云函数所在的区域。 | -| events | 触发器。 支持的触发器为:timer、apigw、cos、cmq、ckafka 。 | - -### 账号权限 - -部署实例时需要账号授权去操作具体的云资源,目前可以通过两种方式进行授权:**扫码授权**和**密钥授权**。 - -- **扫码授权**:能快速进行授权部署,但生成的凭证是临时凭证,过期后需要重新扫码。 -- **密钥授权**:能够获得永久授权,需要预先配置账号的 SecretId 和 SecretKey 。 - -配置详情可参考 [权限配置](https://cloud.tencent.com/document/product/1154/43006)。 - -### 开发调试 - -在 `serverless.yml`文件所在的目录下运行 `sls dev` 可以实时输出云端日志,每次部署完毕后,对项目进行访问,即可在命令行中实时输出调用日志,便于查看业务情况和排障。nodejs 支持开启开发调试能力,将会对本地代码的改动进行检测和自动上传。详情请参考 [开发与调试](https://cloud.tencent.com/document/product/1154/43220)。 - -### 应用管理 - -Serverless 部署一个组件实例实质是部署了一个单组件实例的应用。 - -在应用项目开发过程中,一个应用下可能会存在多个组件实例,如何管理组件实例进行应用项目开发,请参考 [应用管理](https://cloud.tencent.com/document/product/1154/48261)。 - -## License - -MIT License - -Copyright (c) 2020 Tencent Cloud, Inc. diff --git a/example/event-scf/serverless.yml b/example/event/serverless.yml similarity index 100% rename from example/event-scf/serverless.yml rename to example/event/serverless.yml diff --git a/example/event-scf/src/index.js b/example/event/src/index.js similarity index 100% rename from example/event-scf/src/index.js rename to example/event/src/index.js diff --git a/example/image-event-scf/.env.example b/example/image-event/.env.example similarity index 73% rename from example/image-event-scf/.env.example rename to example/image-event/.env.example index 8800fe0..aa3ca6a 100644 --- a/example/image-event-scf/.env.example +++ b/example/image-event/.env.example @@ -12,3 +12,7 @@ tag_name="latest" # 镜像登录密码 password="xxx" + +# 镜像版本 URL +image_uri=ccr.ccs.tencentyun.com/sls-scf/nodejs_test:latest@sha256:xxx + diff --git a/example/image-event-scf/Dockerfile b/example/image-event/Dockerfile similarity index 100% rename from example/image-event-scf/Dockerfile rename to example/image-event/Dockerfile diff --git a/example/image-event-scf/README.md b/example/image-event/README.md similarity index 69% rename from example/image-event-scf/README.md rename to example/image-event/README.md index 0d0e445..02d01bd 100644 --- a/example/image-event-scf/README.md +++ b/example/image-event/README.md @@ -2,12 +2,16 @@ 在部署前,需要先构建镜像,并推送到云端镜像仓库。 -首先,复制 `account.example.conf` 为 `account.conf`,并修改其中配置为开发者账号: +## 构建镜像 + +首先,复制 `.env.example` 为 `.env`,并修改其中配置为开发者账号: ```bash # 主账号 UIN UIN=123455555 +# 实例 ID,企业版需要 +registry_id="tcr-xxx" # 实例名称,企业版需要 registry_name="serverless" @@ -35,6 +39,10 @@ $ ./build.sh $ ./build.sh enterprise ``` +## 部署函数 + +镜像发布后,将需要的 `image_uri` 添加到 `.env` 文件中 + 然后执行 Serverless 部署: ``` diff --git a/example/image-event-scf/build.sh b/example/image-event/build.sh similarity index 100% rename from example/image-event-scf/build.sh rename to example/image-event/build.sh diff --git a/example/image-event-scf/serverless.yml b/example/image-event/serverless.yml similarity index 68% rename from example/image-event-scf/serverless.yml rename to example/image-event/serverless.yml index dda99c4..0db85fa 100644 --- a/example/image-event-scf/serverless.yml +++ b/example/image-event/serverless.yml @@ -5,10 +5,9 @@ inputs: name: event-function-image region: ap-chengdu image: - registryName: ${env:registry_name} - namespace: ${env:namespace} - repositoryName: ${env:image_name} - tagName: ${env:tag_name} + imageType: enterprise + registryId: ${env:registry_id} + imageUri: ${env:image_uri} events: - apigw: parameters: diff --git a/example/image-event-scf/src/index.js b/example/image-event/src/index.js similarity index 100% rename from example/image-event-scf/src/index.js rename to example/image-event/src/index.js diff --git a/example/http-scf/src/package.json b/example/image-event/src/package.json similarity index 100% rename from example/http-scf/src/package.json rename to example/image-event/src/package.json diff --git a/example/image-scf/.env.example b/example/image/.env.example similarity index 73% rename from example/image-scf/.env.example rename to example/image/.env.example index 8800fe0..82b7c3e 100644 --- a/example/image-scf/.env.example +++ b/example/image/.env.example @@ -12,3 +12,6 @@ tag_name="latest" # 镜像登录密码 password="xxx" + +# 镜像版本 URL +image_uri=ccr.ccs.tencentyun.com/sls-scf/nodejs_test:latest@sha256:xxx diff --git a/example/image-scf/Dockerfile b/example/image/Dockerfile similarity index 100% rename from example/image-scf/Dockerfile rename to example/image/Dockerfile diff --git a/example/image-scf/README.md b/example/image/README.md similarity index 57% rename from example/image-scf/README.md rename to example/image/README.md index 6d7ed8b..02d01bd 100644 --- a/example/image-scf/README.md +++ b/example/image/README.md @@ -2,16 +2,25 @@ 在部署前,需要先构建镜像,并推送到云端镜像仓库。 -首先,复制 `account.example.conf` 为 `account.conf`,并修改其中配置为开发者账号: +## 构建镜像 + +首先,复制 `.env.example` 为 `.env`,并修改其中配置为开发者账号: ```bash +# 主账号 UIN +UIN=123455555 + +# 实例 ID,企业版需要 +registry_id="tcr-xxx" # 实例名称,企业版需要 registry_name="serverless" # 命名空间 namespace="sls-scf" # 镜像名称 -image_name="nodejs_test" +image_name="nodejs_test_event" +# 镜像版本 +tag_name="latest" # 镜像登录密码 password="xxx" @@ -30,6 +39,10 @@ $ ./build.sh $ ./build.sh enterprise ``` +## 部署函数 + +镜像发布后,将需要的 `image_uri` 添加到 `.env` 文件中 + 然后执行 Serverless 部署: ``` diff --git a/example/image-scf/build.sh b/example/image/build.sh similarity index 100% rename from example/image-scf/build.sh rename to example/image/build.sh diff --git a/example/image-scf/serverless.yml b/example/image/serverless.yml similarity index 71% rename from example/image-scf/serverless.yml rename to example/image/serverless.yml index e8ea650..94802da 100644 --- a/example/image-scf/serverless.yml +++ b/example/image/serverless.yml @@ -7,10 +7,8 @@ inputs: # 指定 SCF 类型为 Web 类型 type: web image: - # registryName: ${env:registry_name} # 企业版必须 - namespace: ${env:namespace} - repositoryName: ${env:image_name} - tagName: ${env:tag_name} + imageType: personal + imageUri: ${env:image_uri} events: - apigw: parameters: diff --git a/example/http-scf/src/index.js b/example/image/src/index.js similarity index 100% rename from example/http-scf/src/index.js rename to example/image/src/index.js diff --git a/example/image-event-scf/src/package.json b/example/image/src/package.json similarity index 100% rename from example/image-event-scf/src/package.json rename to example/image/src/package.json diff --git a/example/http-scf/serverless.yml b/example/web/serverless.yml similarity index 80% rename from example/http-scf/serverless.yml rename to example/web/serverless.yml index ca0af71..6c4ac9a 100644 --- a/example/http-scf/serverless.yml +++ b/example/web/serverless.yml @@ -22,6 +22,3 @@ inputs: endpoints: - path: / method: ANY - function: - # 指定 API 类型为 Web 类型 - type: web diff --git a/example/image-scf/src/index.js b/example/web/src/index.js similarity index 100% rename from example/image-scf/src/index.js rename to example/web/src/index.js diff --git a/example/image-scf/src/package.json b/example/web/src/package.json similarity index 100% rename from example/image-scf/src/package.json rename to example/web/src/package.json diff --git a/example/http-scf/src/scf_bootstrap b/example/web/src/scf_bootstrap similarity index 100% rename from example/http-scf/src/scf_bootstrap rename to example/web/src/scf_bootstrap diff --git a/serverless.component.yml b/serverless.component.yml index 17ed688..62db912 100644 --- a/serverless.component.yml +++ b/serverless.component.yml @@ -1,5 +1,5 @@ name: scf -version: 0.7.1 +version: 0.7.2 author: Tencent Cloud, Inc. org: Tencent Cloud, Inc. description: Deploy a serverless cloud function on Tencent Cloud. diff --git a/src/utils.js b/src/utils.js index 3bd97a4..485ac7b 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,5 +1,5 @@ const download = require('download') -const { Cos, Tcr } = require('tencent-component-toolkit') +const { Cos } = require('tencent-component-toolkit') const { ApiTypeError } = require('tencent-component-toolkit/lib/utils/error') const CONFIGS = require('./config') @@ -165,32 +165,19 @@ const formatInputs = async (instance, credentials, appId, inputs) => { let imageCode if (inputs.image) { const imageConfig = inputs.image - const region = inputs.region || CONFIGS.region - const tcr = new Tcr(credentials, region) // 企业版需要配置 registryName (实例名称) - if (imageConfig.registryName) { - const imageInfo = await tcr.getImageInfoByName({ - registryName: imageConfig.registryName, - namespace: imageConfig.namespace, - repositoryName: imageConfig.repositoryName, - tagName: imageConfig.tagName || 'latest' - }) + if (imageConfig.registryId) { imageCode = { - imageType: imageInfo.imageType, - imageUri: imageInfo.imageUri, - registryId: imageInfo.registryId, + imageType: 'enterprise', + imageUri: imageConfig.imageUri, + registryId: imageConfig.registryId, command: imageConfig.command, args: imageConfig.args } } else { - const imageInfo = await tcr.getPersonalImageInfo({ - namespace: imageConfig.namespace, - repositoryName: imageConfig.repositoryName, - tagName: imageConfig.tagName || 'latest' - }) imageCode = { - imageType: imageInfo.imageType, - imageUri: imageInfo.imageUri, + imageType: imageConfig.imageType || 'personal', + imageUri: imageConfig.imageUri, command: imageConfig.command, args: imageConfig.args } From b45b401e97e768d42c319584f78989a3b468a72b Mon Sep 17 00:00:00 2001 From: yugasun Date: Tue, 22 Jun 2021 16:03:55 +0800 Subject: [PATCH 2/3] fix: change imageUri to imageUrl --- docs/configure.md | 4 ++-- example/image-event/serverless.yml | 4 ++-- example/image/serverless.yml | 2 +- src/utils.js | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/configure.md b/docs/configure.md index e14db29..0c4862d 100644 --- a/docs/configure.md +++ b/docs/configure.md @@ -501,7 +501,7 @@ value: | 参数名称 | 必选 | 类型 | 默认值 | 描述 | | ---------- | ---- | ------ | ---------- | :----------------------------------------------------- | -| imageUri | 是 | string | | 镜像版本 URL | +| imageUrl | 是 | string | | 镜像版本 URL | | registryId | 否 | string | | [容器镜像服务][tcr] 实例 ID,使用企业版镜像时必须 | | imageType | 否 | string | `personal` | 镜像类型,支持:personal、enterprise、public | | command | 否 | string | | 容器启动命令,默认使用镜像中的 `Entrypoint` 或者 `CMD` | @@ -509,7 +509,7 @@ value: 注意: -`imageUri` 拼接格式为 `<仓库地址>:<镜像版本>@<镜像ID(sha256)>`,如下: +`imageUrl` 拼接格式为 `<仓库地址>:<镜像版本>@<镜像ID(sha256)>`,如下: ```text ccr.ccs.tencentyun.com/sls-scf/nodejs_test:latest@sha256:xxx diff --git a/example/image-event/serverless.yml b/example/image-event/serverless.yml index 0db85fa..5f5769e 100644 --- a/example/image-event/serverless.yml +++ b/example/image-event/serverless.yml @@ -6,8 +6,8 @@ inputs: region: ap-chengdu image: imageType: enterprise - registryId: ${env:registry_id} - imageUri: ${env:image_uri} + registryId: ${env:registry_id} # 请修改为指定容器镜像服务实例 ID + imageUrl: ${env:image_url} # 请修改为指定镜像版本 URL events: - apigw: parameters: diff --git a/example/image/serverless.yml b/example/image/serverless.yml index 94802da..4195979 100644 --- a/example/image/serverless.yml +++ b/example/image/serverless.yml @@ -8,7 +8,7 @@ inputs: type: web image: imageType: personal - imageUri: ${env:image_uri} + imageUrl: ${env:image_url} # 请修改为指定镜像版本 URL events: - apigw: parameters: diff --git a/src/utils.js b/src/utils.js index 485ac7b..915faf6 100644 --- a/src/utils.js +++ b/src/utils.js @@ -169,7 +169,8 @@ const formatInputs = async (instance, credentials, appId, inputs) => { if (imageConfig.registryId) { imageCode = { imageType: 'enterprise', - imageUri: imageConfig.imageUri, + // yaml 配置使用 imageUrl 方便理解 + imageUri: imageConfig.imageUrl, registryId: imageConfig.registryId, command: imageConfig.command, args: imageConfig.args @@ -177,7 +178,7 @@ const formatInputs = async (instance, credentials, appId, inputs) => { } else { imageCode = { imageType: imageConfig.imageType || 'personal', - imageUri: imageConfig.imageUri, + imageUri: imageConfig.imageUrl, command: imageConfig.command, args: imageConfig.args } From 07c9abdeb68f8f4dad990a64ef6ba0fec5b7eb89 Mon Sep 17 00:00:00 2001 From: yugasun Date: Tue, 22 Jun 2021 16:59:00 +0800 Subject: [PATCH 3/3] chore: fix test --- __tests__/index.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/index.test.js b/__tests__/index.test.js index 7496d81..d4464c0 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -38,7 +38,7 @@ describe('Scf', () => { } ] - const codeSrc = path.join(__dirname, '../example/event-scf/src') + const codeSrc = path.join(__dirname, '../example/event/src') const inputs = { name: `scf-integration-tests-${generateId()}`, src: {