Skip to main content

用 IaC 创建云资源

本指南只需 8 分钟即可完成,旨在展示以下内容:

  • 使用 IaC 创建资源的完整流程。
  • 从自助操作后端与 Port 进行通信的简便性。
先决条件
  • 本指南假定您已拥有 Port 账户,并已完成onboarding process 。我们将使用Onboarding过程中创建的 "服务 "蓝图。
  • 您需要一个 Git 仓库(Github、GitLab 或 Bitbucket),您可以在其中放置我们将在本指南中使用的工作流/Pipelines。如果没有,建议创建一个名为 "Port-actions "的新仓库。

本指南的目标

在本指南中,我们将在 Port 内部的 Git 仓库中打开一个拉取请求,使用 gitops 创建一个新的云资源。

完成这项工作后,你就会了解它如何使你的组织中的不同角色受益:

  • 平台工程师将能够定义强大的操作,开发人员可在受控的权限范围内使用这些操作。
  • 开发人员将能从 Port 轻松创建和跟踪云资源。

在新资源定义中添加 URL

在本指南中,我们将在 service蓝图中添加一个新属性,我们可以用它来访问我们的云资源定义。

  1. 请访问Builder
  2. 单击 "服务 "蓝图,然后单击 "新建属性"。
  3. 选择 URL 作为类型,填写如下内容,然后点击 保存:

在所有服务中,该属性暂时为空,我们将在接下来创建的操作中填充该属性 😎

设置动作的前端

  1. 前往 Port 应用程序中的Self-service tab ,点击 "+ 新操作"。
  2. Port 中的每个操作都与蓝图直接相关。我们的操作将创建一个与服务相关联的资源,并作为服务 CD 流程的一部分进行供应。
    从下拉列表中选择 "服务"。 3.此操作不会创建/删除实体,而是对现有实体执行操作。因此,我们将选择 Day-2 作为操作类型。
    像这样填写表格,然后单击 "下一步":


4.我们希望使用此操作的开发人员能指定简单的输入,而不是被 S3 存储桶的所有可用配置弄得不知所措。对于此操作,我们将定义一个名称和公共/私有可见性。
点击 "+ 新输入",像这样填写表格,然后点击 "创建":



5.现在让我们创建可见性输入,它稍后将作为我们资源的 acl
点击 "+ 新输入法",像这样填写表格,然后点击 "创建":



6.现在我们来定义动作的后端。Port 支持多种调用类型,根据您在入门流程开始时选择的 Git Providers,我们会为您选择其中一种。

在表格中填写您的 Values:

  • 用您的 Values 替换 OrganizationRepository 值(这是工作流将驻留和运行的位置)。
  • 将工作流命名为 portCreateBucket.yaml
  • 将 "忽略用户输入 "设置为 "是"。
  • 像这样填写表单的其余部分,然后单击下一步:
重要

在我们的工作流程中,有效载荷被用于为输入。 为了避免向工作流程发送额外的输入,我们省略了用户输入。


7.最后一步是自定义操作权限。为简单起见,我们将被用于默认设置。更多信息,请参阅permissions 页面。单击 "创建"。

action的前端已准备就绪 🥳

设置action的后端

现在,我们要编写我们的操作将触发的逻辑。

  1. First, let's create the necessary token and secrets. If you've already completed the scaffold a new service guide, you should already have these configured and you can skip this step.
  • 访问Github tokens page ,创建一个包含repoadmin:org范围的个人访问令牌,并将其复制(从我们的工作流中创建拉取请求需要此令牌) 。 - 访问Port application ,点击右上角的"...",然后点击 "凭据"。复制您的 客户 ID客户 secret

2.在工作流程所在的版本库中,在 "设置->secret和变量->操作 "下创建 3 个新secret:

  • ORG_ADMIN_TOKEN` - 您在上一步中创建的个人访问令牌。
  • PORT_CLIENT_ID - 从 Port 应用程序复制的客户端 ID。
  • PORT_CLIENT_SECRET` - 从 Port 应用程序复制的客户机secret。


3.现在,让我们创建包含逻辑的工作流程文件。我们的工作流程将包括 3 个步骤:

  • 在所选服务的资源库中创建模板文件副本,并用操作输入的数据替换其中的变量。
  • 在选定服务的资源库中创建拉取请求,添加新资源。
  • 向 Port 报告和记录操作结果,并使用服务资源目录的 URL 更新相关服务的 "资源定义 "属性。

.github/workflows/下创建一个名为portCreateBucket.yaml的新文件,并使用以下代码段作为其内容:

Github workflow (click to expand)
name: Create cloud resource
on:
workflow_dispatch:
inputs:
name:
type: string
visibility:
type: string
port_payload:
required: true
description: Port's payload, including details for who triggered the action and general context
type: string
jobs:
createResource:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: "${{ github.repository_owner }}/${{fromJson(inputs.port_payload).context.entity}}"
path: ./targetRepo
token: ${{ secrets.ORG_ADMIN_TOKEN }}
- name: Copy template file
run: |
mkdir -p ./targetRepo/resources
cp templates/cloudResource.tf ./targetRepo/resources/${{ inputs.name }}.tf
- name: Update new file data
run: |
sed -i 's/{{ bucket_name }}/${{ inputs.name }}/' ./targetRepo/resources/${{ inputs.name }}.tf
sed -i 's/{{ bucket_acl }}/${{ inputs.visibility }}/' ./targetRepo/resources/${{ inputs.name }}.tf
- name: Open a pull request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.ORG_ADMIN_TOKEN }}
path: ./targetRepo
commit-message: Create new resource - ${{ inputs.name }}
committer: GitHub <[email protected]>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
signoff: false
branch: new-resource-${{ inputs.name }}
delete-branch: true
title: Create new resource - ${{ inputs.name }}
body: |
Create new ${{ inputs.visibility }} resource - ${{ inputs.name }}
draft: false
create-entity-in-port-and-update-run:
runs-on: ubuntu-latest
needs: createResource
steps:
- name: UPSERT Entity
uses: port-labs/port-github-action@v1
with:
identifier: ${{fromJson(inputs.port_payload).context.entity}}
blueprint: service
properties: |-
{
"resource_definitions": "${{ github.server_url }}/${{ github.repository_owner }}/${{fromJson(inputs.port_payload).context.entity}}/blob/main/resources/"
}
clientId: ${{ secrets.PORT_CLIENT_ID }}
clientSecret: ${{ secrets.PORT_CLIENT_SECRET }}
operation: UPSERT
runId: ${{fromJson(inputs.port_payload).context.runId}}
- name: Create a log message
uses: port-labs/port-github-action@v1
with:
clientId: ${{ secrets.PORT_CLIENT_ID }}
clientSecret: ${{ secrets.PORT_CLIENT_SECRET }}
operation: PATCH_RUN
runId: ${{fromJson(inputs.port_payload).context.runId}}
logMessage: Pull request created successfully for "${{ inputs.name }}" 🚀

4.现在,我们将创建一个简单的 .tf 文件,作为新资源的模板:

  • 在源代码库(例如 port-actions)中的 /templates/(路径应为 /templates/cloudResource.tf)下创建一个名为 cloudResource.tf 的文件。
  • 复制以下代码段并粘贴到文件内容中:
cloudResource.tf (click to expand)
cloudResource.tf
resource "aws_s3_bucket" "example" {
provider = aws.bucket_region
name = "{{ bucket_name }}"
acl = "{{ bucket_acl }}"
}

完成!操作已准备就绪 🚀


执行操作

创建操作后,该操作将出现在 Port 应用程序的 "自助服务 "选项卡下:

  1. 点击 "执行"。
  2. 输入 s3 存储桶的名称并选择可见性,从列表中选择任何服务并点击 "执行"。弹出一个小窗口,点击 "查看详情":


3.该页面提供了有关操作运行的详细信息。我们可以看到,后端返回了 "成功",拉取请求已成功创建:

从 Port 访问水桶的定义

您可能已经注意到,即使我们更新了服务的 "资源定义 "URL,它仍然指向一个不存在的页面。 这是因为我们的资源库中还没有任何资源,让我们来解决这个问题:

  1. 合并拉动请求。
  2. 转到为其执行操作的服务的实体页面:


3.单击 "资源定义 "链接,访问服务资源。

全部完成!现在您可以直接从 Port 💪🏽 为您的服务创建资源了

可能的日常整合

  • 向组织中的相关人员发送松弛消息,通知新资源。
  • 向经理/开发人员发送周报/月报,显示该时间段内创建的新资源及其 Owner。

结论

开发人员门户需要支持并与 git-ops 实践无缝集成。 开发人员应能独立执行常规任务,而不必在组织内部造成瓶颈。 借助 Port,平台工程师可以为开发人员设计精确灵活的自助操作,同时与多种不同的后端集成,以满足您的特定需求。

更多相关指南和示例: