基础设施即代码。使用Ably Control API管理应用程序 GitHub行动

52 阅读8分钟

Infrastructure as Code: Manage apps using the Ably Control API GitHub Action

我很高兴地宣布Aply Control API GitHub Action!有了这个动作,你可以直接从GitHub工作流中创建Ably应用程序和API密钥,确保创建云基础设施的过程可靠且可重复。

如果你愿意,你可以观看这个详细的视频演练,了解如何使用Ably Control API GitHub Action。

管理应用程序和基础设施

随着DevOps的采用,软件开发团队开始负责管理他们的应用程序和云基础设施。开发人员现在不再把压缩文件和指令清单交给系统管理员,而是使用持续集成和交付(CI/CD)管道,一种自动化的方式来构建和部署软件。

自动化的好处包括。

  • 一个可重复的过程。
  • 减少人为错误。
  • 缩短交付周期。

源头控制

如今,CI/CD管道的定义被放在源控制中,这提供了另一个好处。管道的变化可以使用拉动请求(PR)进行审查,减少一个人意外破坏生产系统的风险。许多组织要求对生产变更采用"四眼原则",而PR则很好地促进了这一点。

基础设施即代码

自动化过程中的下一步是管理应用程序所需的云基础设施。这可能包括云服务提供商提供的平台即服务(PaaS)组件,或其他供应商提供的软件即服务(SaaS)组件。当考虑一个新的SaaS组件时,确保它提供一个管理/配置的API。否则,你可能会被困于使用一个不容易自动化的网络界面。

将你的云基础设施自动化并将其置于源控制中的过程被称为基础设施即代码(IaC),近年来已经变得非常流行(见图1)。HashiCorp的联合创始人Armon Dadgar在这个视频中对IaC做了一个很好的解释。

Infrastructure as Code: Manage apps using the Ably Control API GitHub Action

图1:随着时间的推移,基础设施即代码的兴趣

云服务提供商通常有自己的IaC格式和工具。微软有ARM和Bicep模板,AWS有CloudFormation,谷歌有Deployment Manager。然而,许多其他供应商提供的IaC工具是与云无关的,如TerraformPulumi

不管是哪种格式和工具,都需要一个运行IaC的部署管道来部署基础设施。

GitHub

迄今为止,GitHub是最受欢迎的源控制服务,它以工作流和行动的形式提供CI/CD功能。这项功能是在GitHub Universe 2018上宣布的。

工作流和行动

Github工作流定义了一个CI/CD流程,以GitHub repo内.github/workflows 文件夹中的YAML文件形式存在。该YAML文件具有以下结构。

name: GitHub Actions Demo   # Name of the workflow 
on: [push]                  # How is this workflow triggered
jobs:
  Explore-GitHub-Actions:   # Name of the job
    runs-on: ubuntu-latest  # Defines the OS for the runner
    steps:                  # A job contains one or many steps
    - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." # Run a command or script
    - name: Check out repository code
      uses: actions/checkout@v2 # Use a GitHub Action
    - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."

上面的例子是非常简单的;工作流的语法是相当广泛的--更多细节见GitHub文档

尽管你可以使用run 步骤来执行命令来创建和管理你的基础设施,例如调用 Terraform CLI,但 GitHub 有一个Marketplace,其中包含了成千上万的 Actions,可以更方便地实现基础设施的自动化。

Infrastructure as Code: Manage apps using the Ably Control API GitHub Action

图2:GitHub市场

与通用的run 步骤相比,使用Actions的好处是,Actions通常将几个命令合并成一个包,在工作流文件中很容易配置。Actions隐藏了一些复杂性,否则你就必须通过编写脚本来处理。另一方面,由于Actions通常是对现有API或CLI的包装,它们可能不具备API/CLI提供的所有功能,如果你需要更多的控制,它们可能不适合。

自定义动作

GitHub 提供了详细的信息工具来帮助创建自定义动作。

你可以建立三种类型的Action。

  • JavaScript 动作;这些动作直接在运行器上运行(Ubuntu、Windows 或 macOS)。
  • 容器行动;这些是Docker容器,你可以完全控制操作系统版本和工具/依赖。这些行动需要一些时间来建立和下载到运行器,因此启动速度比基于JavaScript的行动要慢。
  • 复合动作;这些是脚本或几个工作流程步骤,被组合成一个动作,以方便重复使用。

Ably Control API的自定义动作

对于我们的AblyFFS聊天应用程序项目,最初有一个CI/CD管道,只建立和部署承载我们聊天应用程序的静态Web应用程序。它缺少创建Ably应用程序和API密钥的环节。所以我们还没有做到完全的基础设施即代码。

幸运的是,我们最近开发了一个控制API,允许你使用REST客户端来创建和管理你的Ably应用程序。

这个控制API是在CI/CD管道中创建/管理Ably应用的理想选择。不过,我们没有直接在GitHub工作流文件中对REST端点进行cURL调用,而是做了一个Control API GitHub Action,所以每个使用Ably的人现在都可以创建应用和API密钥,作为他们CI/CD管道的一部分。

Infrastructure as Code: Manage apps using the Ably Control API GitHub Action

图3:GitHub和Ably控制API动作

Control API动作是一个基于JavaScript的动作,因为它不需要特殊的工具或依赖,也不需要通过npm安装。GitHub提供了关于如何创建JavaScript Action的详细说明。所以我们就按照这个来做。

使用Ably Control API的GitHub动作

下面的YAML例子显示了一个最小的GitHub工作流程,它使用Ably Control API Action来创建一个Ably应用和一个API密钥。

- name: Create Ably App
  id: ablyapp
  uses: ably-labs/ably-control-api-action@v0.1.4
  with:
    account-id: '${{ secrets.ABLY_ACCOUNT_ID }}'
    control-api-key: '${{ secrets.ABLY_CONTROL_API_KEY }}'
- name: Get the output
  run: |
    echo "App Name: ${{ steps.ablyapp.outputs.app-name }}"
    echo "App ID: ${{ steps.ablyapp.outputs.app-id }}"
    echo "API Key Name: ${{ steps.ablyapp.outputs.api-key-name }}"

动作输入

该行动有以下输入。

输入需要说明
account-idAbly账户ID,请看这些说明如何获得它。
control-api-key是的Ably Control的API密钥,请参阅这些说明,了解如何创建一个密钥。这个密钥需要以下权限。read:app,write:app,read:key,write:key
app-name没有要创建的Aply应用程序的名称。默认为资源库名称。
create-key一个布尔值,表示是否为新应用程序创建一个API密钥。默认为'true'
key-nameAPI密钥的友好名称。默认为'Generated API key'
key-capabilities一个用逗号分隔的列表,列出要授予新钥匙的能力。默认为'publish, subscribe'

动作输出

该动作有以下输出。

输出描述
app-name创建的Aply应用程序的名称。
app-id创建的Aply应用程序的ID。*
api-key-name创建的API密钥的名称。
api-key-id创建的API密钥的ID。*
api-key-key创建的API密钥的关键值。*

(*) 输出被标记为秘密,所以在GitHub的工作流日志中不会看到。

关于Control API Action的完整描述,请看项目的README

我们目前在FFS项目中使用该动作来创建我们的Ably应用和API密钥。该行动的输出被用来将API密钥设置为Azure静态Web应用的应用设置。

这是该Action的日志输出。

Run ably-labs/ably-control-api-action@v0.1.4
  with:
    account-id: ***
    control-api-key: ***
    app-name: fully-featured-scalable-chat
    create-key: true
    key-name: all-capabilities-1
    key-capabilities: channel-metadata, history, presence, publish, push-admin, push-subscribe, statistics, subscribe
Generating Ably Keys...
Checking credentials for account: ***
GET: https://control.ably.net/v1/accounts/***/apps returned status: 200
Listing all apps registered on account...
GET: https://control.ably.net/v1/accounts/***/apps returned status: 200
Listing API keys available for app: xv_W-A
GET: https://control.ably.net/v1/apps/xv_W-A/keys returned status: 200
Account, application and keys all exist - storing secrets...

Completed

从日志中可以看出,敏感值,如ID和密钥被标记为秘密,因此在日志中不可见。

我们喜欢你的反馈

基础设施即代码是获得可靠和可重复部署的好方法。GitHub的工作流程和行动提供了一个很好的方式来部署你的应用程序,无论它们被托管在哪里。如果GitHub市场上现有的行动都不能满足你的需求,你可以创建并发布自己的行动。这不仅有利于你,也有利于其他正在寻找类似解决方案的人。

如果你还没有尝试过Aply Control API Action,请尝试一下,如果你觉得它有用,请告诉我们。可以通过GitHub报告功能请求或问题。如果你想了解更多关于这个主题的信息,请随时在Twitter上联系我。

进一步阅读