{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2020-04-30-serverless-github-cos","result":{"data":{"currentBlog":{"id":"0722790f-d507-53cc-8f2d-f9785a562a8e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020523/1590210110499-162011.jpg","authors":["Stille"],"categories":["user-stories"],"date":"2020-04-30T00:00:00.000Z","title":"Serverless + GitHub Actions 完美自动化部署静态网站","description":"GitHub Actions + 对象存储 COS + 云函数 SCF + 自动刷新 CDN 完美自动化部署静态网站","authorslink":["https://cloud.tencent.com/developer/article/1617831"],"translators":null,"translatorslink":null,"tags":["对象存储","云函数"],"keywords":"Serverless云函数,Serverless网站,Serverless应用","outdated":null},"wordCount":{"words":271,"sentences":92,"paragraphs":92},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-30-serverless-github-cos.md","fields":{"slug":"/blog/2020-04-30-serverless-github-cos/","keywords":["java","php","serverless","云函数","serverless","serverlesscloud","GitHub","腾讯"]},"html":"<p>作为强迫症患者，一直对自动化部署非常痴迷，个人认为全自动部署最重要的就是稳定可靠。经过研究测试，最终使用 GitHub 和腾讯云两大平台，成功完成了全自动部署网站的实践。</p>\n<h2 id=\"方案简介\"><a href=\"#%E6%96%B9%E6%A1%88%E7%AE%80%E4%BB%8B\" 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<h3 id=\"业务需求\"><a href=\"#%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82\" 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>博主有一个简单的纯静态文档站点 <a href=\"https://docs.ioiox.com/\">docs.ioiox.com</a>，使用的的是 <a href=\"https://docsify.js.org/\">docsify</a> 项目的 Markdown 渲染程序，平时通过本地 VSCode 编辑文档，并提交到 GitHub。早前是直接使用 GitHub Pages 绑定域名来访问，但由于网络问题，体验并不好。</p>\n<h3 id=\"寻求方案\"><a href=\"#%E5%AF%BB%E6%B1%82%E6%96%B9%E6%A1%88\" 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>腾讯云对象存储 COS 服务能够提供静态网页服务，并可以配置 CDN 域名进行访问。那么就需要解决以下两个问题:</p>\n<ol>\n<li>如何使 GitHub 自动同步文件到腾讯云 COS</li>\n<li>腾讯云 COS 对应的 CDN 如何自动刷新</li>\n</ol>\n<h3 id=\"解决方案\"><a href=\"#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\" 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<ul>\n<li><strong>GitHub Action</strong> - 配置每次 Push 代码后自动上传到 COS</li>\n<li><strong>腾讯云云函数 SCF</strong> - 检测到 COS 内文件变动后自动刷新对应的 CDN 链接</li>\n</ul>\n<h3 id=\"方案流程图\"><a href=\"#%E6%96%B9%E6%A1%88%E6%B5%81%E7%A8%8B%E5%9B%BE\" 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><img src=\"https://img.serverlesscloud.cn/2020523/1590210109600-162011.jpg\"></p>\n<h2 id=\"第一阶段---github-actions\"><a href=\"#%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5---github-actions\" aria-label=\"第一阶段   github actions 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>第一阶段 - GitHub Actions</h2>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110863-162011.jpg\"></p>\n<p>2019 年 11 月，GitHub 正式开放了 GitHub Actions 这个功能，不再需要申请就能自由使用，目前是按照 workflow 的使用时长来收费，个人用户每月 2000 分钟的免费额度也基本够用了。</p>\n<h3 id=\"获取腾讯云-api-密钥\"><a href=\"#%E8%8E%B7%E5%8F%96%E8%85%BE%E8%AE%AF%E4%BA%91-api-%E5%AF%86%E9%92%A5\" aria-label=\"获取腾讯云 api 密钥 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>获取腾讯云 API 密钥</h3>\n<p><strong>登录腾讯云控制面板 - 访问控制 - 访问密钥 - API 密钥管理</strong></p>\n<p>新建密钥</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210108855-162011.jpg\" alt=\"新建密钥\"></p>\n<p><em>此密钥拥有所有权限，为保证安全，也可以添加子用户，配置 COS,CDN 对应的权限</em></p>\n<h3 id=\"配置腾讯云-cos\"><a href=\"#%E9%85%8D%E7%BD%AE%E8%85%BE%E8%AE%AF%E4%BA%91-cos\" aria-label=\"配置腾讯云 cos 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>配置腾讯云 COS</h3>\n<p><strong>登录腾讯云控制面板 - 对象存储 - 存储桶列表</strong></p>\n<p>创建存储桶</p>\n<p>选择适合你的区域,设置权限为 <code class=\"language-text\">公有读私有写</code>.</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210111244-162011.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109266-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>获取存储桶相关信息</strong></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210108828-162011.jpg\" alt=\"serverless\"></p>\n<h3 id=\"配置-github-actions\"><a href=\"#%E9%85%8D%E7%BD%AE-github-actions\" aria-label=\"配置 github actions 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>配置 GitHub Actions</h3>\n<p><strong>GitHub仓库 - Settings - Secrets</strong></p>\n<p>添加 <code class=\"language-text\">SecretId</code> 和 <code class=\"language-text\">SecretKey</code> 分别为刚才获取的腾讯云 API 密钥</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110248-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>GitHub仓库 - Actions</strong></p>\n<p>默认会有很多推荐的 workflows，这里选择 <code class=\"language-text\">Set up a workflow yourself</code> 自己来配置。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110244-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>系统会创建一个 workflow 的 yml 配置文件，删除预设代码，复制以下样本代码。</strong></p>\n<p><code class=\"language-text\">图上标红两处需修改为刚才创建存储桶获取的名称和区域</code></p>\n<p>然后右上角提交即可。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109426-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>yml 配置文件样本</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60308971202310470000\"\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(`name: Upload to COS\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n    - name: Install coscmd\n      run: sudo pip install coscmd\n    - name: Configure coscmd\n      env:\n        SECRET_ID: \\${{ secrets.SecretId }}\n        SECRET_KEY: \\${{ secrets.SecretKey }}\n        BUCKET: docs-1300533487\n        REGION: ap-shanghai\n      run: coscmd config -a \\$SECRET_ID -s \\$SECRET_KEY -b \\$BUCKET -r \\$REGION\n    - name: Upload\n      run: coscmd upload -rs --delete -f ./ / --ignore &quot;./.git/*&quot;`, `60308971202310470000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">name<span class=\"token punctuation\">:</span> Upload to <span class=\"token constant\">COS</span>\n\non<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>push<span class=\"token punctuation\">]</span>\n\njobs<span class=\"token punctuation\">:</span>\n  build<span class=\"token punctuation\">:</span>\n\n    runs<span class=\"token operator\">-</span>on<span class=\"token punctuation\">:</span> ubuntu<span class=\"token operator\">-</span>latest\n\n    steps<span class=\"token punctuation\">:</span>\n    <span class=\"token operator\">-</span> uses<span class=\"token punctuation\">:</span> actions<span class=\"token operator\">/</span>checkout@v1\n    <span class=\"token operator\">-</span> name<span class=\"token punctuation\">:</span> Install coscmd\n      run<span class=\"token punctuation\">:</span> sudo pip install coscmd\n    <span class=\"token operator\">-</span> name<span class=\"token punctuation\">:</span> Configure coscmd\n      env<span class=\"token punctuation\">:</span>\n        <span class=\"token constant\">SECRET_ID</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets<span class=\"token punctuation\">.</span>SecretId <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n        <span class=\"token constant\">SECRET_KEY</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets<span class=\"token punctuation\">.</span>SecretKey <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n        <span class=\"token constant\">BUCKET</span><span class=\"token punctuation\">:</span> docs<span class=\"token operator\">-</span><span class=\"token number\">1300533487</span>\n        <span class=\"token constant\">REGION</span><span class=\"token punctuation\">:</span> ap<span class=\"token operator\">-</span>shanghai\n      run<span class=\"token punctuation\">:</span> coscmd config <span class=\"token operator\">-</span>a $<span class=\"token constant\">SECRET_ID</span> <span class=\"token operator\">-</span>s $<span class=\"token constant\">SECRET_KEY</span> <span class=\"token operator\">-</span>b $<span class=\"token constant\">BUCKET</span> <span class=\"token operator\">-</span>r $<span class=\"token constant\">REGION</span>\n    <span class=\"token operator\">-</span> name<span class=\"token punctuation\">:</span> Upload\n      run<span class=\"token punctuation\">:</span> coscmd upload <span class=\"token operator\">-</span>rs <span class=\"token operator\">--</span><span class=\"token keyword\">delete</span> <span class=\"token operator\">-</span>f <span class=\"token punctuation\">.</span><span class=\"token operator\">/</span> <span class=\"token regex\">/ --ignore \"./</span><span class=\"token punctuation\">.</span>git<span class=\"token comment\">/*\"</span></code></pre></div>\n<h3 id=\"测试-github-actions\"><a href=\"#%E6%B5%8B%E8%AF%95-github-actions\" aria-label=\"测试 github actions 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>测试 GitHub Actions</h3>\n<p>提交 yml 后系统检测到 <code class=\"language-text\">main.yml</code> 的 push，便会开始运行这个 workflow，根据 yml 配置文件，可以看出整个工作流简单理解为安装了腾讯云的 coscmd 工具，并根据配置的 <code class=\"language-text\">SecretId</code>、<code class=\"language-text\">SecretKey</code>、<code class=\"language-text\">BUCKET</code>、<code class=\"language-text\">REGION</code> 上传整个仓库到腾讯云 COS，同时忽略掉 <code class=\"language-text\">.git</code> 文件夹。其中 <code class=\"language-text\">upload -rs</code> 命令会使用 md5 比对存储桶中已存在的文件，相同文件将会跳过上传。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110351-162011.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210108821-162011.jpg\" alt=\"serverless\"></p>\n<h2 id=\"第二阶段---腾讯云函数-scf\"><a href=\"#%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5---%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0-scf\" aria-label=\"第二阶段   腾讯云函数 scf 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>第二阶段 - 腾讯云函数 SCF</h2>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210108837-162011.jpg\" alt=\"serverless\"></p>\n<h3 id=\"配置腾讯云-cdn-域名\"><a href=\"#%E9%85%8D%E7%BD%AE%E8%85%BE%E8%AE%AF%E4%BA%91-cdn-%E5%9F%9F%E5%90%8D\" aria-label=\"配置腾讯云 cdn 域名 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>配置腾讯云 CDN 域名</h3>\n<p><strong>登录腾讯云控制面板 - 对象存储</strong></p>\n<p>进入创建的存储桶 - 基础配置 - 开启静态网站</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210108864-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>域名管理</strong></p>\n<p>添加自定义加速域名,并设置域名指向生成的CNAME地址,源站类型改为<code class=\"language-text\">静态网站源站</code>。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110440-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>控制面板 - 内容分发网络 - 域名管理</strong></p>\n<p>点击添加的域名 - 高级配置</p>\n<p>开启 HTTPS，设置强制跳转 HTTPS，并更改跳转方式为 301。在点击前往配置申请免费证书。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110008-162011.jpg\" alt=\"serverless\"></p>\n<h3 id=\"配置云函数-scf\"><a href=\"#%E9%85%8D%E7%BD%AE%E4%BA%91%E5%87%BD%E6%95%B0-scf\" aria-label=\"配置云函数 scf 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>配置云函数 SCF</h3>\n<p><strong>登录腾讯云控制面板 - 云函数</strong></p>\n<p>首次使用云函数可能会跳出 <code class=\"language-text\">服务授权</code> 框，需要前往访问添加并同意授权即可。该角色对本次添加的云函数没有影响。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109599-162011.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109748-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>选择和你存储桶相同区域并新建</strong></p>\n<p>填写函数名，运行环境选择 <code class=\"language-text\">Php 5.6</code>，创建方式选择 <code class=\"language-text\">空白函数</code> 下一步。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109462-162011.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109500-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>函数配置</strong></p>\n<p>上部分保持默认即可</p>\n<p><strong>删除默认代码,复制以下样本代码至此.</strong></p>\n<p><code class=\"language-text\">图上标红两处需修改为之前获取的 API 密钥，注意此处的 ID 和 KEY 顺序和之前配置 GitHub Actions 时是相反的，并把 CDN 链接改为你的域名，如果域名已配置过 HTTPS 和证书，确保此处为 https。</code></p>\n<p>完成即可</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210111451-162011.jpg\" alt=\"serverless\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210110042-162011.jpg\" alt=\"serverless\"></p>\n<p>函数代码样本</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"17886582130375883000\"\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(`<?php\n\\$gl = 1;\nfunction main_handler(\\$event, \\$context) {\n    \\$eve = json_decode(json_encode(\\$event,JSON_FORCE_OBJECT),true);\n    \\$usr_url=strval(\\$eve[&quot;Records&quot;][0][&quot;cos&quot;][&quot;cosObject&quot;][&quot;url&quot;]);\n\n    //截取object部分\n    \\$object=substr(\\$usr_url,strpos(\\$usr_url,&quot;/&quot;,8));\n\n    /*需要填写您的密钥，可从  https://console.cloud.tencent.com/capi 获取 SecretId 及 \\$secretKey*/\n    \\$secretKey='XXXXXXXXXXXXXX';\n    \\$secretId='XXXXXXXXXXXXXX';\n    \\$action='RefreshCdnUrl';\n\n    \\$HttpUrl=&quot;cdn.api.qcloud.com&quot;;\n    /*除非有特殊说明，如MultipartUploadVodFile，其它接口都支持GET及POST*/\n    \\$HttpMethod=&quot;GET&quot;;\n    /*是否https协议，大部分接口都必须为https，只有少部分接口除外（如MultipartUploadVodFile）*/\n    \\$isHttps =true;\n    \\$nurl=&quot;https://XXXX.XXXX.com&quot;.\\$object; //   示例：\\$nurl=&quot;http://abc.com&quot;.\\$object;\n    //print_r(\\$nurl);\n\n    /*下面这五个参数为所有接口的 公共参数；对于某些接口没有地域概念，则不用传递Region（如DescribeDeals）*/\n    \\$COMMON_PARAMS = array(\n                    'Nonce' => rand(),\n                    'Timestamp' =>time(NULL),\n                    'Action' =>\\$action,\n                    'SecretId' => \\$secretId,\n                    'SignatureMethod' => 'HmacSHA256',\n                    'urls.0' => \\$nurl\n                    );\n    \\$PRIVATE_PARAMS = array();\n    //**********执行CDN刷新URL操作**********/\n    CreateRequest(\\$HttpUrl,\\$HttpMethod,\\$COMMON_PARAMS,\\$secretKey, \\$PRIVATE_PARAMS, \\$isHttps);\n   return &quot;RefreshCdnUrl OK&quot;;\n}\n/***************CDN API调用方法***************/\nfunction CreateRequest(\\$HttpUrl,\\$HttpMethod,\\$COMMON_PARAMS,\\$secretKey, \\$PRIVATE_PARAMS, \\$isHttps)\n{\n        \\$FullHttpUrl = \\$HttpUrl.&quot;/v2/index.php&quot;;\n\n        /***************对请求参数 按参数名 做字典序升序排列，注意此排序区分大小写*************/\n        \\$ReqParaArray = array_merge(\\$COMMON_PARAMS, \\$PRIVATE_PARAMS);\n        ksort(\\$ReqParaArray);\n\n        /**********************************生成签名原文**********************************\n         * 将 请求方法, URI地址,及排序好的请求参数  按照下面格式  拼接在一起, 生成签名原文，此请求中的原文为\n         * GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz\n         * &SecretId=AKIDz8krbsJ5yKBZQ    ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141\n         * &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789\n         * ****************************************************************************/\n        \\$SigTxt = \\$HttpMethod.\\$FullHttpUrl.&quot;?&quot;;\n        \\$isFirst = true;\n        foreach (\\$ReqParaArray as \\$key => \\$value)\n        {\n                if (!\\$isFirst)\n                {\n                        \\$SigTxt = \\$SigTxt.&quot;&&quot;;\n                }\n                \\$isFirst= false;\n                /*拼接签名原文时，如果参数名称中携带_，需要替换成.*/\n                if(strpos(\\$key, '_'))\n                {\n                        \\$key = str_replace('_', '.', \\$key);\n                }\n                \\$SigTxt=\\$SigTxt.\\$key.&quot;=&quot;.\\$value;\n        }\n        /*********************根据签名原文字符串 \\$SigTxt，生成签名 Signature******************/\n        \\$Signature = base64_encode(hash_hmac('sha256', \\$SigTxt, \\$secretKey, true));\n\n        /***************拼接请求串,对于请求参数及签名，需要进行urlencode编码********************/\n        \\$Req = &quot;Signature=&quot;.urlencode(\\$Signature);\n        foreach (\\$ReqParaArray as \\$key => \\$value)\n        {\n                \\$Req=\\$Req.&quot;&&quot;.\\$key.&quot;=&quot;.urlencode(\\$value);\n        }\n\n        /*********************************发送请求********************************/\n        if(\\$HttpMethod === 'GET')\n        {\n                if(\\$isHttps === true)\n                {\n                        \\$Req=&quot;https://&quot;.\\$FullHttpUrl.&quot;?&quot;.\\$Req;\n                }\n                else\n                {\n                        \\$Req=&quot;http://&quot;.\\$FullHttpUrl.&quot;?&quot;.\\$Req;\n                }\n                \\$Rsp = file_get_contents(\\$Req);\n        }\n        else\n        {\n                if(\\$isHttps === true)\n                {\n                        \\$Rsp= SendPost(&quot;https://&quot;.\\$FullHttpUrl,\\$Req,\\$isHttps);\n                }\n                else\n                {\n                        \\$Rsp= SendPost(&quot;http://&quot;.\\$FullHttpUrl,\\$Req,\\$isHttps);\n                }\n        }\n        var_export(json_decode(\\$Rsp,true));\n}\nfunction SendPost(\\$FullHttpUrl, \\$Req, \\$isHttps)\n{\n        \\$ch = curl_init();\n        curl_setopt(\\$ch, CURLOPT_POST, 1);\n        curl_setopt(\\$ch, CURLOPT_POSTFIELDS, \\$Req);\n        curl_setopt(\\$ch, CURLOPT_URL, \\$FullHttpUrl);\n        curl_setopt(\\$ch, CURLOPT_RETURNTRANSFER, true);\n        if (\\$isHttps === true) {\n                curl_setopt(\\$ch, CURLOPT_SSL_VERIFYPEER,  false);\n                curl_setopt(\\$ch, CURLOPT_SSL_VERIFYHOST,  false);\n        }\n        \\$result = curl_exec(\\$ch);\n        return \\$result;\n}\n?>`, `17886582130375883000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token operator\">&lt;</span><span class=\"token operator\">?</span>php\n$gl <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$event<span class=\"token punctuation\">,</span> $context</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    $eve <span class=\"token operator\">=</span> <span class=\"token function\">json_decode</span><span class=\"token punctuation\">(</span><span class=\"token function\">json_encode</span><span class=\"token punctuation\">(</span>$event<span class=\"token punctuation\">,</span><span class=\"token constant\">JSON_FORCE_OBJECT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    $usr_url<span class=\"token operator\">=</span><span class=\"token function\">strval</span><span class=\"token punctuation\">(</span>$eve<span class=\"token punctuation\">[</span><span class=\"token string\">\"Records\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"cos\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"cosObject\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"url\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">//截取object部分</span>\n    $object<span class=\"token operator\">=</span><span class=\"token function\">substr</span><span class=\"token punctuation\">(</span>$usr_url<span class=\"token punctuation\">,</span><span class=\"token function\">strpos</span><span class=\"token punctuation\">(</span>$usr_url<span class=\"token punctuation\">,</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">,</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">/*需要填写您的密钥，可从  https://console.cloud.tencent.com/capi 获取 SecretId 及 $secretKey*/</span>\n    $secretKey<span class=\"token operator\">=</span><span class=\"token string\">'XXXXXXXXXXXXXX'</span><span class=\"token punctuation\">;</span>\n    $secretId<span class=\"token operator\">=</span><span class=\"token string\">'XXXXXXXXXXXXXX'</span><span class=\"token punctuation\">;</span>\n    $action<span class=\"token operator\">=</span><span class=\"token string\">'RefreshCdnUrl'</span><span class=\"token punctuation\">;</span>\n\n    $HttpUrl<span class=\"token operator\">=</span><span class=\"token string\">\"cdn.api.qcloud.com\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/*除非有特殊说明，如MultipartUploadVodFile，其它接口都支持GET及POST*/</span>\n    $HttpMethod<span class=\"token operator\">=</span><span class=\"token string\">\"GET\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">/*是否https协议，大部分接口都必须为https，只有少部分接口除外（如MultipartUploadVodFile）*/</span>\n    $isHttps <span class=\"token operator\">=</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    $nurl<span class=\"token operator\">=</span><span class=\"token string\">\"https://XXXX.XXXX.com\"</span><span class=\"token punctuation\">.</span>$object<span class=\"token punctuation\">;</span> <span class=\"token comment\">//   示例：$nurl=\"http://abc.com\".$object;</span>\n    <span class=\"token comment\">//print_r($nurl);</span>\n\n    <span class=\"token comment\">/*下面这五个参数为所有接口的 公共参数；对于某些接口没有地域概念，则不用传递Region（如DescribeDeals）*/</span>\n    $<span class=\"token constant\">COMMON_PARAMS</span> <span class=\"token operator\">=</span> <span class=\"token function\">array</span><span class=\"token punctuation\">(</span>\n                    <span class=\"token string\">'Nonce'</span> <span class=\"token operator\">=></span> <span class=\"token function\">rand</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">'Timestamp'</span> <span class=\"token operator\">=></span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">'Action'</span> <span class=\"token operator\">=></span>$action<span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">'SecretId'</span> <span class=\"token operator\">=></span> $secretId<span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">'SignatureMethod'</span> <span class=\"token operator\">=></span> <span class=\"token string\">'HmacSHA256'</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">'urls.0'</span> <span class=\"token operator\">=></span> $nurl\n                    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    $<span class=\"token constant\">PRIVATE_PARAMS</span> <span class=\"token operator\">=</span> <span class=\"token function\">array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">//**********执行CDN刷新URL操作**********/</span>\n    <span class=\"token function\">CreateRequest</span><span class=\"token punctuation\">(</span>$HttpUrl<span class=\"token punctuation\">,</span>$HttpMethod<span class=\"token punctuation\">,</span>$<span class=\"token constant\">COMMON_PARAMS</span><span class=\"token punctuation\">,</span>$secretKey<span class=\"token punctuation\">,</span> $<span class=\"token constant\">PRIVATE_PARAMS</span><span class=\"token punctuation\">,</span> $isHttps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n   <span class=\"token keyword\">return</span> <span class=\"token string\">\"RefreshCdnUrl OK\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/***************CDN API调用方法***************/</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">CreateRequest</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$HttpUrl<span class=\"token punctuation\">,</span>$HttpMethod<span class=\"token punctuation\">,</span>$<span class=\"token constant\">COMMON_PARAMS</span><span class=\"token punctuation\">,</span>$secretKey<span class=\"token punctuation\">,</span> $<span class=\"token constant\">PRIVATE_PARAMS</span><span class=\"token punctuation\">,</span> $isHttps</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n        $FullHttpUrl <span class=\"token operator\">=</span> $HttpUrl<span class=\"token punctuation\">.</span><span class=\"token string\">\"/v2/index.php\"</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">/***************对请求参数 按参数名 做字典序升序排列，注意此排序区分大小写*************/</span>\n        $ReqParaArray <span class=\"token operator\">=</span> <span class=\"token function\">array_merge</span><span class=\"token punctuation\">(</span>$<span class=\"token constant\">COMMON_PARAMS</span><span class=\"token punctuation\">,</span> $<span class=\"token constant\">PRIVATE_PARAMS</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">ksort</span><span class=\"token punctuation\">(</span>$ReqParaArray<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">/**********************************生成签名原文**********************************\n         * 将 请求方法, URI地址,及排序好的请求参数  按照下面格式  拼接在一起, 生成签名原文，此请求中的原文为\n         * GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&amp;Nonce=345122&amp;Region=gz\n         * &amp;SecretId=AKIDz8krbsJ5yKBZQ    ·1pn74WFkmLPx3gnPhESA&amp;Timestamp=1408704141\n         * &amp;instanceIds.0=qcvm12345&amp;instanceIds.1=qcvm56789\n         * ****************************************************************************/</span>\n        $SigTxt <span class=\"token operator\">=</span> $HttpMethod<span class=\"token punctuation\">.</span>$FullHttpUrl<span class=\"token punctuation\">.</span><span class=\"token string\">\"?\"</span><span class=\"token punctuation\">;</span>\n        $isFirst <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">foreach</span> <span class=\"token punctuation\">(</span>$ReqParaArray <span class=\"token keyword\">as</span> <span class=\"token parameter\">$key</span> <span class=\"token operator\">=></span> $value<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>$isFirst<span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">{</span>\n                        $SigTxt <span class=\"token operator\">=</span> $SigTxt<span class=\"token punctuation\">.</span><span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                $isFirst<span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n                <span class=\"token comment\">/*拼接签名原文时，如果参数名称中携带_，需要替换成.*/</span>\n                <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">strpos</span><span class=\"token punctuation\">(</span>$key<span class=\"token punctuation\">,</span> <span class=\"token string\">'_'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">{</span>\n                        $key <span class=\"token operator\">=</span> <span class=\"token function\">str_replace</span><span class=\"token punctuation\">(</span><span class=\"token string\">'_'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'.'</span><span class=\"token punctuation\">,</span> $key<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                $SigTxt<span class=\"token operator\">=</span>$SigTxt<span class=\"token punctuation\">.</span>$key<span class=\"token punctuation\">.</span><span class=\"token string\">\"=\"</span><span class=\"token punctuation\">.</span>$value<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token comment\">/*********************根据签名原文字符串 $SigTxt，生成签名 Signature******************/</span>\n        $Signature <span class=\"token operator\">=</span> <span class=\"token function\">base64_encode</span><span class=\"token punctuation\">(</span><span class=\"token function\">hash_hmac</span><span class=\"token punctuation\">(</span><span class=\"token string\">'sha256'</span><span class=\"token punctuation\">,</span> $SigTxt<span class=\"token punctuation\">,</span> $secretKey<span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">/***************拼接请求串,对于请求参数及签名，需要进行urlencode编码********************/</span>\n        $Req <span class=\"token operator\">=</span> <span class=\"token string\">\"Signature=\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">urlencode</span><span class=\"token punctuation\">(</span>$Signature<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">foreach</span> <span class=\"token punctuation\">(</span>$ReqParaArray <span class=\"token keyword\">as</span> <span class=\"token parameter\">$key</span> <span class=\"token operator\">=></span> $value<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n                $Req<span class=\"token operator\">=</span>$Req<span class=\"token punctuation\">.</span><span class=\"token string\">\"&amp;\"</span><span class=\"token punctuation\">.</span>$key<span class=\"token punctuation\">.</span><span class=\"token string\">\"=\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">urlencode</span><span class=\"token punctuation\">(</span>$value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">/*********************************发送请求********************************/</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>$HttpMethod <span class=\"token operator\">===</span> <span class=\"token string\">'GET'</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>$isHttps <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">{</span>\n                        $Req<span class=\"token operator\">=</span><span class=\"token string\">\"https://\"</span><span class=\"token punctuation\">.</span>$FullHttpUrl<span class=\"token punctuation\">.</span><span class=\"token string\">\"?\"</span><span class=\"token punctuation\">.</span>$Req<span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                <span class=\"token keyword\">else</span>\n                <span class=\"token punctuation\">{</span>\n                        $Req<span class=\"token operator\">=</span><span class=\"token string\">\"http://\"</span><span class=\"token punctuation\">.</span>$FullHttpUrl<span class=\"token punctuation\">.</span><span class=\"token string\">\"?\"</span><span class=\"token punctuation\">.</span>$Req<span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                $Rsp <span class=\"token operator\">=</span> <span class=\"token function\">file_get_contents</span><span class=\"token punctuation\">(</span>$Req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span>\n        <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>$isHttps <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">{</span>\n                        $Rsp<span class=\"token operator\">=</span> <span class=\"token function\">SendPost</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https://\"</span><span class=\"token punctuation\">.</span>$FullHttpUrl<span class=\"token punctuation\">,</span>$Req<span class=\"token punctuation\">,</span>$isHttps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n                <span class=\"token keyword\">else</span>\n                <span class=\"token punctuation\">{</span>\n                        $Rsp<span class=\"token operator\">=</span> <span class=\"token function\">SendPost</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"http://\"</span><span class=\"token punctuation\">.</span>$FullHttpUrl<span class=\"token punctuation\">,</span>$Req<span class=\"token punctuation\">,</span>$isHttps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">var_export</span><span class=\"token punctuation\">(</span><span class=\"token function\">json_decode</span><span class=\"token punctuation\">(</span>$Rsp<span class=\"token punctuation\">,</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">SendPost</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">$FullHttpUrl<span class=\"token punctuation\">,</span> $Req<span class=\"token punctuation\">,</span> $isHttps</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n        $ch <span class=\"token operator\">=</span> <span class=\"token function\">curl_init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_POST</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_POSTFIELDS</span><span class=\"token punctuation\">,</span> $Req<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_URL</span><span class=\"token punctuation\">,</span> $FullHttpUrl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_RETURNTRANSFER</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>$isHttps <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_SSL_VERIFYPEER</span><span class=\"token punctuation\">,</span>  <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token function\">curl_setopt</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">,</span> <span class=\"token constant\">CURLOPT_SSL_VERIFYHOST</span><span class=\"token punctuation\">,</span>  <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        $result <span class=\"token operator\">=</span> <span class=\"token function\">curl_exec</span><span class=\"token punctuation\">(</span>$ch<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> $result<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token operator\">?</span><span class=\"token operator\">></span></code></pre></div>\n<p><strong>测试函数代码</strong></p>\n<p>确认 API 及 CDN 配置正确，点击测试，返回成功。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109306-162011.jpg\" alt=\"serverless\"></p>\n<p><strong>添加触发方式</strong></p>\n<p>此处需要分别添加 <code class=\"language-text\">全部创建</code> 和 <code class=\"language-text\">全部删除</code> 两个触发方式</p>\n<p>触发方式：COS 触发</p>\n<p>COS Bucket：选择你的存储桶 <code class=\"language-text\">(请再次确保存储桶和云函数的区域相同)</code></p>\n<p>事件类型：<code class=\"language-text\">全部创建</code>和<code class=\"language-text\">全部删除</code></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109244-162011.jpg\" alt=\"serverless\"></p>\n<h3 id=\"测试配置\"><a href=\"#%E6%B5%8B%E8%AF%95%E9%85%8D%E7%BD%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><strong>腾讯云控制台 - 内容分发网络</strong></p>\n<p>左侧刷新预热 - 操作记录 - 查询</p>\n<p>可以看到刚才测试成功的一条记录，现在可以尝试在 Push 代码到 GitHub 来完整的测试整个流程了。</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020523/1590210109500-162011.jpg\" alt=\"serverless\"></p>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a></li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/blog/2020-04-30-serverless-github-cos/#%E6%96%B9%E6%A1%88%E7%AE%80%E4%BB%8B\">方案简介</a></p>\n<ul>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82\">业务需求</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E5%AF%BB%E6%B1%82%E6%96%B9%E6%A1%88\">寻求方案</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">解决方案</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E6%96%B9%E6%A1%88%E6%B5%81%E7%A8%8B%E5%9B%BE\">方案流程图</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2020-04-30-serverless-github-cos/#%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5---github-actions\">第一阶段 - GitHub Actions</a></p>\n<ul>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E8%8E%B7%E5%8F%96%E8%85%BE%E8%AE%AF%E4%BA%91-api-%E5%AF%86%E9%92%A5\">获取腾讯云 API 密钥</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E9%85%8D%E7%BD%AE%E8%85%BE%E8%AE%AF%E4%BA%91-cos\">配置腾讯云 COS</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E9%85%8D%E7%BD%AE-github-actions\">配置 GitHub Actions</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E6%B5%8B%E8%AF%95-github-actions\">测试 GitHub Actions</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/blog/2020-04-30-serverless-github-cos/#%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5---%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0-scf\">第二阶段 - 腾讯云函数 SCF</a></p>\n<ul>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E9%85%8D%E7%BD%AE%E8%85%BE%E8%AE%AF%E4%BA%91-cdn-%E5%9F%9F%E5%90%8D\">配置腾讯云 CDN 域名</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E9%85%8D%E7%BD%AE%E4%BA%91%E5%87%BD%E6%95%B0-scf\">配置云函数 SCF</a></li>\n<li><a href=\"/blog/2020-04-30-serverless-github-cos/#%E6%B5%8B%E8%AF%95%E9%85%8D%E7%BD%AE\">测试配置</a></li>\n</ul>\n</li>\n</ul>"},"previousBlog":{"id":"c6f185d4-303d-5fe5-9fdd-dbd52f9a7fc1","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020720/1595233528915-1588164013282-banner_hours%20%281%29.jpg","authors":["Serverless 社区"],"categories":["meetup"],"date":"2020-05-08T00:00:00.000Z","title":"Tencent Serverless Hours 线上分享会第一期","description":"届时将有腾讯云高级产品经理黄文俊、腾讯云高级前端开发工程师蔡卫峰为您分享云函数的最新进展！","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless","Meetup"],"keywords":"Serverless;Serverless Framework;Tencent Serverless","outdated":null},"wordCount":{"words":60,"sentences":13,"paragraphs":13},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-05-08-tencent-serverless-hours-meetup.md","fields":{"slug":"/blog/2020-05-08-tencent-serverless-hours-meetup/","keywords":["serverless","云函数","serverless","Serverless","分享","线上","serverlesscloud","举办"]}},"nextBlog":{"id":"b5efeaba-7d1a-5fec-8de9-ffb2112d5bfc","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020428/1588065568171-scf6000s.jpg","authors":["Vinson"],"categories":["guides-and-tutorials"],"date":"2020-04-28T00:00:00.000Z","title":"云函数如何做到 1 分钟创建 6000 台云服务器？","description":"解密背后承担云服务器创建任务的 CBS 云硬盘快照服务","authorslink":["https://serverlesscloud.cn"],"translators":null,"translatorslink":null,"tags":["Serverless","云函数"],"keywords":"Serverless;云函数 SCF;","outdated":null},"wordCount":{"words":244,"sentences":48,"paragraphs":48},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-28-scf-bs.md","fields":{"slug":"/blog/2020-04-28-scf-bs/","keywords":["serverless","无服务器","云函数","云原生","硬盘","快照","服务器","创建","拷贝","回滚","系统"]}},"recommendBlogs":{"edges":[{"node":{"id":"4300b21c-7209-5256-86ff-0d38e3daec9b","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/14f1c8eed372e76c1b139703b2f6d0fa.jpg","authors":["KieranMcCarthy"],"categories":["user-stories","engineering-culture"],"date":"2018-01-09T00:00:00.000Z","title":"我是如何在四年时间里，从厨师转行为 Serverless 应用开发者","description":"我是厨师出身，现在成为了一名 Serverless 应用开发者。","authorslink":["https://serverless.com/author/kieranmccarthy/"],"translators":["Aceyclee"],"translatorslink":["https://www.zhihu.com/people/Aceyclee"],"tags":["应用开发","Serverless"],"keywords":"Serverless 应用开发,Serverless 管理,厨师转行为 Serverless 应用开发者","outdated":null},"wordCount":{"words":285,"sentences":38,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years.md","fields":{"slug":"/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years/","keywords":["无服务器","无服务器开发","云函数","学习","Serverless","构建","Framework","开发者","服务器","应用","学位","简历"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"98602143-b837-5f50-a24f-3b1ec76044d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/sqquid/sqquid-serverless-thumb.jpg","authors":["RonPeled"],"categories":["user-stories"],"date":"2018-12-17T00:00:00.000Z","title":"SQQUID：100% 无服务器初创公司","description":"SQQUID 将 AWS Lambda 和无服务器框架用于其核心产品和营销网站。我们来看看一个完全无服务器的初创公司是怎样的。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":266,"sentences":42,"paragraphs":42},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-17-sqquid-one-hundred-percent-serverless.md","fields":{"slug":"/blog/2018-12-17-sqquid-one-hundred-percent-serverless/","keywords":["go","serverless","无服务器","无服务器架构","服务器","架构","Lambda","集成","FaaS","串行","系统"]}}},{"node":{"id":"29dc2e58-d2ba-56f9-aee1-d21b0bc62e0e","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/ao-com-story/ao-serverless-thumbnail.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-04-24T00:00:00.000Z","title":"AO.com：逐渐转向无服务器优先","description":"AO.com 的 SCV 团队率先尝试无服务器服务。折服于无服务器框架的快速周转时间和低维护成本，整个团队逐渐转向无服务器优先。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":236,"sentences":42,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-04-24-ao-serverless-first.md","fields":{"slug":"/blog/2019-04-24-ao-serverless-first/","keywords":["serverless","无服务器","服务器","团队","Lambda","功能","构建"]}}},{"node":{"id":"752d08d1-387a-5bde-acf3-98141baab294","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-06-20T00:00:00.000Z","title":"如何用 Serverless 为 Python 云函数打包依赖","description":"在使用无服务器云函数SCF时通常会遇到导入第三方库的问题，很多小伙伴比较头疼是：应该如何打包进去？这里，推荐几个不错的方法。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless"],"keywords":"Serverless,Serverless应用,无服务器云函数","outdated":null},"wordCount":{"words":81,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-06-20-for-python-cloud-functions.md","fields":{"slug":"/blog/2019-06-20-for-python-cloud-functions/","keywords":["java","serverless","无服务器","无服务器云函数","云函数","serverlesscloud","安装","serverless","pillowtest"]}}},{"node":{"id":"2dc78814-9d77-555b-a1bb-ad202c8ec2d1","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/cloudforecast/thumbnail.png","authors":["FrancoisLagier"],"categories":["user-stories"],"date":"2019-08-07T00:00:00.000Z","title":"Serverless：初创企业的理想选择？（CloudForecast 案例分析）","description":"CloudForecast 是 2018 年成立的一家独立初创企业，本文将介绍他们决定选择 Serverless 的原因。","authorslink":["https://serverless.com/author/francoislagier/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":211,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-07-serverless-for-startups.md","fields":{"slug":"/blog/2019-08-07-serverless-for-startups/","keywords":["serverless","云函数","serverless","函数","Serverless","utm","Framework","blog","CloudForecast","cloudforecast"]}}},{"node":{"id":"97450b07-658b-5207-8216-1c7b9b51b115","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578988490344-v2-8b2cd2c5275aa2c5a3c5083a148a7a9f_1200x500.jpg","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-09-01T00:00:00.000Z","title":"如何通过 Serverless 与自然语言处理，让搜索引擎「看」到你的博客","description":"Serverless 与自然语言处理结合的一个小应用","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["个人博客","serverless"],"keywords":"Serverless 自然语言处理","outdated":null},"wordCount":{"words":106,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-01-search-engine-blog.md","fields":{"slug":"/blog/2019-09-01-search-engine-blog/","keywords":["serverless","云函数","keywords","serverlesscloud","summary"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}}],"totalCount":64}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"0722790f-d507-53cc-8f2d-f9785a562a8e","previousBlogId":"c6f185d4-303d-5fe5-9fdd-dbd52f9a7fc1","nextBlogId":"b5efeaba-7d1a-5fec-8de9-ffb2112d5bfc","categories":["user-stories"]}}}