{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2021-01-07-serverless-mysql","result":{"data":{"currentBlog":{"id":"664a969f-5a20-526c-b0a5-64e95ce6f15d","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/9210c0ec6a7f9bdd76f9e0da399df425.jpg","authors":["April"],"categories":["best-practice"],"date":"2021-01-07T00:00:00.000Z","title":"国内首款 Serverless MySQL 数据库重磅发布！","description":"腾讯云 Serverless 生态中 MySQL 数据库版块补齐，试用期间免费！","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","数据库"],"keywords":null,"outdated":null},"wordCount":{"words":288,"sentences":49,"paragraphs":49},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-07-serverless-mysql.md","fields":{"slug":"/best-practice/2021-01-07-serverless-mysql/","keywords":["serverless","函数计算","函数计算服务","云函数","云原生","Serverless","mysql","serverless","数据库","vpc","yml"]},"html":"<p>12 月 20 日的 Techo 大会上，腾讯云重磅发布了自研云原生数据库 <strong>TDSQL-C Serverless</strong>（原 CynosDB Serverless），这是国内首款计算和存储全 Serverless 架构的<strong>云原生 MySQL</strong>， TDSQL-C Serverless能够让企业用户像使用水、电、煤一样使用云数据库，用户不需为数据库的闲时进行付费，而是按照数据库资源响应单元实际使用量进行计费，将腾讯云云原生技术普惠用户。</p>\n<p>作为 Serverless 生态中的重要一环，TDSQL-C Serverless 的发布也补齐了 Serverless 架构里 MySQL 数据库的空缺。因此，Serverless Framework 同步发布了 TDSQL-C Serverless 组件。这样，腾讯云就拥有了一套Serverless 全栈的核心解决方案，包括 Serverless API网关、腾讯云的 Serverless 函数计算服务、Serverless 对象存储和数据库。在数据存储层可以通过 TDSQL-C Serverless 直接对数据库连接并进行 SQL 操作。</p>\n<p><strong>TDSQL-C Serverless</strong>（MySQL 数据库），具备完全自动化的扩容能力，能够随着用户业务的请求数的增加和减少，智能化“膨胀”和“缩小”，实现资源的自动“吞吐”。从此以后，开发者可以真正的完成 Serverless 应用的开发，专注于业务本身，免除运维，按需付费，享受 Serverless 架构带来的众多优势。</p>\n<p>另外，<strong>TDSQL-C Serverless</strong> 数据库在试用期间完全免费。</p>\n<h2 id=\"服务特性\"><a href=\"#%E6%9C%8D%E5%8A%A1%E7%89%B9%E6%80%A7\" aria-label=\"服务特性 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>服务特性</h2>\n<ul>\n<li><strong>自动驾驶（Autopilot）：</strong> </li>\n</ul>\n<p>数据库根据业务负载自动启动停止，无感扩缩容，扩缩容过程不会断开连接。</p>\n<ul>\n<li><strong>按使用计费（Utility Pricing）：</strong> </li>\n</ul>\n<p>按实际使用的计算和存储量计费，不用不付费，按秒计量，按小时结算。</p>\n<h2 id=\"适用场景\"><a href=\"#%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF\" aria-label=\"适用场景 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>适用场景</h2>\n<ul>\n<li>开发、测试环境等低频数据库使用场景。</li>\n<li>物联网（IoT）、边缘计算等不确定负载场景。</li>\n<li>中小企业建站等 SaaS 应用场景。</li>\n</ul>\n<p>下面的教程将以 Node.js 开发语言的函数，指导您如何快速创建 TDSQL-C Serverless MySQL 实例，并在云函数中进行调用：</p>\n<h2 id=\"操作步骤\"><a href=\"#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4\" aria-label=\"操作步骤 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>操作步骤</h2>\n<ol>\n<li><strong>配置环境变量</strong> </li>\n<li><strong>配置私有网络：</strong> 通过 Serverless Framework VPC 组件 创建 VPC 和 子网，支持云函数和数据库的网络打通和使用。</li>\n<li><strong>配置 Serverless DB：</strong> 通过 Serverless Framework Cynosdb 组件 创建 MySQL 实例，为云函数项目提供数据库服务。</li>\n<li><strong>编写业务代码：</strong> 通过 Serverless DB SDK 调用数据库，云函数支持直接调用 Serverless DB SDK，连接 PostgreSQL 数据库进行管理操作。</li>\n<li><strong>部署应用：</strong> 通过 Serverless Framework 部署项目至云端，并通过云函数控制台进行测试。</li>\n<li><strong>移除项目：</strong> 可通过 Serverless Framework 移除项目。</li>\n</ol>\n<h3 id=\"1-配置环境变量\"><a href=\"#1-%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F\" aria-label=\"1 配置环境变量 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 配置环境变量</h3>\n<p>在本地建立目录，用于存放代码及依赖模块。本文以  <code class=\"language-text\">test-MySQL</code> 文件夹为例。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">mkdir test-MySQL &amp;&amp; cd test-MySQL</code></pre></div>\n<p>由于目前 TDSQL-C Serverless 只支持 <code class=\"language-text\">ap-beijing-3</code>，<code class=\"language-text\">ap-guangzhou-4</code>，<code class=\"language-text\">ap-shanghai-2</code> 和 <code class=\"language-text\">ap-nanjing-1</code> 四个区域，所以这里还需要配置下，只需要在项目根目录下创建 <code class=\"language-text\">.env</code> 文件，然后配置 <code class=\"language-text\">REGION</code> 和 <code class=\"language-text\">ZONE</code> 两个环境变量：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"22059107449242997000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# .env\nREGION=xxx  \nZONE=xxx `, `22059107449242997000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># .env\nREGION=xxx  \nZONE=xxx </code></pre></div>\n<h3 id=\"2-配置私有网络\"><a href=\"#2-%E9%85%8D%E7%BD%AE%E7%A7%81%E6%9C%89%E7%BD%91%E7%BB%9C\" aria-label=\"2 配置私有网络 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 配置私有网络</h3>\n<p>在 <code class=\"language-text\">test-MySQL</code> 目录下创建文件夹 <code class=\"language-text\">VPC</code>。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">mkdir VPC &amp;&amp; cd VPC</code></pre></div>\n<p>同时在 <code class=\"language-text\">VPC</code> 中新建 serverless.yml 文件，使用 <a href=\"https://github.com/serverless-components/tencent-vpc\">VPC 组件</a>完成私有网络和子网的创建。</p>\n<p><code class=\"language-text\">serverless.yml</code> 示例内容如下，全量配置参考<a href=\"https://github.com/serverless-components/tencent-vpc/blob/master/docs/configure.md\">产品文档</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"32321444872153430000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`#serverless.yml\norg: mysql-app\napp: mysql-app\nstage: dev\ncomponent: vpc # (required) name of the component. In that case, it's vpc.\nname: mysql-app-vpc # (required) name of your vpc component instance.\ninputs:\n  region: \\${env:REGION}\n  zone: \\${env:ZONE}\n  vpcName: serverless-mysql\n  subnetName: serverless-mysql`, `32321444872153430000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token comment\">#serverless.yml</span>\n<span class=\"token key atrule\">org</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> dev\n<span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> vpc <span class=\"token comment\"># (required) name of the component. In that case, it's vpc.</span>\n<span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>vpc <span class=\"token comment\"># (required) name of your vpc component instance.</span>\n<span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>env<span class=\"token punctuation\">:</span>REGION<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">zone</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>env<span class=\"token punctuation\">:</span>ZONE<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">vpcName</span><span class=\"token punctuation\">:</span> serverless<span class=\"token punctuation\">-</span>mysql\n  <span class=\"token key atrule\">subnetName</span><span class=\"token punctuation\">:</span> serverless<span class=\"token punctuation\">-</span>mysql</code></pre></div>\n<h3 id=\"3-配置-serverless-db\"><a href=\"#3-%E9%85%8D%E7%BD%AE-serverless-db\" aria-label=\"3 配置 serverless db permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 配置 Serverless DB</h3>\n<p>在 <code class=\"language-text\">test-MySQL</code> 下创建文件夹 <code class=\"language-text\">DB</code>，并在 <code class=\"language-text\">DB</code> 文件夹下新建 <code class=\"language-text\">serverless.yml</code> 文件，并输入以下内容，通过 Serverless Framework 组件完成云开发环境配置。</p>\n<p><code class=\"language-text\">serverless.yml</code> 示例内容如下，全量配置参考<a href=\"https://github.com/serverless-components/tencent-cynosdb/blob/master/docs/configure.md\">产品文档</a></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"82175270305822790000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# serverless.yml \norg: mysql-app\napp: mysql-app\nstage: dev\ncomponent: cynosdb\nname: mysql-app-db\ninputs:\n  region: \\${env:REGION}\n  zone: \\${env:ZONE}\n  vpcConfig:\n    vpcId: \\${output:\\${stage}:\\${app}:mysql-app-vpc.vpcId}\n    subnetId: \\${output:\\${stage}:\\${app}:mysql-app-vpc.subnetId}`, `82175270305822790000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token comment\"># serverless.yml </span>\n<span class=\"token key atrule\">org</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> dev\n<span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> cynosdb\n<span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>db\n<span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>env<span class=\"token punctuation\">:</span>REGION<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">zone</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>env<span class=\"token punctuation\">:</span>ZONE<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">vpcConfig</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">vpcId</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>vpc.vpcId<span class=\"token punctuation\">}</span>\n    <span class=\"token key atrule\">subnetId</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>vpc.subnetId<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"4-编写业务代码与配置文件\"><a href=\"#4-%E7%BC%96%E5%86%99%E4%B8%9A%E5%8A%A1%E4%BB%A3%E7%A0%81%E4%B8%8E%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6\" aria-label=\"4 编写业务代码与配置文件 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 编写业务代码与配置文件</h3>\n<p>在 <code class=\"language-text\">test-MySQL</code> 下创建文件夹 <code class=\"language-text\">src</code>，用于存放业务逻辑代码和相关依赖项。并在 <code class=\"language-text\">src</code> 文件夹下创建文件 <code class=\"language-text\">index.js</code>，输入如下示例代码。在函数中通过 SDK 连接数据库，并在其中完成 MySQL 数据库的调用。</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"23306599534312400000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`exports.main_handler = async (event, context, callback) => {\n  var mysql      = require('mysql2');\n  var connection = mysql.createConnection({\n    host     : process.env.HOST,\n    user     : 'root',\n    password : process.env.PASSWORD\n  });\n  connection.connect();\n  connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {\n    if (error) throw error;\n    console.log('The solution is: ', results[0].solution);\n  });\n  connection.end();\n }`, `23306599534312400000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">exports<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">main_handler</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">,</span> callback</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> mysql      <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'mysql2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> connection <span class=\"token operator\">=</span> mysql<span class=\"token punctuation\">.</span><span class=\"token function\">createConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    host     <span class=\"token punctuation\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">HOST</span><span class=\"token punctuation\">,</span>\n    user     <span class=\"token punctuation\">:</span> <span class=\"token string\">'root'</span><span class=\"token punctuation\">,</span>\n    password <span class=\"token punctuation\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">PASSWORD</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  connection<span class=\"token punctuation\">.</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  connection<span class=\"token punctuation\">.</span><span class=\"token function\">query</span><span class=\"token punctuation\">(</span><span class=\"token string\">'SELECT 1 + 1 AS solution'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">error<span class=\"token punctuation\">,</span> results<span class=\"token punctuation\">,</span> fields</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> error<span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The solution is: '</span><span class=\"token punctuation\">,</span> results<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>solution<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  connection<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span></code></pre></div>\n<p>安装所需依赖模块：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install mysql2</code></pre></div>\n<p>完成业务代码编写和依赖安装后，创建 <code class=\"language-text\">serverless.yml</code> 文件，示例文件如下：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"87931615676408740000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`org: mysql-app\napp: mysql-app\nstage: dev\ncomponent: scf\nname: mysql-app-scf\n\ninputs:\n  src: ./\n  functionName: \\${name}\n  region: \\${env:REGION}\n  runtime: Nodejs10.15\n  timeout: 30\n  vpcConfig:\n    vpcId: \\${output:\\${stage}:\\${app}:mysql-app-vpc.vpcId}\n    subnetId: \\${output:\\${stage}:\\${app}:mysql-app-vpc.subnetId}\n  environment:\n    variables:\n      HOST: \\${output:\\${stage}:\\${app}:mysql-app-db.connection.ip}\n      PASSWORD: \\${output:\\${stage}:\\${app}:mysql-app-db.adminPassword}`, `87931615676408740000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yml\"><pre class=\"language-yml\"><code class=\"language-yml\"><span class=\"token key atrule\">org</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app\n<span class=\"token key atrule\">stage</span><span class=\"token punctuation\">:</span> dev\n<span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> scf\n<span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>scf\n\n<span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> ./\n  <span class=\"token key atrule\">functionName</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>name<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>env<span class=\"token punctuation\">:</span>REGION<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Nodejs10.15\n  <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">30</span>\n  <span class=\"token key atrule\">vpcConfig</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">vpcId</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>vpc.vpcId<span class=\"token punctuation\">}</span>\n    <span class=\"token key atrule\">subnetId</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>vpc.subnetId<span class=\"token punctuation\">}</span>\n  <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">HOST</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>db.connection.ip<span class=\"token punctuation\">}</span>\n      <span class=\"token key atrule\">PASSWORD</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span>output<span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>stage<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>app<span class=\"token punctuation\">}</span><span class=\"token punctuation\">:</span>mysql<span class=\"token punctuation\">-</span>app<span class=\"token punctuation\">-</span>db.adminPassword<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"5-快速部署\"><a href=\"#5-%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2\" aria-label=\"5 快速部署 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. 快速部署</h3>\n<p>完成创建后，项目目录结构如下：</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">   ./test-MySQL\n   ├── vpc\n   │   └── serverless.yml # vpc 配置文件\n   ├── db\n   │   └── serverless.yml # db 配置文件\n   ├── src\n   │   ├── serverless.yml # scf 组件配置文件\n   │   ├── node_modules # 项目依赖文件\n   │   └── index.js # 入口函数\n   └── .env # 环境变量文件</code></pre></div>\n<p>使用命令行在 <code class=\"language-text\">test-MySQL</code> 下，执行以下命令进行部署。</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"17280920413514033000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`sls deploy`, `17280920413514033000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">sls deploy</code></pre></div>\n<blockquote>\n<ul>\n<li>部署时需要扫码授权，如果没有腾讯云账号，请 <a href=\"https://cloud.tencent.com/register\">注册新账号</a>。</li>\n<li>如果是子账号，请参考<a href=\"https://cloud.tencent.com/document/product/1154/43006#.E5.AD.90.E8.B4.A6.E5.8F.B7.E6.9D.83.E9.99.90.E9.85.8D.E7.BD.AE\">子账号权限配置</a>完成授权</li>\n</ul>\n</blockquote>\n<p>返回结果如下所示，即为部署成功。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">mysql-app-vpc: \n  region:        xxx\n  zone:          xxx\n  vpcId:         xxxx-xxx\n  ...\n\nmysql-app-db: \n  dbMode:        xxxx\n  region:        xxxx\n  zone:          xxxx\n  ...\n\nmysql-app-scf: \n  functionName:  xxxx\n  description:   xxx\n  ...\n\n59s › test-MySQL › &quot;deploy&quot; ran for 3 apps successfully.</code></pre></div>\n<p>部署成功后，您可通过 <a href=\"https://console.cloud.tencent.com/scf/index?rid=1\">云函数控制台</a>，查看并进行函数调试，测试成功如下图所示：</p>\n<p><img src=\"https://main.qcloudimg.com/raw/f55346a48e68f78771fb746b58b3c1a0.png\"></p>\n<h3 id=\"移除项目\"><a href=\"#%E7%A7%BB%E9%99%A4%E9%A1%B9%E7%9B%AE\" aria-label=\"移除项目 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>移除项目</h3>\n<p>在 <code class=\"language-text\">test-MySQL</code> 目录下，执行以下命令可移除项目。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">sls remove</code></pre></div>\n<p>返回如下结果，即为成功移除。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">serverless ⚡ framework\n4s › test-MySQL › Success</code></pre></div>\n<p>除了通过组件一键创建所有资源外，您也可以通过控制台完成 Serverless 版本 MySQL 数据库的创建，并在云函数中正常使用 SDK 的方式完成调用。</p>\n<ul>\n<li>详情参考：<a href=\"https://cloud.tencent.com/document/product/583/38012\">https://cloud.tencent.com/document/product/583/38012</a></li>\n<li>TDSQL-C Serverless 产品文档：<a href=\"https://cloud.tencent.com/document/product/1003/50853\">https://cloud.tencent.com/document/product/1003/50853</a></li>\n</ul>\n<hr>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#%E6%9C%8D%E5%8A%A1%E7%89%B9%E6%80%A7\">服务特性</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF\">适用场景</a></li>\n<li>\n<p><a href=\"/best-practice/2021-01-07-serverless-mysql/#%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4\">操作步骤</a></p>\n<ul>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#1-%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F\">1. 配置环境变量</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#2-%E9%85%8D%E7%BD%AE%E7%A7%81%E6%9C%89%E7%BD%91%E7%BB%9C\">2. 配置私有网络</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#3-%E9%85%8D%E7%BD%AE-serverless-db\">3. 配置 Serverless DB</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#4-%E7%BC%96%E5%86%99%E4%B8%9A%E5%8A%A1%E4%BB%A3%E7%A0%81%E4%B8%8E%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6\">4. 编写业务代码与配置文件</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#5-%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2\">5. 快速部署</a></li>\n<li><a href=\"/best-practice/2021-01-07-serverless-mysql/#%E7%A7%BB%E9%99%A4%E9%A1%B9%E7%9B%AE\">移除项目</a></li>\n</ul>\n</li>\n</ul>"},"previousBlog":{"id":"a1042bcb-7aa0-507a-94ea-e51a75168d19","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/cce85c25d61f59681d8b0ea835aee127.jpg","authors":["吴坚强"],"categories":["best-practice"],"date":"2021-01-08T00:00:00.000Z","title":"Serverless 音视频转码 —— 芒果 TV 落地实践（上）","description":"芒果TV 使用 serverless 后，成本降低 45% 以上！","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","客户案例"],"keywords":null,"outdated":null},"wordCount":{"words":410,"sentences":66,"paragraphs":66},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-08-serverless-mangguo.md","fields":{"slug":"/best-practice/2021-01-08-serverless-mangguo/","keywords":["serverless","函数计算","云函数","Serverless","视频","转码","芒果"]}},"nextBlog":{"id":"776e3baf-a065-5ca0-aafd-e3af9e050975","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/007bbdc60ded777b71353a480bb6cb66.jpg","authors":["松鹅"],"categories":["best-practice"],"date":"2021-01-06T00:00:00.000Z","title":"再见，本地环境！腾讯云全球首发：Serverless 在线远程调试","description":"本文将以一段内存泄漏的代码为例，给大家展示如何使用在线调试功能定位和解决问题","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","在线调试"],"keywords":null,"outdated":null},"wordCount":{"words":110,"sentences":22,"paragraphs":22},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-06-remote-debugging.md","fields":{"slug":"/best-practice/2021-01-06-remote-debugging/","keywords":["serverless","云函数","内存","快照","泄漏","调试"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"664a969f-5a20-526c-b0a5-64e95ce6f15d","previousBlogId":"a1042bcb-7aa0-507a-94ea-e51a75168d19","nextBlogId":"776e3baf-a065-5ca0-aafd-e3af9e050975"}}}