Azure Functions에서 Quarkus를 사용하여 서버리스 Java 앱 배포

이 문서에서는 Quarkus를 사용하여 서버리스 Java 앱을 개발, 빌드하고 Azure Functions로 배포합니다. 이 문서에서는 Quarkus Funqy 및 Java용 Azure Functions HTTP 트리거에 대한 기본 제공 지원을 사용합니다. Azure Functions에서 Quarkus를 사용하면 Azure Functions의 스케일링 능력과 유연성을 갖춘 Quarkus 프로그래밍 모델의 기능을 제공합니다. 완료되면 Azure Functions에서 서버리스 Quarkus 애플리케이션을 실행하고 Azure에서 앱을 계속 모니터링합니다.

필수 조건

앱 프로젝트 만들기

다음 명령을 사용하여 이 문서의 샘플 Java 프로젝트를 복제합니다. 샘플은 GitHub에 있습니다.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus

분리된 HEAD 상태에 있다는 메시지가 표시되면 이 메시지는 무시해도 안전합니다. 이 문서에는 커밋이 필요하지 않으므로 분리된 HEAD 상태가 적절합니다.

샘플 함수를 탐색합니다. functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java 파일을 엽니다.

다음 명령을 실행합니다. @Funq 주석은 메서드(이 경우 funqyHello)를 서버리스 함수로 만듭니다.

@Funq
public String funqyHello() {
    return "hello funqy";
}

Azure Functions Java에는 고유한 Azure 관련 주석 집합이 있지만 여기서 수행하는 것처럼 간단한 용량만큼 Azure Functions의 Quarkus를 사용할 때는 이러한 주석이 필요하지 않습니다. Azure Functions Java 주석에 대한 자세한 내용은 Azure Functions Java 개발자 가이드를 참조하세요.

달리 지정하지 않는 한, 함수의 이름은 메서드 이름과 동일합니다. 다음 명령을 사용하여 주석에 대한 매개 변수를 사용하여 함수 이름을 정의할 수도 있습니다.

@Funq("alternateName")
public String funqyHello() {
    return "hello funqy";
}

이름은 중요합니다. 이 문서 뒷부분에 표시된 것처럼 함수를 호출하기 위한 REST URI의 일부가 됩니다.

로컬에서 함수 테스트

mvn을 사용하여 로컬 터미널에서 Quarkus 개발 모드를 실행합니다. 이러한 방식으로 Quarkus를 실행하면 백그라운드 컴파일을 사용하여 라이브 다시 로드할 수 있습니다. Java 파일 및/또는 리소스 파일을 수정하고 브라우저를 새로 고치면 이러한 변경 내용이 자동으로 적용됩니다.

브라우저 새로 고침은 작업 영역의 검사를 트리거합니다. 검사한 결과 변경 내용이 확인되면 Java 파일이 다시 컴파일되고 애플리케이션이 다시 배포됩니다. 다시 배포된 애플리케이션은 요청을 처리합니다. 컴파일 또는 배포에 문제가 있는 경우 오류 페이지에 표시됩니다.

다음 절차에서 yourResourceGroupName을 리소스 그룹 이름으로 바꿉니다. 함수 앱 이름은 모든 Azure에서 전역적으로 고유해야 합니다. 리소스 그룹 이름은 구독 내에서 전역적으로 고유해야 합니다. 이 문서에서는 리소스 그룹 이름을 함수 이름 앞에 추가하여 필요한 고유성을 달성합니다. 만드는 이름을 고유하게 유지하려면 앞에 고유한 식별자를 추가하는 것이 좋습니다. 유용한 방법은 mmdd 형식을 사용해서 이니셜과 오늘 날짜를 차례로 사용하는 것입니다.

리소스 그룹은 지침의 이 부분에는 필요하지 않지만 나중에 필요합니다. 간단히 하기 위해 Maven 프로젝트에서는 이 속성을 정의해야 합니다.

  1. Quarkus 개발 모드를 호출합니다.

    cd functions-azure
    mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
    

    출력은 다음과 같습니다.

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    INFO  [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080
    
    INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx]
    
    --
    Tests paused
    Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
    
  2. 로컬 터미널에서 CURL 명령을 사용하여 함수에 액세스합니다.

    curl localhost:8080/api/funqyHello
    

    출력은 다음과 같습니다.

    "hello funqy"
    

함수에 종속성 주입 추가

개방형 표준 기술 Jakarta EE CDI(컨텍스트 및 종속성 주입)는 Quarkus에서 종속성 주입을 제공합니다. 일반적으로 주입에 대한 대략적인 개요 및 CDI에 대해서는 Jakarta EE 자습서를 참조하세요.

  1. 종속성 주입을 사용하는 새 함수를 추가합니다.

    functions-quarkus/src/main/java/io/quarkus 디렉터리에 GreetingService.java 파일을 만듭니다. 다음 코드를 파일의 소스 코드로 사용합니다.

    package io.quarkus;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class GreetingService {
    
        public String greeting(String name) {
            return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name;
        }
    
    }
    

    파일을 저장합니다.

    GreetingServicegreeting() 메서드를 구현하는 삽입 가능한 빈입니다. 이 메서드는 name 매개 변수를 사용하여 Welcome... 문자열 메시지를 반환합니다.

  2. 기존 functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java 파일을 엽니다. 클래스를 다음 코드로 바꿔 새 gService 필드와 greeting 메서드를 추가합니다.

    package io.quarkus;
    
    import javax.inject.Inject;
    import io.quarkus.funqy.Funq;
    
    public class GreetingFunction {
    
        @Inject
        GreetingService gService;
    
        @Funq
        public String greeting(String name) {
            return gService.greeting(name);
        }
    
        @Funq
        public String funqyHello() {
            return "hello funqy";
        }
    
    }
    

    파일을 저장합니다.

  3. 로컬 터미널에서 curl 명령을 사용하여 새 greeting 함수에 액세스합니다.

    curl -d '"Dan"' -X POST localhost:8080/api/greeting
    

    출력은 다음과 같습니다.

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
    

    Important

    라이브 코딩(개발 모드라고도 함)을 사용하면 앱을 실행하고 즉시 변경할 수 있습니다. Quarkus는 변경이 있을 때 앱을 자동으로 다시 컴파일하고 다시 로드합니다. 이것은 이 문서 전체에서 사용할 강력하고 효율적인 개발 스타일입니다.

    다음 단계로 이동하기 전에 Ctrl+C를 선택하여 Quarkus 개발 모드를 중지합니다.

Azure에 앱 배포

  1. 아직 로그인하지 않은 경우 다음 az login 명령을 사용하여 Azure 구독에 로그인하고 화면의 지침을 따릅니다.

    az login
    

    참고 항목

    여러 Azure 테넌트가 Azure 자격 증명과 연결된 경우 로그인할 테넌트를 지정해야 합니다. --tenant 옵션을 사용하여 이 작업을 수행할 수 있습니다. 예: az login --tenant contoso.onmicrosoft.com

    웹 브라우저에서 프로세스를 계속합니다. 웹 브라우저를 사용할 수 없거나 웹 브라우저가 열리지 않으면 az login --use-device-code와 함께 디바이스 코드 흐름을 사용합니다.

    성공적으로 로그인하면 로컬 터미널의 출력이 다음과 유사하게 표시됩니다.

    xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft'
    [
        {
            "cloudName": "AzureCloud",
            "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "isDefault": true,
            "managedByTenants": [],
            "name": "Contoso account services",
            "state": "Enabled",
            "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx",
            "user": {
            "name": "user@contoso.com",
            "type": "user"
            }
        }
    ]
    
  2. 함수를 빌드하고 Azure에 배포합니다.

    이전 단계에서 생성한 pom.xml 파일은 azure-functions-maven-plugin을 사용합니다. mvn install을 실행하려면 azure-functions-maven-plugin에 필요한 구성 파일과 스테이징 디렉터리가 생성됩니다. yourResourceGroupName의 경우 이전에 사용한 값을 사용합니다.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. 배포하는 동안 Azure에 로그인합니다. azure-functions-maven-plugin 플러그 인은 프로젝트가 배포될 때마다 Azure 로그인을 묻는 메시지를 표시하도록 구성됩니다. 빌드하는 동안 다음과 유사한 출력이 표시됩니다.

    [INFO] Auth type: DEVICE_CODE
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
    

    출력에 표시된 대로 수행하고 브라우저 및 제공된 디바이스 코드를 사용하여 Azure에서 인증을 받습니다. 다른 많은 인증 및 구성 옵션을 사용할 수 있습니다. azure-functions-maven-plugin에 대한 전체 참조 설명서는 Azure Functions: 구성 세부 정보에서 확인할 수 있습니다.

  4. 인증 후에는 빌드가 계속 진행되고 완료됩니다. 출력에 끝 부분에 BUILD SUCCESS가 포함되어 있는지 확인합니다.

    Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
    

    출력 로그에서는 Azure에서 함수를 트리거하는 URL을 찾을 수도 있습니다.

    [INFO] HTTP Trigger Urls:
    [INFO] 	 quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
    

    배포가 완료되는 데 시간이 걸립니다. 그동안 Azure Portal에서 Azure Functions를 살펴보겠습니다.

Azure에서 서버리스 함수 액세스 및 모니터링

포털에 로그인하고 Azure CLI에서 사용한 것과 동일한 테넌트 및 구독을 선택했는지 확인합니다.

  1. Azure Portal 맨 위에 있는 검색 창에 함수 앱을 입력하고 Enter 키를 선택합니다. 함수 앱이 배포되고 <yourResourceGroupName>-function-quarkus 이름으로 표시됩니다.

    Screenshot that shows the function app in the portal.

  2. 함수 앱을 선택하여 위치, 구독, URL, 메트릭App Service 요금제와 같은 자세한 정보를 표시합니다. 그런 다음, URL 값을 선택합니다.

    Screenshot that shows a URL and other function app details.

  3. 시작 페이지에서 함수 앱이 "실행 중"으로 표시되는지 확인합니다.

    Screenshot that shows the welcome page for a function app.

  4. 로컬 터미널에서 다음 curl 명령을 사용하여 greeting 함수를 호출합니다.

    Important

    YOUR_HTTP_TRIGGER_URL을 Azure Portal 또는 출력에서 찾은 고유한 함수 URL로 바꿉니다.

    curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
    

    출력은 다음과 비슷해야 합니다.

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
    

    다음 curl 명령을 사용하여 다른 함수(funqyHello)에 액세스할 수도 있습니다.

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    출력은 앞에서 관찰한 것과 동일해야 합니다.

    "hello funqy"
    

    Azure Portal에서 기본 메트릭 기능을 연습하려면 셸 for 루프 내에서 함수를 호출해 보세요.

    for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
    

    잠시 후 포털에 몇 가지 메트릭 데이터가 표시됩니다.

    Screenshot that shows function metrics in the portal.

이제 포털에서 Azure 함수를 열었으므로 포털에서 액세스할 수 있는 추가 기능은 다음과 같습니다.

리소스 정리

이러한 리소스가 필요하지 않은 경우 Azure Cloud Shell 또는 로컬 터미널에서 다음 명령을 실행하여 리소스를 삭제할 수 있습니다.

az group delete --name <yourResourceGroupName> --yes

다음 단계

이 문서에서는 다음 방법에 대해 알아보았습니다.

  • Quarkus 개발 모드를 실행합니다.
  • azure-functions-maven-plugin을 사용하여 Funqy 앱을 Azure 함수에 배포합니다.
  • 포털에서 함수의 성능을 검사합니다.

Azure Functions 및 Quarkus에 대한 자세한 내용은 다음 문서 및 참조를 참조하세요.