빠른 시작: GitHub Actions를 사용하여 Bicep 파일 배포
GitHub Actions는 소프트웨어 개발 워크플로를 자동화하는 GitHub의 기능 모음입니다. 이 빠른 시작에서는 Azure Resource Manager 배포를 위한 GitHub Actions를 사용하여 Azure에 Bicep 파일 배포를 자동화합니다.
GitHub Actions 및 Bicep 파일에 대한 간략한 소개를 제공합니다. GitHub Actions 및 프로젝트 설정에 대한 자세한 단계는 Bicep 및 GitHub Actions를 사용하여 Azure 리소스 배포를 참조하세요.
필수 조건
- 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
- GitHub 계정. 없는 경우 평가판에 등록하세요.
- Bicep 파일과 워크플로 파일을 저장하는 GitHub 리포지토리입니다. 리포지토리를 만들려면 새 리포지토리 만들기를 참조하세요.
리소스 그룹 만들기
리소스 그룹을 만듭니다. 이 빠른 시작의 뒷부분에서 Bicep 파일을 이 리소스 그룹에 배포합니다.
az group create -n exampleRG -l westus
배포 자격 증명 생성
OIDC에서 Azure 로그인 작업을 사용하려면 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID에서 페더레이션 ID 자격 증명을 구성해야 합니다.
옵션 1: Microsoft Entra 애플리케이션
- Azure Portal, Azure CLI 또는 Azure PowerShell에서 서비스 주체를 사용하여 Microsoft Entra 애플리케이션을 만듭니다.
- 클라이언트 ID, 구독 ID 및 디렉터리(테넌트) ID의 값을 복사하여 나중에 GitHub Actions 워크플로에서 사용합니다.
- Azure Portal, Azure CLI 또는 Azure PowerShell을 통해 서비스 주체에 적절한 역할을 할당합니다.
- GitHub Actions에서 발급한 토큰을 GitHub 리포지토리에 신뢰하도록 Microsoft Entra 애플리케이션 에서 페더레이션 ID 자격 증명을 구성합니다.
옵션 2: 사용자 할당 관리 ID
- 사용자 할당 관리 ID 만들기의 지침에 따라 만듭니다.
- 클라이언트 ID, 구독 ID 및 디렉터리(테넌트) ID의 값을 복사하여 나중에 GitHub Actions 워크플로에서 사용합니다.
- 사용자 할당 관리 ID에 적절한 역할을 할당합니다.
- GitHub Actions에서 발급한 토큰을 GitHub 리포지토리에 신뢰하도록 사용자 할당 관리 ID에서 페더레이션 ID 자격 증명을 구성합니다.
GitHub 비밀 구성
로그인 작업에 애플리케이션의 클라이언트 ID, 디렉터리(테넌트) ID 및 구독 ID 를 제공해야 합니다. 이러한 값은 워크플로에서 직접 제공하거나 GitHub 비밀에 저장하고 워크플로에서 참조할 수 있습니다. 값을 GitHub 비밀로 저장하는 것이 더 안전한 옵션입니다.
GitHub에서 리포지토리로 이동합니다.
보안 > 비밀 및 변수 > 작업을 선택합니다.
새 리포지토리 비밀을 선택합니다.
참고 항목
공용 리포지토리에서 워크플로 보안을 강화하려면 리포지토리 비밀 대신 환경 비밀을 사용합니다. 환경에 승인이 필요한 경우 필수 검토자 중 한 명이 승인할 때까지 작업에서 환경 비밀에 액세스할 수 없습니다.
AZURE_CLIENT_ID
,AZURE_TENANT_ID
및AZURE_SUBSCRIPTION_ID
에 대한 비밀을 만듭니다. GitHub 비밀에 대한 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID에서 다음 값을 복사합니다.GitHub 비밀 Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID AZURE_CLIENT_ID 클라이언트 ID AZURE_SUBSCRIPTION_ID 구독 ID AZURE_TENANT_ID 디렉터리(테넌트) ID 참고 항목
보안상의 이유로 워크플로에 직접 값을 전달하는 대신 GitHub 비밀을 사용하는 것이 좋습니다.
Bicep 파일 추가
GitHub 리포지토리에 Bicep 파일을 추가합니다. 다음 Bicep 파일은 저장소 계정을 만듭니다.
@minLength(3)
@maxLength(11)
param storagePrefix string
@allowed([
'Standard_LRS'
'Standard_GRS'
'Standard_RAGRS'
'Standard_ZRS'
'Premium_LRS'
'Premium_ZRS'
'Standard_GZRS'
'Standard_RAGZRS'
])
param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
output storageEndpoint object = stg.properties.primaryEndpoints
Bicep 파일에는 3~11자의 storagePrefix라는 매개 변수 하나가 필요합니다.
파일을 리포지토리의 어디에나 배치할 수 있습니다. 다음 섹션의 워크플로 샘플에서는 Bicep 파일의 이름이 main.bicep이고 리포지토리의 루트에 저장되어 있다고 가정합니다.
워크플로 만들기
워크플로는 트리거될 때 실행할 단계를 정의합니다. 리포지토리의 .github/workflows/ 경로에 있는 YAML(.yml) 파일입니다. 워크플로 파일 확장명은 .yml 또는 .yaml일 수 있습니다.
워크플로를 만들려면 다음 단계를 따르세요.
GitHub 리포지토리의 상단 메뉴에서 작업을 선택합니다.
새 워크플로를 선택합니다.
워크플로 직접 설정을 선택합니다.
main.yml이 아닌 다른 이름을 선호하는 경우 워크플로 파일의 이름을 바꿉니다. 예: deployBicepFile.yml
yml 파일의 내용을 다음 코드로 바꿉니다.
on: [push] name: Azure ARM permissions: id-token: write contents: read jobs: build-and-deploy: runs-on: ubuntu-latest steps: # Checkout code - uses: actions/checkout@main # Log into Azure - uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} # Deploy Bicep file - name: deploy uses: azure/arm-deploy@v1 with: subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION }} resourceGroupName: ${{ secrets.AZURE_RG }} template: ./main.bicep parameters: 'storagePrefix=mystore storageSKU=Standard_LRS' failOnStdErr: false
변경 내용 커밋을 선택합니다.
기본 분기에 직접 커밋을 선택합니다.
새 파일 커밋(또는 변경 내용 커밋)을 선택합니다.
워크플로 파일이나 Bicep 파일을 업데이트하면 워크플로가 트리거됩니다. 워크플로는 변경 내용을 커밋한 직후에 시작됩니다.
워크플로 상태 확인
- 작업 탭을 선택합니다. deployBicepFile.yml 만들기 워크플로가 나열됩니다. 워크플로를 실행하는 데 1-2분이 소요됩니다.
- 워크플로를 선택하여 열고
Status
가Success
인지 확인합니다.
리소스 정리
리소스 그룹 및 리포지토리가 더 이상 필요하지 않은 경우 리소스 그룹과 GitHub 리포지토리를 삭제하여 배포한 리소스를 정리합니다.
az group delete --name exampleRG