자습서: 관리 ID를 사용하여 Azure Spring Apps 앱에서 Azure Functions 호출

참고 항목

Azure Spring Apps는 Azure Spring Cloud 서비스의 새 이름입니다. 서비스에 새 이름이 지정되었지만, 자산을 업데이트하는 동안 스크린샷, 비디오, 다이어그램과 같은 일부 위치에서는 당분간 이전 이름이 표시됩니다.

이 문서의 적용 대상: ✔️ 기본/표준 ✔️ 엔터프라이즈

이 문서에서는 Azure Spring Apps에서 호스트되는 앱에 대한 관리 ID를 만들고, 이를 사용하여 HTTP 트리거 함수를 호출하는 방법을 보여줍니다.

Azure Functions와 App Services는 모두 Microsoft Entra 인증을 기본적으로 지원합니다. Azure Spring Apps용 관리 ID와 함께 이 기본 제공 인증 기능을 사용하면 최신 OAuth 의미 체계를 사용하여 RESTful 서비스를 호출할 수 있습니다. 이 방법을 사용하면 비밀을 코드에 저장할 필요가 없으며 외부 리소스에 대한 액세스를 더 세부적으로 제어할 수 있습니다.

필수 구성 요소

리소스 그룹 만들기

리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. 다음 명령을 사용하여 함수 앱을 포함할 리소스 그룹을 만듭니다.

az group create --name <resource-group-name> --location <location>

자세한 내용은 az group create 명령을 참조하세요.

함수 앱 만들기

함수 앱을 만들려면 먼저 백업 스토리지 계정을 만들어야 합니다. az storage account create 명령을 사용할 수 있습니다.

Important

각 함수 앱 및 스토리지 계정에는 고유한 이름이 있어야 합니다.

다음 명령을 사용하여 스토리지 계정을 만듭니다. <‘function-app-name’>을 함수 앱의 이름으로 바꾸고 <‘storage-account-name’>을 스토리지 계정의 이름으로 바꿉니다.

az storage account create \
    --resource-group <resource-group-name> \
    --name <storage-account-name> \
    --location <location> \
    --sku Standard_LRS

스토리지 계정을 만든 후 다음 명령을 사용하여 함수 앱을 만듭니다.

az functionapp create \
    --resource-group <resource-group-name> \
    --name <function-app-name> \
    --consumption-plan-location <location> \
    --os-type windows \
    --runtime node \
    --storage-account <storage-account-name> \
    --functions-version 4

반환된 hostNames 값(https://<your-functionapp-name>.azurewebsites.net 형식)을 기록해 둡니다. 함수 앱의 루트 URL에서 이 값을 사용하여 함수 앱을 테스트합니다.

Microsoft Entra 인증 사용

다음 단계를 사용하여 Microsoft Entra 인증이 함수 앱에 액세스할 수 있도록 설정합니다.

  1. Azure Portal에서 리소스 그룹으로 이동한 다음, 만든 함수 앱을 엽니다.

  2. 탐색 창에서 인증을 선택한 다음, 기본 창에서 ID 공급자 추가를 선택합니다.

  3. ID 공급자 추가 페이지의 ID 공급자 드롭다운 메뉴에서 Microsoft를 선택합니다.

    Screenshot of the Azure portal showing the Add an identity provider page with Microsoft highlighted in the identity provider dropdown menu.

  4. 추가를 선택합니다.

  5. ID 공급자 추가 페이지의 기본 사항 설정에서 지원되는 계정 유형Microsoft Entra 디렉터리 - 다중 테넌트로 설정합니다.

  6. 인증되지 않은 요청HTTP 401 권한 없음: API에 권장됨으로 설정합니다. 이 설정을 사용하면 인증되지 않은 모든 요청이 거부됩니다(401 응답).

    Screenshot of the Azure portal showing the Add an identity provider page with Support account types and Unauthenticated requests highlighted.

  7. 추가를 선택합니다.

설정을 추가하면 함수 앱이 다시 시작되고 모든 후속 요청에서 Microsoft Entra ID를 통해 로그인하라는 메시지가 표시됩니다. 인증되지 않은 요청이 현재 함수 앱의 루트 URL(az functionapp create 명령의 hostNames 출력에서 반환됨)을 사용하여 거부되고 있는지 테스트할 수 있습니다. 그러면 조직의 Microsoft Entra 로그인 화면으로 리디렉션되어야 합니다.

나중에 사용하기 위해 애플리케이션 ID와 애플리케이션 ID URI가 필요합니다. Azure Portal에서 앞서 만든 함수 앱으로 이동합니다.

애플리케이션 ID를 가져오려면 탐색 창에서 인증을 선택한 다음, 함수 앱의 이름이 포함된 ID 공급자에 대한 앱(클라이언트) ID 값을 복사합니다.

Screenshot of the Azure portal showing the Authentication page for a Function app, with the Function app name highlighted in the Identity provider.

애플리케이션 ID URI를 가져오려면 탐색 창에서 API 노출을 선택한 다음, 애플리케이션 ID URI 값을 복사합니다.

Screenshot of the Azure portal showing the Expose an API page for a Function app with the Application ID URI highlighted.

HTTP 트리거 함수 만들기

빈 로컬 디렉터리에서 다음 명령을 사용하여 새 함수 앱을 만들고 HTTP 트리거 함수를 추가합니다.

func init --worker-runtime node
func new --template HttpTrigger --name HttpTrigger

기본적으로 함수는 키 기반 인증을 사용하여 HTTP 엔드포인트를 보호합니다. Microsoft Entra 인증을 사용하여 함수에 대한 액세스를 보호하려면 다음 예제와 같이 ‘function.json’ 파일에서 anonymousauthLevel 키를 설정합니다.

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      ...
    }
  ]
}

자세한 내용은 Azure Functions HTTP 트리거프로덕션에서 HTTP 엔드포인트 보호 섹션을 참조하세요.

다음 명령을 사용하여 이전 단계에서 만든 인스턴스에 앱을 게시합니다.

func azure functionapp publish <function-app-name>

게시 명령의 출력은 다음 출력과 같이 새로 만든 함수에 대한 URL을 나열합니다.

Deployment completed successfully.
Syncing triggers...
Functions in <your-functionapp-name>:
    HttpTrigger - [httpTrigger]
        Invoke url: https://<function-app-name>.azurewebsites.net/api/httptrigger

Azure Spring Apps 서비스 인스턴스 및 애플리케이션 만들기

다음 명령을 사용하여 Spring 확장을 추가하고 Azure Spring Apps의 새 인스턴스를 만듭니다.

az extension add --upgrade --name spring
az spring create \
    --resource-group <resource-group-name> \
    --name <Azure-Spring-Apps-instance-name> \
    --location <location>

다음 명령을 사용하여 --assign-identity 매개 변수에서 요청한 대로 시스템 할당 관리 ID를 사용하여 msiapp이라는 애플리케이션을 만듭니다.

az spring app create \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --name "msiapp" \
    --assign-endpoint true \
    --assign-identity

함수를 호출하는 Spring Boot 앱 샘플 빌드

이 샘플은 먼저 MSI 엔드포인트에 액세스 토큰을 요청하고 해당 토큰을 사용하여 함수 HTTP 요청을 인증함으로써 HTTP 트리거 함수를 호출합니다. 자세한 내용은 Azure VM에서 Azure 리소스에 대한 관리 ID를 사용하여 액세스 토큰을 획득하는 방법HTTP를 사용하여 토큰 가져오기 섹션을 참조하세요.

  1. 다음 명령을 사용하여 샘플 프로젝트를 복제합니다.

    git clone https://github.com/Azure-Samples/azure-spring-apps-samples.git
    
  2. 다음 명령을 사용하여 앱 속성에서 함수 URI 및 트리거 이름을 지정합니다.

    cd azure-spring-apps-samples/managed-identity-function
    vim src/main/resources/application.properties
    
  3. Azure Spring Apps 앱에 관리 ID를 사용하려면 이러한 값과 함께 다음 속성을 ‘src/main/resources/application.properties’에 추가합니다.

    azure.function.uri=https://<function-app-name>.azurewebsites.net
    azure.function.triggerPath=httptrigger
    azure.function.application-id.uri=<function-app-application-ID-uri>
    
  4. 다음 명령을 사용하여 샘플 앱을 패키지합니다.

    mvn clean package
    
  5. 다음 명령을 사용하여 Azure Spring Apps에 앱을 배포합니다.

    az spring app deploy \
        --resource-group <resource-group-name> \
        --service <Azure-Spring-Apps-instance-name> \
        --name "msiapp" \
        --artifact-path target/asc-managed-identity-function-sample-0.1.0.jar
    
  6. 다음 명령을 사용하여 공용 엔드포인트 또는 테스트 엔드포인트에 액세스하여 앱을 테스트합니다.

    curl https://<Azure-Spring-Apps-instance-name>-msiapp.azuremicroservices.io/func/springcloud
    

    응답 본문에 다음 메시지가 반환됩니다.

    Function Response: Hello, springcloud. This HTTP triggered function executed successfully.
    

다음 단계