연습 - 환경 설정

완료됨

중요

이 연습을 수행하려면 사용자의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

장난감 회사의 웹 사이트 워크플로 작업을 시작하려면 먼저 환경을 구성해야 합니다. 이 단원에서는 이 모듈의 나머지 부분을 완료하도록 Azure 및 GitHub 환경을 설정해야 합니다.

목표를 달성하기 위해 다음을 수행합니다.

  • 이 모듈에 대한 GitHub 리포지토리를 설정합니다.
  • 프로젝트의 리포지토리를 컴퓨터에 복제합니다.
  • Microsoft Entra ID에서 두 개의 워크로드 ID를 만듭니다.
  • Azure에서 두 개의 리소스 그룹을 만듭니다.
  • GitHub에서 두 개의 비밀과 환경을 만듭니다.

GitHub 리포지토리 가져오기

여기서 GitHub 리포지토리가 이 모듈의 나머지 부분을 완료하도록 설정되었는지 확인합니다. 템플릿 리포지토리를 기준으로 새 리포지토리를 만들어 설정합니다. 템플릿 리포지토리에는 이 모듈을 시작하는 데 필요한 파일이 포함되어 있습니다.

이 학습 경로의 모듈은 진행 과정을 구성합니다. 학습을 위해 각 모듈에는 연결된 GitHub 템플릿 리포지토리가 있습니다.

학습 경로에서 이전 모듈을 완료했더라도 다음 지침에 따라 새 리포지토리를 만들고 새 이름을 지정하세요.

템플릿 리포지토리에서 시작

GitHub 리포지토리를 설정하는 템플릿을 실행합니다.

GitHub 사이트에서 다음 단계를 수행하여 템플릿에서 리포지토리를 만듭니다.

  1. 이 템플릿 사용>새 리포지토리 만들기를 선택합니다.

    ‘이 템플릿 사용’ 단추가 강조 표시된 템플릿 리포지토리를 보여주는 GitHub 인터페이스의 스크린샷

  2. GitHub 사용자 이름 또는 조직의 이름을 적어 둡니다. 예제에서 GitHub 사용자 이름은 mygithubuser입니다. 곧 이 이름이 필요합니다.

  3. 새 프로젝트의 이름(예: toy-website-environments)을 입력합니다.

  4. 퍼블릭 옵션을 선택합니다.

    사용자 고유의 리포지토리를 만들 때 프라이빗으로 설정할 수 있습니다. 이 모듈에서는 퍼블릭 리포지토리와 GitHub Enterprise 계정에서만 작동하는 GitHub의 일부 기능을 사용합니다.

  5. 템플릿에서 리포지토리 만들기를 선택합니다.

    리포지토리 만들기 페이지를 보여주는 GitHub 인터페이스의 스크린샷

중요

이 모듈의 마지막 연습에는 중요한 정리 단계가 포함되어 있습니다. 이 모듈을 완료하지 않더라도 정리 단계를 수행해야 합니다.

모듈을 완료하지 않고 리소스를 정리하려면 Visual Studio Code 터미널에서 다음 명령을 실행하세요.

az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait

리소스 그룹은 백그라운드에서 삭제됩니다.

Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force

리포지토리 복제

이제 사용자 계정에 템플릿 리포지토리의 복사본이 있습니다. 다음으로 작업을 시작할 수 있도록 이 리포지토리를 로컬로 복제합니다.

  1. 코드를 선택하고 복사 아이콘을 선택합니다.

    리포지토리 URL 복사 단추가 강조 표시된 새 리포지토리를 보여주는 GitHub 인터페이스의 스크린샷

  2. Visual Studio Code를 엽니다.

  3. 터미널>새 터미널을 선택하여 Visual Studio Code 터미널 창을 엽니다. 이 창은 일반적으로 화면 하단에 열립니다.

  4. 터미널에서 로컬 컴퓨터의 GitHub 리포지토리를 복제하려는 디렉터리로 이동합니다. 예를 들어 toy-website-environments 폴더에 리포지토리를 복제하려면 다음 명령을 실행합니다.

    cd toy-website-environments
    
  5. git clone을 입력한 다음 이전에 복사한 다음과 같은 URL을 붙여넣습니다.

    git clone https://github.com/mygithubuser/toy-website-environments.git
    
  6. Visual Studio Code 터미널에서 다음 명령을 실행하여 리포지토리 폴더에서 Visual Studio Code를 다시 엽니다.

    code -r toy-website-environments
    

Azure에 로그인

Azure에서 리소스 그룹을 작업하려면 Visual Studio Code 터미널에서 Azure 계정에 로그인합니다. Azure CLI 도구를 설치했는지 확인하세요.

  1. 터미널 메뉴에서 새 터미널을 선택합니다. 터미널 창은 일반적으로 화면의 아래쪽 절반에서 열립니다.

  2. 기본 셸은 일반적으로 터미널 창 오른쪽에 표시된 대로 pwsh입니다.

    pwsh가 셸 옵션으로 표시된 Visual Studio Code 터미널 창의 스크린샷.

  3. 셸 드롭다운을 선택한 다음 Azure Cloud Shell(bash)을 선택합니다.

    터미널 셸 드롭다운이 표시되고 Azure Cloud Shell(bash)이 선택된 Visual Studio Code 터미널 창의 스크린샷.

  4. 새로운 셸이 열립니다.

Azure CLI를 사용하여 Azure에 로그인

  1. Visual Studio Code 터미널에서 다음 명령을 실행하여 Azure에 로그인합니다.

    az login
    
  2. 열리는 브라우저에서 Azure 계정에 로그인합니다.

Azure에서 리소스 그룹을 작업하려면 Visual Studio Code 터미널에서 Azure 계정에 로그인합니다. Azure PowerShell을 설치했는지 확인합니다.

  1. 터미널 메뉴에서 새 터미널을 선택합니다. 터미널 창은 일반적으로 화면의 아래쪽 절반에서 열립니다.

  2. 기본 셸은 일반적으로 터미널 창 오른쪽에 표시된 대로 pwsh입니다.

    pwsh가 셸 옵션으로 표시된 Visual Studio Code 터미널 창의 스크린샷.

  3. 셸 드롭다운을 선택한 다음 Azure Cloud Shell(PowerShell)을 선택합니다.

    터미널 셸 드롭다운이 표시되고 Azure Cloud Shell(PowerShell)이 선택된 Visual Studio Code 터미널 창의 스크린샷.

  4. 새로운 셸이 열립니다.

Azure PowerShell을 사용하여 Azure에 로그인

  1. Visual Studio Code 터미널에서 다음 명령을 실행하여 Azure에 로그인합니다.

    Connect-AzAccount
    
  2. 열리는 브라우저에서 Azure 계정에 로그인합니다.

두 개의 워크로드 ID 만들기

그런 다음 Microsoft Entra ID에서 두 개의 워크로드 ID를 만듭니다. 하나는 테스트 환경용이고 다른 하나는 프로덕션 환경용입니다.

워크로드 ID를 만들기 위해 Azure CLI 명령은 jq를 사용하여 JSON 출력의 데이터를 구문 분석합니다. jq가 설치되지 않은 경우 Azure Cloud Shell에서 Bash를 사용하여 워크로드 ID, 리소스 그룹 및 역할 할당을 만들고, GitHub 비밀을 준비할 수 있습니다.

  1. 다음 코드를 실행하여 GitHub 사용자 이름 및 리포지토리 이름에 대한 변수를 정의합니다. mygithubuser를 이전 연습 단원에서 적어 둔 GitHub 사용자 이름으로 바꿔야 합니다. 또한 올바른 GitHub 리포지토리 이름을 지정했는지 확인합니다.

    githubOrganizationName='mygithubuser'
    githubRepositoryName='toy-website-environments'
    
  2. 테스트 환경에 배포하기 위한 워크로드 ID를 만듭니다. 워크로드 ID에는 두 개의 페더레이션 자격 증명이 필요합니다. 하나는 워크플로가 유효성 검사 작업을 실행할 때 사용되는데, 이 작업은 GitHub 환경과 연결되지 않기 때문입니다. 두 번째는 워크플로가 테스트 GitHub 환경에 대해 실행되는 배포 작업을 실행할 때 사용됩니다.

    testApplicationRegistrationDetails=$(az ad app create --display-name 'toy-website-environments-test')
    testApplicationRegistrationObjectId=$(echo $testApplicationRegistrationDetails | jq -r '.id')
    testApplicationRegistrationAppId=$(echo $testApplicationRegistrationDetails | jq -r '.appId')
    
    az ad app federated-credential create \
       --id $testApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-test\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:environment:Test\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
    az ad app federated-credential create \
       --id $testApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-test-branch\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:ref:refs/heads/main\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
  3. 다음 코드를 실행하여 프로덕션 환경에 대해 유사한 워크로드 ID 및 페더레이션 자격 증명을 만듭니다.

    productionApplicationRegistrationDetails=$(az ad app create --display-name 'toy-website-environments-production')
    productionApplicationRegistrationObjectId=$(echo $productionApplicationRegistrationDetails | jq -r '.id')
    productionApplicationRegistrationAppId=$(echo $productionApplicationRegistrationDetails | jq -r '.appId')
    
    az ad app federated-credential create \
       --id $productionApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-production\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:environment:Production\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
    az ad app federated-credential create \
       --id $productionApplicationRegistrationObjectId \
       --parameters "{\"name\":\"toy-website-environments-production-branch\",\"issuer\":\"https://token.actions.githubusercontent.com\",\"subject\":\"repo:${githubOrganizationName}/${githubRepositoryName}:ref:refs/heads/main\",\"audiences\":[\"api://AzureADTokenExchange\"]}"
    
  1. 다음 코드를 실행하여 GitHub 사용자 이름 및 리포지토리 이름에 대한 변수를 정의합니다. mygithubuser를 이전 연습 단원에서 적어 둔 GitHub 사용자 이름으로 바꿔야 합니다. 또한 올바른 GitHub 리포지토리 이름을 지정했는지 확인합니다.

    $githubOrganizationName = 'mygithubuser'
    $githubRepositoryName = 'toy-website-environments'
    
  2. 다음 코드를 실행하여 테스트 환경을 위한 워크로드 ID를 만들고 GitHub 리포지토리와 연결합니다.

    $testApplicationRegistration = New-AzADApplication -DisplayName 'toy-website-environments-test'
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-test' `
       -ApplicationObjectId $testApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):environment:Test"
    New-AzADAppFederatedCredential `
       -Name 'toy-website-environments-test-branch' `
       -ApplicationObjectId $testApplicationRegistration.Id `
       -Issuer 'https://token.actions.githubusercontent.com' `
       -Audience 'api://AzureADTokenExchange' `
       -Subject "repo:$($githubOrganizationName)/$($githubRepositoryName):ref:refs/heads/main"
    
  3. 다음 코드를 실행하여 프로덕션 환경에 대해 유사한 프로세스를 따릅니다.

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

Azure에서 리소스 그룹 만들기 및 워크로드 ID 액세스 권한 부여

다음으로, 각 환경에 대한 리소스 그룹을 만듭니다. 또한 이 프로세스는 워크플로가 리소스 그룹에 배포할 수 있도록 각 워크로드 ID에 리소스 그룹에 대한 기여자 역할을 부여합니다.

  1. 테스트 환경의 리소스 그룹을 만들고 워크로드 ID에 대한 액세스 권한을 부여하려면 Visual Studio Code 터미널에서 다음 Azure CLI 명령을 실행합니다.

    testResourceGroupResourceId=$(az group create --name ToyWebsiteTest --location eastus --query id --output tsv)
    
    az ad sp create --id $testApplicationRegistrationObjectId
    az role assignment create \
       --assignee $testApplicationRegistrationAppId \
       --role Contributor \
       --scope $testResourceGroupResourceId
    
  2. 유사한 프로세스를 실행하여 프로덕션 환경의 리소스 그룹을 만듭니다.

    productionResourceGroupResourceId=$(az group create --name ToyWebsiteProduction --location eastus --query id --output tsv)
    
    az ad sp create --id $productionApplicationRegistrationObjectId
    az role assignment create \
       --assignee $productionApplicationRegistrationAppId \
       --role Contributor \
       --scope $productionResourceGroupResourceId
    
  1. 테스트 환경의 리소스 그룹을 만들고 워크로드 ID에 대한 액세스 권한을 부여하려면 Visual Studio Code 터미널에서 다음 Azure PowerShell 명령을 실행합니다.

    $testResourceGroup = New-AzResourceGroup -Name ToyWebsiteTest -Location eastus
    
    New-AzADServicePrincipal -AppId $($testApplicationRegistration.AppId)
    New-AzRoleAssignment `
       -ApplicationId $($testApplicationRegistration.AppId) `
       -RoleDefinitionName Contributor `
       -Scope $($testResourceGroup.ResourceId)
    
  2. 유사한 프로세스를 실행하여 프로덕션 환경의 리소스 그룹을 만듭니다.

    $productionResourceGroup = New-AzResourceGroup -Name ToyWebsiteProduction -Location eastus
    
    New-AzADServicePrincipal -AppId $($productionApplicationRegistration.AppId)
    New-AzRoleAssignment `
       -ApplicationId $($productionApplicationRegistration.AppId) `
       -RoleDefinitionName Contributor `
       -Scope $($productionResourceGroup.ResourceId)
    

GitHub 비밀 준비

다음 코드를 실행하여 GitHub 비밀로 만드는 데 필요한 값을 표시합니다.

echo "AZURE_CLIENT_ID_TEST: $testApplicationRegistrationAppId"
echo "AZURE_CLIENT_ID_PRODUCTION: $productionApplicationRegistrationAppId"
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_TEST: $($testApplicationRegistration.AppId)"
Write-Host "AZURE_CLIENT_ID_PRODUCTION: $($productionApplicationRegistration.AppId)"
Write-Host "AZURE_TENANT_ID: $($azureContext.Tenant.Id)"
Write-Host "AZURE_SUBSCRIPTION_ID: $($azureContext.Subscription.Id)"

GitHub 비밀 만들기

두 개의 워크로드 ID와 배포할 리소스 그룹을 만들었습니다. 다음으로, GitHub Actions에서 비밀을 만듭니다.

  1. 브라우저에서 GitHub 리포지토리로 이동합니다.

  2. 설정>비밀 및 변수>작업을 선택합니다.

  3. 새 리포지토리 비밀을 선택합니다.

    ‘리포지토리 비밀 만들기’ 단추가 강조 표시되어 있으며 ‘비밀’ 페이지를 보여주는 GitHub 인터페이스의 스크린샷

  4. 비밀의 이름을 AZURE_CLIENT_ID_TEST로 지정합니다.

  5. 필드에 터미널 출력의 첫 번째 줄의 GUID를 붙여넣습니다. 값에 AZURE_CLIENT_ID_TEST, 콜론 또는 공백을 포함하지 마세요.

  6. 비밀 추가를 선택합니다.

    이름과 값이 작성되어 있고 ‘비밀 추가’ 단추가 강조 표시되어 있으며 ‘새 비밀’ 페이지를 보여주는 GitHub 인터페이스의 스크린샷

  7. 이 프로세스를 반복하여 터미널 출력의 해당 필드에서 값을 복사해 AZURE_CLIENT_ID_PRODUCTION, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID에 대한 비밀을 만듭니다.

  8. 이제 비밀 목록에 네 비밀이 모두 표시되는지 확인합니다.

    테스트 및 프로덕션 비밀을 포함하여 비밀 목록을 보여 주는 GitHub 인터페이스의 스크린샷.

GitHub에서 환경 만들기

  1. 브라우저에서 설정>환경으로 이동합니다.

  2. 새 환경을 선택합니다.

    환경 페이지와 환경을 만드는 단추를 보여 주는 GitHub 인터페이스의 스크린샷.

  3. 환경 이름으로 Test를 입력합니다.

    환경 구성 단추가 있는 Test라는 새 환경에 대한 GitHub 페이지의 스크린샷.

  4. 환경 구성을 선택합니다.

  5. 환경을 선택하여 환경 목록으로 돌아갑니다.

    환경 링크가 있는 Test라는 새 환경에 대한 GitHub 페이지의 스크린샷.

  6. 프로세스를 반복하여 Production이라는 또 다른 환경을 만듭니다.

    프로덕션 환경 구성 페이지를 열어 둡니다.

프로덕션 환경에 보호 규칙 추가

  1. 필수 검토자를 선택합니다.

  2. 사용자 또는 팀 검색 텍스트 상자에 자신의 GitHub 사용자 이름을 입력하고 자신을 선택합니다.

    완료된 세부 정보와 보호 규칙 저장 단추가 있는 필수 검토자 추가 페이지를 보여 주는 GitHub 인터페이스의 스크린샷

  3. 보호 규칙 저장을 선택합니다.

  4. 환경을 선택하여 구성을 종료합니다.