无服务器 Web 应用程序和事件用于数据检索和分析
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
在本教程中,您将创建一个应用程序,用于自动收集存储库的 GitHub 流量统计信息,并为流量分析奠定基础。 GitHub 仅提供对最近 14 天的流量数据的访问。 如果要分析更长时间段内的统计信息,您需要自行下载并存储这些数据。 在本教程中,您将无服务器应用程序部署在 IBM Cloud Code Engine 项目中。 应用程序管理 GitHub 存储库的元数据,并提供对数据分析统计信息的访问权。 流量数据是从应用程序中的 GitHub 随需应变或由 Code Engine 事件 (例如,每天) 触发时收集的。 本教程中讨论的应用程序使用支持单租户方式的初始功能集来实现多租户就绪解决方案。
{: caption="*
目标
- 部署一个支持多租户且访问安全的容器化 Python 数据库应用
- 将 App ID 集成为基于 OpenID Connect 的认证服务提供者
- 设置 GitHub 流量统计信息的自动无服务器收集
准备工作
本教程需要:
- IBM Cloud CLI,
- IBM Cloud Code Engine 插件,
- IBM Cloud® Container Registry 插件,
- GitHub 帐户。
您可以在 IBM® Cloud Shell 中运行需要 shell 的部分。
您将在 教程入门 指南中找到有关为您的操作环境下载和安装这些工具的指示信息。
服务和环境设置 (shell)
在此部分中,您将设置所需的服务并准备环境。 所有这些操作都可以在终端环境下完成。
-
如果您尚未登录,请使用
ibmcloud login
或ibmcloud login --sso
进行交互式登录。 -
通过运行
ibmcloud target
命令来设置资源组和区域。RESOURCE_GROUP_NAME=Default REGION=us-south ibmcloud target -r $REGION -g $RESOURCE_GROUP_NAME
-
使用免费 (精简版)计划创建IBM Db2 SaaS,并将其命名为 ghstatsDB。
ibmcloud resource service-instance-create ghstatsDB dashdb-for-transactions free $REGION
-
创建 App ID 服务实例。 使用 ghstatsAppID 作为名称,并使用累进层套餐。
ibmcloud resource service-instance-create ghstatsAppID appid graduated-tier $REGION
-
将新的名称空间 ghstats 添加到 IBM Cloud® Container Registry。 您将使用它来引用容器映像。 有一个全球登记册和区域登记册。 使用全局注册表。
ibmcloud cr region-set global NAMESPACE=ghstatsYourInitials ibmcloud cr namespace-add $NAMESPACE
Code Engine 准备 (shell)
配置服务并完成常规设置后,接下来是创建 Code Engine 项目,为应用程序创建容器映像并进行部署。
- 创建名为 ghstats 的 Code Engine 项目。 该命令会自动将其设置为当前 Code Engine 上下文。
ibmcloud ce project create --name ghstats
- 创建 Code Engine 构建配置,例如,设置项目以构建容器映像。 它从本教程的 GitHub 存储库中获取代码,并使用注册用户信息将映像存储在先前创建的名称空间中的注册表中。
ibmcloud ce build create --name ghstats-build --source https://github.com/IBM-Cloud/github-traffic-stats --context-dir /backend --commit master --image private.icr.io/$NAMESPACE/codeengine-ghstats
- 请注意,build create 命令具有创建注册表访问私钥的副作用,该私钥将允许项目编写和读取 IBM Cloud® Container Registry。
ibmcloud ce registry list
- 接下来,运行实际构建过程。
输出指示要运行的更多命令,以在构建进行时遵循其状态日志。 类似如下:ibmcloud ce buildrun submit --build ghstats-build
ibmcloud ce buildrun logs -f -n ghstats-build-run-123456-123456789
部署应用程序 (shell)
构建就绪后,您可以使用容器映像来部署应用程序,然后绑定先前供应的服务。
-
部署应用程序意味着 创建 Code Engine 应用程序 named ghstats-应用程序。 它从给定的注册表和名称空间中提取映像。
ibmcloud ce app create --name ghstats-app --image private.icr.io/$NAMESPACE/codeengine-ghstats:latest --registry-secret ce-auto-icr-private-global
应用程序部署完成后,您可以在输出中显示URL 上查看其是否可用。 应用程序未配置,因此尚不可用。 您可以使用
ibmcloud ce app list
来检查部署状态,也可以通过执行ibmcloud ce app get --name ghstats-app
来获取详细信息。默认情况下,最小缩放比例是零(0)。 这意味着如果应用程序上没有工作负载,那么 Code Engine 会将正在运行的实例减少到零。 这可节省成本,但再次从零开始扩展时需要短暂的应用程序重新启动。 您可以在创建或更新应用程序时使用参数
--min 1
来避免此情况。 -
要利用供应的服务,必须将这些服务绑定到应用程序。 首先,绑定 IBM Db2 SaaS,然后绑定 App ID:
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsDB
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsAppID
每个
application bind
都会创建以下资源和关系:- IAM Service 标识。
- 将在 IAM Service 标识中创建 IAM API 密钥。
- 资源服务密钥。 这些是在 IBM Cloud 控制台中调用的 (服务凭证 )。 尝试以下命令以显示 App ID 条目:
ibmcloud resource service-keys --instance-name ghstatsAppID
您还可以 使用私钥 或 configmap,而不是将服务绑定到应用程序。 可以使用存储在文件中的值或作为字面值传递的值来填充这些值。 私钥和相关指示信息的样本文件位于本教程的 GitHub 存储库中。
App ID 和 GitHub 配置(浏览器)
以下步骤全部使用因特网浏览器执行。 首先,配置 App ID 以使用云目录并与应用程序配合使用。 随后,创建 GitHub 访问令牌。 应用程序需要这些数据来检索流量数据。
-
在 IBM Cloud® 资源列表中,打开服务概述。 在服务部分中,找到 App ID 服务实例。 单击其条目以打开详细信息。
-
在服务仪表板中,单击左侧菜单中的管理认证。 这将显示可用身份提供者的列表,例如 Facebook、Google、SAML 2.0 Federation 和 Cloud Directory。 将 Cloud Directory 切换为已启用,并将其他所有提供者切换为已启用。
您可能需要配置多因子认证 (MFA) 和高级密码规则。 但这些内容不在本教程中讨论。
-
单击同一对话框中的认证设置选项卡。 在添加网站重定向URL中,输入您的应用程序的URL +
/redirect_uri
,例如https://ghstats-app.56ab78cd90ef.us-south.codeengine.appdomain.cloud/redirect_uri
。在本地测试应用程序时,URL 为
http://127.0.0.1:5000/redirect_uri
。 可以配置多个重定向 URL。 为了在本地测试应用程序,请将 env.local.template 复制到 .env,进行修改,然后使用python3 ghstats.py
启动应用程序。 -
在左侧的菜单中,展开 Cloud Directory,然后单击用户。 这将打开 Cloud Directory 中的用户列表。 单击创建用户按钮将您自己添加为第一个用户。 现在,您已完成配置 App ID 服务。
-
在浏览器中访问 Github.com,进入 “设置”->“开发者设置”->“个人访问令牌”。 点击按钮 “生成新令牌(经典)”。 针对 注释输入 GHStats 教程。 随后,启用 repo 类别下的 public_repo,以及 admin:org 下的 read:org。 现在,在该页面的底部,单击 Generate token。 新访问令牌会显示在下一页中。 在接下来的应用程序设置过程中,您需要它。
GitHub 访问令牌
配置并测试 Python 应用程序
准备工作完成后,可以配置并测试应用程序。 该应用程序使用流行的 Flask微框架用 Python 编写。 您可以添加存储库以进行统计信息收集或将其除去。 您可以在表格视图中或以折线图的形式访问交通数据。
-
在浏览器中,打开已部署应用程序的 URI。 您应该会看到一个欢迎页面。
欢迎屏幕 -
在浏览器中,将
/admin/initialize-app
添加到 URI 并访问该页面。 该页面用于初始化应用程序及其数据。 单击 Start initialization 按钮。 这将使您转至受密码保护的配置页面。 您用于登录的电子邮件地址会被视为系统管理员的标识。 请使用您早先配置的电子邮件地址和密码。 -
在配置页面中,输入姓名(用于问候)、GitHub 用户名和先前生成的访问令牌。 单击 Initialize。 这将创建数据库表,并插入一些配置值。 最后,它为系统管理员和租户创建数据库记录。
第一步 -
完成后,您将转至受管存储库的列表。 现在,可以通过提供 GitHub 帐户或组织的名称以及存储库的名称来添加存储库。 输入数据后,单击 Add repository。 存储库以及新分配的标识应该会显示在表中。 您可以通过输入仓库ID并点击 “删除仓库” 来从系统中删除仓库。
存储库列表 -
对于测试,单击 管理,然后单击 收集统计信息。 它根据需要检索流量数据。 然后,单击 存储库 和 每日流量。 它应该显示收集的数据。
流量数据
设置每日数据检索 (shell)
在已安装并配置应用程序的情况下,最后一部分是启动 GitHub 流量数据的每日检索。 您将 创建 cron 预订。 与 cron 作业类似,应用程序在指定的调度 (事件) 上预订事件。
-
创建 cron 订阅 ghstats-daily,每天早上 6 点(UTC 时)在路径 /collectStats 创建 POST 事件。 将 SECRET_TOKEN_AS_IDENTIFIER 替换为所选私钥值。 它用于向应用程序标识事件提供程序。
ibmcloud ce subscription cron create --name ghstats-daily --destination ghstats-app --path /collectStats --schedule '0 6 * * *' --data '{"token":"SECRET_TOKEN_AS_IDENTIFIER"}' --content-type application/json
-
要使密钥令牌知道应用程序,请 更新应用程序。 将 SECRET_TOKEN_AS_IDENTIFIER 替换为您在上一步中选取的值。
ibmcloud ce app update --name ghstats-app --registry-secret usicr --env EVENT_TOKEN=SECRET_TOKEN_AS_IDENTIFIER
这将创建新的应用程序修订版。 在应用程序中浏览到 管理,然后浏览到 系统日志时,您可以检查应用程序是否接收并处理了这些事件。
上面的命令将创建每天 UTC 上午 6 的调度。 要直接检查事件是否有效,请选择当前时间后几分钟的时间,转换为 UTC。
总结
在本教程中,您在 IBM Cloud Code Engine中部署了无服务器应用程序。 应用程序源来自 GitHub 存储库。 您指示 Code Engine 构建容器映像并将其存储在 IBM Cloud® Container Registry中。 接下来,它从那里拉来,部署为容器。 应用程序绑定到 IBM Cloud 服务。
应用程序和关联事件允许自动检索 GitHub 存储库的流量数据。 有关这些存储库的信息(包括特定于租户的访问令牌)存储在 SQL 数据库 (IBM Db2 Warehouse SaaS) 中。 Python 应用程序使用该数据库来管理用户和存储库以及显示流量统计信息。 用户可以在可搜索的表格中查看流量统计,也可以在简单的折线图中查看(见下图)。 还可以将存储库列表和流量数据下载为 CSV 文件。

安全性:轮换服务凭证
如果在生产中使用此解决方案,那么应定期轮换服务凭证。 许多安全策略要求每 90 天(或以类似频率)更改一次密码和凭证。
您可以通过取消绑定,然后重新绑定服务,来重新创建并旋转绑定到应用程序的服务凭据。 使用私钥而不是服务绑定时,您甚至有更多选项,方法是先重新创建服务密钥,然后更新私钥,最后一步更新应用程序。
除去资源
要清除用于本教程的资源,您可以删除相关项目和服务。
- 取消绑定供应的服务。 首先显示绑定,然后通过 服务绑定名称 将其删除 (以下 FIRST 和 SECOND 来自 get 输出)
ibmcloud ce application get --name ghstats-app
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-FIRST
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-SECOND
- 删除项目及其组件。
ibmcloud ce project delete --name ghstats --hard -f
- 删除服务:
ibmcloud resource service-instance-delete -f ghstatsDB
ibmcloud resource service-instance-delete -f ghstatsAppID
- 删除 Container Registry 命名空间
ibmcloud cr namespace-rm $NAMESPACE -f
- 删除 Github.com 令牌
根据资源的不同,可能不会立即将其删除,但会保留 (缺省情况下为 7 天)。 您可以通过永久删除该资源或在保留期内将其复原来回收该资源。 请参阅本文档,以了解如何 使用资源回收。
扩展教程
想要为本教程添加内容或更改本教程? 下面是一些构想:
- 扩展应用程序以实现多租户支持。
- 使用社交身份提供者。
- 将日期选取器添加到统计信息页面以过滤显示的数据。
- 将定制登录页面用于 App ID。
相关内容
下面是与本教程中涵盖的主题相关的其他信息的链接。 应用程序本身在此 GitHub 存储库中可用。
文档: