자습서: GitHub Actions를 사용하여 App Service에 배포 및 데이터베이스에 연결
Azure SQL Database 백 엔드를 사용하여 ASP.NET Core 애플리케이션을 배포하는 GitHub Actions 워크플로를 설정하는 방법을 알아봅니다. 완료되면 ASP.NET 앱이 Azure에서 실행되고 SQL Database에 연결됩니다. 먼저 ARM 템플릿을 사용하여 리소스를 만듭니다.
이 자습서에서는 컨테이너를 사용하지 않습니다. 컨테이너화된 ASP.NET Core 애플리케이션에 배포하려면 GitHub Actions를 사용하여 컨테이너에 대한 App Service에 배포 및 데이터베이스에 연결을 참조하세요.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- GitHub Actions 워크플로를 사용하여 ARM 템플릿(Azure Resource Manager 템플릿)을 통해 Azure에 리소스 추가
- GitHub Actions 워크플로를 사용하여 ASP.NET Core 애플리케이션 빌드
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
사전 요구 사항
이 자습서를 완료하려면 다음이 필요합니다.
- 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
- GitHub 계정. 없는 경우 평가판에 등록하세요.
- Resource Manager 템플릿 및 워크플로 파일을 저장하는 GitHub 리포지토리. 리포지토리를 만들려면 새 리포지토리 만들기를 참조하세요.
샘플 다운로드
Azure 샘플 리포지토리에서 샘플 프로젝트를 포크합니다.
https://github.com/Azure-Samples/dotnetcore-sqldb-ghactions
리소스 그룹 만들기
https://shell.azure.com 에서 Azure Cloud Shell을 엽니다. Azure CLI를 로컬에 설치한 경우 대신 사용할 수 있습니다. (Cloud Shell에 대한 자세한 내용은 Cloud Shell 개요를 참조하세요.)
az group create --name {resource-group-name} --location {resource-group-location}
배포 자격 증명 생성
OpenID Connect는 단기 토큰을 사용하는 인증 방법입니다. GitHub Actions로 OpenID Connect 설정은 보안 강화를 제공하는 더 복잡한 프로세스입니다.
기존 애플리케이션이 없는 경우 리소스에 액세스할 수 있는 새 Microsoft Entra ID 애플리케이션 및 서비스 주체를 등록합니다.
az ad app create --display-name myApp
이 명령은
appId
(사용자의client-id
)가 포함된 JSON을 출력합니다.id
는APPLICATION-OBJECT-ID
이며 Graph API 호출로 페더레이션된 자격 증명을 만드는 데 사용됩니다. 이 값을 저장하여, 나중에AZURE_CLIENT_ID
GitHub 비밀로 사용합니다.서비스 주체를 생성합니다.
$appID
를 JSON 출력의 appId로 대체합니다.이 명령은 서비스 주체
id
를 사용하여 JSON 출력을 생성합니다. 서비스 주체id
는 다음 단계의az role assignment create
명령에서--assignee-object-id
인수 값으로 사용됩니다.AZURE_TENANT_ID
에 대한 GitHub 비밀로 나중에 사용하려면 JSON 출력에서 appOwnerOrganizationId
를 복사합니다.az ad sp create --id $appId
서비스 주체에 대한 새로운 역할 할당을 만듭니다. 기본적으로 역할 할당은 기본 구독에 연결됩니다.
$subscriptionId
를 구독 ID로,$resourceGroupName
을 리소스 그룹 이름으로,$servicePrincipalId
를 새로 만든 서비스 주체 ID로 바꿉니다.az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id $servicePrincipalId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
다음 명령을 실행하여 Microsoft Entra ID 애플리케이션에 대한 새 페더레이션된 ID 자격 증명을 만듭니다.
APPLICATION-OBJECT-ID
를 Microsoft Entra ID 애플리케이션의 objectId(앱 만들기 중에 생성됨)로 바꿉니다.CREDENTIAL-NAME
의 값을 나중에 참조하도록 설정합니다.subject
를 설정합니다. 이 값은 워크플로에 따라 GitHub에 의해 정의됩니다.- GitHub Actions 환경의 작업:
repo:< Organization/Repository >:environment:< Name >
- 환경에 연결되지 않은 작업의 경우 워크플로를 트리거하는 데 사용되는 참조 경로를 기반으로 분기/태그에 대한 참조 경로(
repo:< Organization/Repository >:ref:< ref path>
)를 포함합니다. 예를 들어repo:n-username/ node_express:ref:refs/heads/my-branch
또는repo:n-username/ node_express:ref:refs/tags/my-tag
입니다. - 끌어오기 요청 이벤트에 의해 트리거된 워크플로의 경우:
repo:< Organization/Repository >:pull_request
- GitHub Actions 환경의 작업:
az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json ("credential.json" contains the following content) { "name": "<CREDENTIAL-NAME>", "issuer": "https://token.actions.githubusercontent.com", "subject": "repo:octo-org/octo-repo:environment:Production", "description": "Testing", "audiences": [ "api://AzureADTokenExchange" ] }
Azure Portal에서 Active Directory 애플리케이션, 서비스 주체 및 페더레이션 자격 증명을 만드는 방법을 알아보려면 GitHub 및 Azure 연결을 참조하세요.
인증을 위한 GitHub 비밀 구성
로그인 작업에 애플리케이션의 클라이언트 ID, 테넌트 ID 및 구독 ID를 제공해야 합니다. 이러한 값은 워크플로에서 직접 제공하거나 GitHub 비밀에 저장하고 워크플로에서 참조할 수 있습니다. 값을 GitHub 비밀로 저장하는 것이 더 안전한 옵션입니다.
GitHub에서 리포지토리로 이동합니다.
탐색 메뉴에서 설정으로 이동합니다.
보안 > 비밀 및 변수 > 작업을 선택합니다.
새 리포지토리 비밀을 선택합니다.
AZURE_CLIENT_ID
,AZURE_TENANT_ID
및AZURE_SUBSCRIPTION_ID
에 대한 비밀을 만듭니다. GitHub 비밀에 대해 Microsoft Entra 애플리케이션의 다음 값을 사용합니다.GitHub 비밀 Microsoft Entra 애플리케이션 AZURE_CLIENT_ID 애플리케이션(클라이언트) ID AZURE_TENANT_ID 디렉터리(테넌트) ID AZURE_SUBSCRIPTION_ID 구독 ID 비밀 추가를 선택하여 각 비밀을 저장합니다.
빌드에 GitHub 비밀 추가
SQLADMIN_PASS
및SQLADMIN_LOGIN
에 대한 GitHub 리포지토리에 두 개의 새 비밀을 만듭니다. 복잡한 암호를 선택해야 합니다. 그렇지 않으면 SQL 데이터베이스 서버에 대한 만들기 단계가 실패합니다. 이 암호에 다시 액세스할 수 없으므로 별도로 저장해야 합니다.Azure 구독 ID에 대한
AZURE_SUBSCRIPTION_ID
비밀을 만듭니다. 구독 ID를 모르는 경우 Azure Shell에서 이 명령을 사용하여 찾을 수 있습니다.SubscriptionId
열의 값을 복사합니다.az account list -o table
Azure 리소스 만들기
Azure 리소스 만들기 워크플로는 ARM 템플릿을 실행하여 Azure에 리소스를 배포합니다. 워크플로는 다음을 수행합니다.
- 체크 아웃 작업을 사용하여 소스 코드를 체크 아웃합니다.
- Azure 로그인 작업을 사용하여 Azure에 로그인하고 환경 및 Azure 리소스 정보를 수집합니다.
- Azure Resource Manager 배포 작업을 사용하여 리소스를 배포합니다.
Azure 리소스 만들기 워크플로를 실행하려면 다음을 수행합니다.
리포지토리 내
.github/workflows
에서infraworkflow.yml
파일을 엽니다.AZURE_RESOURCE_GROUP
값을 리소스 그룹 이름으로 업데이트합니다.ARM 배포 작업에서
region
에 대한 입력을 해당 지역으로 설정합니다.templates/azuredeploy.resourcegroup.parameters.json
을 열고 해당 지역으로rgLocation
속성을 업데이트합니다.
작업 으로 이동하여 워크플로 실행을 선택합니다.
작업 페이지에서 녹색 확인 표시를 확인하여 작업이 성공적으로 실행되었는지 확인합니다.
리소스를 만든 후 Actions로 이동하여 Azure 리소스 만들기를 선택하고 워크플로를 사용하지 않도록 설정합니다.
게시 프로필 비밀 만들기
Azure Portal에서
Create Azure Resources
워크플로를 사용하여 만든 새 스테이징 App Service(슬롯)를 엽니다.게시 프로필 가져오기를 선택합니다.
텍스트 편집기에서 게시 프로필 파일을 열고 해당 내용을 복사합니다.
AZURE_WEBAPP_PUBLISH_PROFILE
에 대한 새 GitHub 비밀을 만듭니다.
앱 빌드 및 배포
빌드 및 배포 워크플로를 실행하려면 다음을 수행합니다.
리포지토리 내
.github/workflows
에서workflow.yaml
파일을 엽니다.AZURE_RESOURCE_GROUP
,AZURE_WEBAPP_NAME
,SQLSERVER_NAME
및DATABASE_NAME
에 대한 환경 변수가infraworkflow.yml
의 환경 변수와 일치하는지 확인합니다.프로덕션 슬롯으로 교환 출력의 URL을 방문하여 앱이 배포되었는지 확인합니다. 샘플 앱인 내 TodoList 앱이 표시되어야 합니다.
리소스 정리
샘플 프로젝트가 더 이상 필요하지 않은 경우 Azure Portal에서 리소스 그룹을 삭제하고 GitHub에서 리포지토리를 삭제합니다.