다음을 통해 공유


자습서: 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 샘플 리포지토리에서 샘플 프로젝트를 포크합니다.

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 설정은 보안 강화를 제공하는 더 복잡한 프로세스입니다.

  1. 기존 애플리케이션이 없는 경우 리소스에 액세스할 수 있는 새 Microsoft Entra ID 애플리케이션 및 서비스 주체를 등록합니다.

    az ad app create --display-name myApp
    

    이 명령은 appId(사용자의 client-id)가 포함된 JSON을 출력합니다. idAPPLICATION-OBJECT-ID이며 Graph API 호출로 페더레이션된 자격 증명을 만드는 데 사용됩니다. 이 값을 저장하여, 나중에 AZURE_CLIENT_ID GitHub 비밀로 사용합니다.

  2. 서비스 주체를 생성합니다. $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
    
  3. 서비스 주체에 대한 새로운 역할 할당을 만듭니다. 기본적으로 역할 할당은 기본 구독에 연결됩니다. $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
    
  4. 다음 명령을 실행하여 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
    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 비밀로 저장하는 것이 더 안전한 옵션입니다.

  1. GitHub에서 리포지토리로 이동합니다.

  2. 탐색 메뉴에서 설정으로 이동합니다.

  3. 보안 > 비밀 및 변수 > 작업을 선택합니다.

    비밀 추가 스크린샷

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

  5. AZURE_CLIENT_ID, AZURE_TENANT_IDAZURE_SUBSCRIPTION_ID에 대한 비밀을 만듭니다. GitHub 비밀에 대해 Microsoft Entra 애플리케이션의 다음 값을 사용합니다.

    GitHub 비밀 Microsoft Entra 애플리케이션
    AZURE_CLIENT_ID 애플리케이션(클라이언트) ID
    AZURE_TENANT_ID 디렉터리(테넌트) ID
    AZURE_SUBSCRIPTION_ID 구독 ID
  6. 비밀 추가를 선택하여 각 비밀을 저장합니다.

빌드에 GitHub 비밀 추가

  1. SQLADMIN_PASSSQLADMIN_LOGIN에 대한 GitHub 리포지토리에 두 개의 새 비밀을 만듭니다. 복잡한 암호를 선택해야 합니다. 그렇지 않으면 SQL 데이터베이스 서버에 대한 만들기 단계가 실패합니다. 이 암호에 다시 액세스할 수 없으므로 별도로 저장해야 합니다.

  2. Azure 구독 ID에 대한 AZURE_SUBSCRIPTION_ID 비밀을 만듭니다. 구독 ID를 모르는 경우 Azure Shell에서 이 명령을 사용하여 찾을 수 있습니다. SubscriptionId 열의 값을 복사합니다.

    az account list -o table
    

Azure 리소스 만들기

Azure 리소스 만들기 워크플로는 ARM 템플릿을 실행하여 Azure에 리소스를 배포합니다. 워크플로는 다음을 수행합니다.

Azure 리소스 만들기 워크플로를 실행하려면 다음을 수행합니다.

  1. 리포지토리 내 .github/workflows에서 infraworkflow.yml 파일을 엽니다.

  2. AZURE_RESOURCE_GROUP 값을 리소스 그룹 이름으로 업데이트합니다.

  3. ARM 배포 작업에서 region에 대한 입력을 해당 지역으로 설정합니다.

    1. templates/azuredeploy.resourcegroup.parameters.json을 열고 해당 지역으로 rgLocation 속성을 업데이트합니다.
  4. 작업 으로 이동하여 워크플로 실행을 선택합니다.

    GitHub Actions 워크플로를 실행하여 리소스를 추가하세요.

  5. 작업 페이지에서 녹색 확인 표시를 확인하여 작업이 성공적으로 실행되었는지 확인합니다.

    리소스 만들기를 실행했습니다.

  6. 리소스를 만든 후 Actions로 이동하여 Azure 리소스 만들기를 선택하고 워크플로를 사용하지 않도록 설정합니다.

    Azure 리소스 만들기 워크플로를 비활성화합니다.

게시 프로필 비밀 만들기

  1. Azure Portal에서 Create Azure Resources 워크플로를 사용하여 만든 새 스테이징 App Service(슬롯)를 엽니다.

  2. 게시 프로필 가져오기를 선택합니다.

  3. 텍스트 편집기에서 게시 프로필 파일을 열고 해당 내용을 복사합니다.

  4. AZURE_WEBAPP_PUBLISH_PROFILE에 대한 새 GitHub 비밀을 만듭니다.

앱 빌드 및 배포

빌드 및 배포 워크플로를 실행하려면 다음을 수행합니다.

  1. 리포지토리 내 .github/workflows에서 workflow.yaml 파일을 엽니다.

  2. AZURE_RESOURCE_GROUP, AZURE_WEBAPP_NAME, SQLSERVER_NAMEDATABASE_NAME에 대한 환경 변수가 infraworkflow.yml의 환경 변수와 일치하는지 확인합니다.

  3. 프로덕션 슬롯으로 교환 출력의 URL을 방문하여 앱이 배포되었는지 확인합니다. 샘플 앱인 내 TodoList 앱이 표시되어야 합니다.

리소스 정리

샘플 프로젝트가 더 이상 필요하지 않은 경우 Azure Portal에서 리소스 그룹을 삭제하고 GitHub에서 리포지토리를 삭제합니다.

다음 단계