练习 - 创建工作负载标识

已完成

在使用工作流部署你所在玩具公司的网站之前,你需要使你的工作流能够向 Azure 进行身份验证。 通过学习本练习,你将能够:

  • 为网站创建一个资源组。
  • 创建 Microsoft Entra 工作负载 ID 并向其授予对资源组的访问权限。
  • 创建 GitHub 机密以准备工作流来使用工作负载标识。

完成此练习需要具有在 Microsoft Entra 目录中创建应用程序的权限。 如果你当前的 Azure 帐户无法满足此要求,可获取免费试用版,并创建新的 Azure 订阅和租户。

重要

本模块的最后一个练习包含重要的清理步骤。 即使未完成此模块,也务必要按照清理步骤操作。

登录 Azure

若要使用 Azure 中的工作负载标识,请从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure CLI 工具。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

    默认 shell 通常是 pwsh,如终端窗口右侧所示。

    Visual Studio Code 终端窗口的屏幕截图,其中 pwsh 显示为 shell 选项。

  2. 选择“启动配置文件”下拉列表,然后选择“Azure Cloud Shell (Bash)”。

    Visual Studio Code 终端窗口的屏幕截图。显示终端 shell 下拉列表和 Azure Cloud Shell (Bash) 菜单项。

    此时会打开新的 shell。

使用 Azure CLI 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令以登录到 Azure:

    az login
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

若要将此模板部署到 Azure,需要从 Visual Studio Code 终端登录到 Azure 帐户。 请确保已安装 Azure PowerShell,并且登录到激活沙盒所用的帐户。

  1. 在“终端”菜单中,选择“新终端”。 终端窗口通常在屏幕的下半部分打开。

    默认 shell 通常是 pwsh,如终端窗口右侧所示。

    Visual Studio Code 终端窗口的屏幕截图,其中 pwsh 显示为 shell 选项。

  2. 选择“启动配置文件”下拉列表,然后选择“Azure Cloud Shell (PowerShell)”。

    Visual Studio Code 终端窗口的屏幕截图。显示终端 shell 下拉列表和 Azure Cloud Shell (PowerShell) 菜单项。

    此时会打开新的 shell。

使用 Azure PowerShell 登录到 Azure

  1. 在 Visual Studio Code 终端中,运行以下命令以登录到 Azure:

    Connect-AzAccount
    
  2. 在打开的浏览器中,登录到 Azure 帐户。

创建工作负载标识

提示

在本模块中,你将创建一个工作负载标识供工作流使用。 使用工作负载标识对 Azure 部署工作流进行身份验证模块提供了对工作负载标识的更详细说明,包括它们的工作方式,以及如何创建它们、为其分配角色和管理它们。

要创建工作负载标识,Azure CLI 命令使用 jq 从 JSON 输出分析数据。 如果还没有安装 jq,可以使用 Azure Cloud Shell 中的 Bash 创建工作负载标识、资源组和角色分配,并准备 GitHub 机密。

  1. 运行以下代码,为 GitHub 用户名和存储库名称定义变量。 确保将 mygithubuser 替换为你的 GitHub 用户名,在前面的练习单元中指出了这一点。

    githubOrganizationName='mygithubuser'
    githubRepositoryName='toy-website-workflow'
    
  2. 运行以下代码,该代码创建工作负载标识并将其与 GitHub 存储库相关联:

    applicationRegistrationDetails=$(az ad app create --display-name 'toy-website-workflow')
    applicationRegistrationObjectId=$(echo $applicationRegistrationDetails | jq -r '.id')
    applicationRegistrationAppId=$(echo $applicationRegistrationDetails | jq -r '.appId')
    
    az ad app federated-credential create \
       --id $applicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-workflow\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:ref:refs/heads/main\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
  1. 运行以下代码,为 GitHub 用户名和存储库名称定义变量。 确保将 mygithubuser 替换为你的 GitHub 用户名,在前面的练习单元中指出了这一点。

    $githubOrganizationName = 'mygithubuser'
    $githubRepositoryName = 'toy-website-workflow'
    
  2. 运行以下代码,该代码创建工作负载标识并将其与 GitHub 存储库相关联:

    $applicationRegistration = New-AzADApplication -DisplayName 'toy-website-workflow'
    
    New-AzADAppFederatedCredential `
       -Name 'toy-website-workflow' `
       -ApplicationObjectId $applicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):ref:refs/heads/main"
    

在 Azure 中创建资源组并授予工作负载标识访问权限

若要创建新资源组并向其授予工作负载标识访问权限,请在 Visual Studio Code 终端中运行此 Azure CLI 命令:

resourceGroupResourceId=$(az group create --name ToyWebsite --location westus3 --query id --output tsv)

az ad sp create --id $applicationRegistrationObjectId
az role assignment create \
   --assignee $applicationRegistrationAppId \
   --role Contributor \
   --scope $resourceGroupResourceId

若要创建资源组并向其授予工作负载标识访问权限,请在 Visual Studio Code 终端中运行此 Azure PowerShell 命令:

$resourceGroup = New-AzResourceGroup -Name ToyWebsite -Location westus3

New-AzADServicePrincipal -AppId $applicationRegistration.AppId
New-AzRoleAssignment `
   -ApplicationId $($applicationRegistration.AppId) `
   -RoleDefinitionName Contributor `
   -Scope $resourceGroup.ResourceId

准备 GitHub 机密

运行以下代码以显示创建为 GitHub 机密所需的值:

echo "AZURE_CLIENT_ID: $applicationRegistrationAppId"
echo "AZURE_TENANT_ID: $(az account show --query tenantId --output tsv)"
echo "AZURE_SUBSCRIPTION_ID: $(az account show --query id --output tsv)"
$azureContext = Get-AzContext
Write-Host "AZURE_CLIENT_ID: $($applicationRegistration.AppId)"
Write-Host "AZURE_TENANT_ID: $($azureContext.Tenant.Id)"
Write-Host "AZURE_SUBSCRIPTION_ID: $($azureContext.Subscription.Id)"

创建 GitHub 机密

你已创建资源组和工作负载标识。 接下来,在 GitHub Actions 中创建一些机密,以便工作流可以使用工作负载标识登录。

  1. 在浏览器中,导航到 GitHub 存储库。

  2. 选择“设置”>“机密和变量”>“操作”。

  3. 选择“新建存储库机密”。

    GitHub 界面的屏幕截图,其中显示了“机密”页,并突出显示了“创建存储库机密”按钮。

  4. 将机密命名为 AZURE_CLIENT_ID。

  5. 在“值”字段中,粘贴终端输出第一行中的 GUID。 不要在值中包含 AZURE_CLIENT_ID、冒号或任何空格。

  6. 选择“添加机密”。

    GitHub 界面的屏幕截图,其中显示了“新建机密”页,填写了名称和值,并突出显示了“添加机密”按钮。

  7. 重复此过程,为 AZURE_TENANT_ID 和 AZURE_SUBSCRIPTION_ID 创建机密,从终端输出中的相应字段复制值。

  8. 验证机密列表现在是否显示所有三个机密。

    GitHub 界面的屏幕截图,其中显示了机密列表。