이 가이드는 Azure Functions 컨테이너 내에서 IronPDF for Java를 배포하고 서버리스 HTTP 엔드포인트에서 요청 시에 PDF를 생성하는 방법에 대한 모든 내용을 다룹니다. IronPDF는 기본 Chromium 렌더링 엔진을 탑재하고 있으므로 Docker 이미지로 패키징해야 하며, Azure Functions의 표준 Zip 배포는 IronPDF가 런타임에 의존하는 바이너리를 실행할 수 없습니다. 이 가이드를 따르면 작동하는 Azure 함수는 쿼리 매개변수로 URL을 수락하고 완전히 렌더링된 PDF를 다운로드 가능한 파일로 반환하게 됩니다.

이 접근 방식은 Linux 기반의 Azure Functions에 대한 Microsoft-권장 사용자 정의 컨테이너 워크플로우를 사용합니다. Maven 프로젝트는 함수 코드와 종속성 관리를 제공합니다. Docker는 컨테이너 이미지를 빌드하여 레지스트리에 푸시하고 Azure Function 앱이 이를 참조합니다. 배포가 완료되면 콜드 스타트 시간이 성능 고려 사항의 주요 요인이며, 후속 호출은 빠르고 일관됩니다.

Azure CLI, Docker Desktop, Maven 3.8 이상 및 JDK 11 또는 JDK 17을 로컬에 설치했는지 확인하십시오. Function 앱과 저장소 계정을 생성할 수 있는 권한을 가진 활성화된 Azure 서브스크립션도 필요합니다.

빠른 시작: Azure Functions에서 Java 용 IronPDF 배포

아래 코드는 RenderPdf Azure Function의 전체 내용을 보여줍니다. url 쿼리 매개변수를 받아 PDF 바이트 스트림을 반환합니다. 다음 섹션에서 Maven 종속성 설정을 완료한 후, 이 내용을 Function.java에 추가하십시오.

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;

public class Function {

    /**
     * HTTP-triggered Azure Function: accepts a URL, renders it as a PDF,
     * and returns the PDF bytes as a downloadable attachment.
     */
    @FunctionName("RenderPdf")
    public HttpResponseMessage renderPdf(
            @HttpTrigger(
                    name = "req",
                    methods = {HttpMethod.GET, HttpMethod.POST},
                    authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        context.getLogger().info("RenderPdf function triggered.");

        // Read the target URL from the query string
        final String url = request.getQueryParameters().get("url");

        if (url == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                    .body("Provide a 'url' query parameter.")
                    .build();
        }

        try {
            context.getLogger().info("Rendering URL as PDF: " + url);

            // IronPDF renders the full page including JavaScript
            PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
            byte[] pdfBytes = pdf.getBinaryData();

            return request.createResponseBuilder(HttpStatus.OK)
                    .body(pdfBytes)
                    .header("Content-Disposition", "attachment; filename=output.pdf")
                    .header("Content-Type", "application/pdf")
                    .build();

        } catch (Exception ex) {
            context.getLogger().severe("PDF rendering failed: " + ex.getMessage());
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("PDF rendering failed. Check function logs for details.")
                    .build();
        }
    }
}
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;

public class Function {

    /**
     * HTTP-triggered Azure Function: accepts a URL, renders it as a PDF,
     * and returns the PDF bytes as a downloadable attachment.
     */
    @FunctionName("RenderPdf")
    public HttpResponseMessage renderPdf(
            @HttpTrigger(
                    name = "req",
                    methods = {HttpMethod.GET, HttpMethod.POST},
                    authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        context.getLogger().info("RenderPdf function triggered.");

        // Read the target URL from the query string
        final String url = request.getQueryParameters().get("url");

        if (url == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                    .body("Provide a 'url' query parameter.")
                    .build();
        }

        try {
            context.getLogger().info("Rendering URL as PDF: " + url);

            // IronPDF renders the full page including JavaScript
            PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);
            byte[] pdfBytes = pdf.getBinaryData();

            return request.createResponseBuilder(HttpStatus.OK)
                    .body(pdfBytes)
                    .header("Content-Disposition", "attachment; filename=output.pdf")
                    .header("Content-Type", "application/pdf")
                    .build();

        } catch (Exception ex) {
            context.getLogger().severe("PDF rendering failed: " + ex.getMessage());
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("PDF rendering failed. Check function logs for details.")
                    .build();
        }
    }
}
JAVA

지금 바로 무료 체험판을 통해 IronPDF을 프로젝트에서 사용해 보세요.

첫 번째 단계:
green arrow pointer

목차

필수 사전 준비사항 {#prerequisites}

시작하기 전에 모든 필요 도구가 설치되었는지와 Azure 구독이 활발한지 확인하십시오. 이러한 확인을 생략하면 배포 과정 도중 빌드 실패가 자주 발생합니다.

필요한 로컬 도구:

필요한 Azure 리소스:

  • 활성화된 Azure 구독
  • 리소스 그룹, 저장소 계정 및 기능 앱 계획을 생성할 수 있는 권한
  • 빌드된 이미지를 호스팅하기 위한 Docker Hub 계정 (또는 Azure Container Registry)

중요한IronPDF for Java는 Docker 컨테이너 내에서 실행될 때 ironpdf-engine-linux-x64 아티팩트가 필요합니다. Azure Functions의 표준 Zip 배포는 IronPDF의 기본 바이너리를 실행할 수 없습니다 — Docker가 유일하게 지원되는 배포 방법입니다.)}

다음 섹션으로 진행하기 전에 az login를 실행하여 Azure CLI를 인증하십시오.

Azure Function 프로젝트를 어떻게 설정합니까? {#set-up-project}

Linux에서 사용자 정의 이미지를 사용하여 함수를 만드는 방법에 대한 Microsoft 가이드는 전체 구축 프로세스를 설명합니다. 프로그래밍 언어를 묻는 프롬프트가 나타나면 Java를 선택하십시오.

가이드를 진행하여 빌드된 스캐폴딩 프로젝트가 Azure Functions Core Tools를 사용하여 로컬에서 플레이스홀더 함수를 실행할 수 있을 때까지 진행하십시오. 다음으로 확인하십시오:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/local-run.sh
mvn clean package
func start
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/local-run.sh
mvn clean package
func start
SHELL

플레이스홀더가 로컬 HTTP 요청에 응답하면 프로젝트 구조가 올바르며 IronPDF 통합을 위한 준비가 된 것입니다. 주요 파일은 pom.xml(Maven 구성), Function.java(함수 코드), Dockerfile(컨테이너 정의)입니다.

참고해 주세요Azure Functions Maven 아키타입은 host.jsonlocal.settings.json와 함께 pom.xml을 생성합니다. local.settings.json 파일은 로컬 개발용 환경 변수를 저장합니다. 이 파일은 기본적으로 소스 제어에서 제외되며 절대로 커밋해서는 안 됩니다.

Maven 프로젝트에 IronPDF 종속성을 어떻게 추가합니까? {#add-IronPDF-dependencies}

IronPDF for Java는 Maven Central을 통해 제공됩니다. 두 가지 아티팩트가 필요합니다. 하나는 Java API를 제공하는 핵심 ironpdf 라이브러리이고, 다른 하나는 Linux x86-64용으로 컴파일된 네이티브 Chromium 엔진을 묶은 ironpdf-engine-linux-x64입니다. 엔진 아티팩트 때문에 Docker 배포가 필수적입니다. 이 아티팩트는 런타임에 실행되어야 하는 바이너리를 포함하고 있기 때문입니다.

pom.xml를 열고 <dependencies> 블록 안에 다음 내용을 추가하십시오. LATEST_VERSIONMaven Central에서 제공되는 최신 릴리스로 대체하십시오:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>
</dependencies>
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>LATEST_VERSION</version>
    </dependency>
</dependencies>
XML

두 아티팩트는 동일한 버전 번호를 사용해야 합니다. ironpdfironpdf-engine-linux-x64 간의 버전 불일치로 인해 함수가 처음 PDF를 렌더링하려고 시도할 때 런타임 예외가 발생합니다.

pom.xml을 업데이트한 후, mvn dependency:resolve을 실행하여 Maven이 Central에서 두 아티팩트를 모두 다운로드할 수 있는지 확인한 다음, Docker 이미지 빌드에 시간을 투자하십시오.

IronPDF for Java 릴리즈 노트를 확인하십시오. 가장 최근의 안정적인 버전을 사용하면 호환성이 확보됩니다. 최신 릴리즈를 사용하면 최신 Chromium 렌더링 엔진과의 호환성을 보장하고 알려진 문제점을 피할 수 있습니다.)}

RenderPdf 함수를 어떻게 작성합니까? {#write-renderpdf-function}

RenderPdf 함수는 HTTP로 트리거되는 Azure Function으로, url 쿼리 매개변수를 받아 IronPDF의 Chromium 기반 엔진을 사용하여 대상 페이지를 렌더링하고, 결과 PDF를 Content-Disposition: attachment 헤더가 포함된 바이너리 응답으로 반환합니다. 이 헤더는 브라우저(또는 HTTP 클라이언트)에 PDF를 인라인으로 표시하지 않고 다운로드 하도록 지시합니다.

전체 함수 코드는 위의 빠른 시작에 나와 있습니다. 이 내용을 src/main/java/com/example/Function.java에 배치하고, Maven 아키타입에서 생성된 자리 표시자를 대체하거나 확장하십시오.

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf-annotated.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;

public class Function {

    @FunctionName("RenderPdf")
    public HttpResponseMessage renderPdf(
            @HttpTrigger(
                    name = "req",
                    methods = {HttpMethod.GET, HttpMethod.POST},
                    authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // Log each invocation for Azure Monitor / Application Insights
        context.getLogger().info("RenderPdf triggered.");

        final String url = request.getQueryParameters().get("url");

        // Return 400 if no URL was supplied
        if (url == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                    .body("Provide a 'url' query parameter.")
                    .build();
        }

        try {
            // renderUrlAsPdf launches Chromium, loads the page, and captures it as PDF
            PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);

            // getBinaryData returns the raw PDF bytes ready for transmission
            byte[] pdfBytes = pdf.getBinaryData();

            return request.createResponseBuilder(HttpStatus.OK)
                    .body(pdfBytes)
                    .header("Content-Disposition", "attachment; filename=output.pdf")
                    .header("Content-Type", "application/pdf")
                    .build();

        } catch (Exception ex) {
            context.getLogger().severe("Rendering error: " + ex.getMessage());
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("PDF rendering failed.")
                    .build();
        }
    }
}
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/RenderPdf-annotated.java
import com.microsoft.azure.functions.*;
import com.ironsoftware.ironpdf.PdfDocument;
import java.util.Optional;

public class Function {

    @FunctionName("RenderPdf")
    public HttpResponseMessage renderPdf(
            @HttpTrigger(
                    name = "req",
                    methods = {HttpMethod.GET, HttpMethod.POST},
                    authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // Log each invocation for Azure Monitor / Application Insights
        context.getLogger().info("RenderPdf triggered.");

        final String url = request.getQueryParameters().get("url");

        // Return 400 if no URL was supplied
        if (url == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                    .body("Provide a 'url' query parameter.")
                    .build();
        }

        try {
            // renderUrlAsPdf launches Chromium, loads the page, and captures it as PDF
            PdfDocument pdf = PdfDocument.renderUrlAsPdf(url);

            // getBinaryData returns the raw PDF bytes ready for transmission
            byte[] pdfBytes = pdf.getBinaryData();

            return request.createResponseBuilder(HttpStatus.OK)
                    .body(pdfBytes)
                    .header("Content-Disposition", "attachment; filename=output.pdf")
                    .header("Content-Type", "application/pdf")
                    .build();

        } catch (Exception ex) {
            context.getLogger().severe("Rendering error: " + ex.getMessage());
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("PDF rendering failed.")
                    .build();
        }
    }
}
JAVA

PdfDocument.renderUrlAsPdf(url)는 컨테이너 내에서 헤드리스 Chromium 인스턴스를 실행하고, 대상 URL(JavaScript 포함)을 완전히 로드한 후, 렌더링된 출력을 PDF로 캡처합니다. 이는 사용자에게 브라우저에서 보이는 것과 시각적으로 동일한 출력을 생성하기 때문에 현대 웹 애플리케이션, 대시보드 및 보고서 페이지를 캡처하는 데 적합합니다.

중요한함수 트리거의 authLevel = AuthorizationLevel.ANONYMOUS 설정은 엔드포인트를 공개적으로 접근 가능하게 만듭니다. 실행 환경에 배포할 때는 이 부분을 FUNCTION 또는 ADMIN로 변경하고 요청 헤더에 함수 키를 전달하십시오.

IronPDF를 위한 Dockerfile을 어떻게 구성합니까? {#configure-dockerfile}

IronPDF의 Chromium 엔진은 base Azure Functions 이미지에 포함되지 않은 일련의 공유 Linux 라이브러리에 의존합니다. 베이스 이미지 mcr.microsoft.com/azure-functions/java:4-java17-build는 Debian 11 기반으로 구축되었으므로, 패키지는 apt를 사용하여 설치해야 합니다.

Azure Functions Maven 아키타입에서 생성된 Dockerfile 파일에 다음 RUN 명령어를 추가해야 합니다. 이들을 FROM 지시문 뒤와 애플리케이션 JAR를 추가하는 COPY 단계 앞에 배치하십시오:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/Dockerfile
FROM mcr.microsoft.com/azure-functions/java:4-java17-build AS installer-env

# Install system dependencies required by IronPDF's Chromium renderer
RUN apt-get update && apt-get install -y \
    libgdiplus \
    libxkbcommon-x11-0 \
    libc6 \
    libc6-dev \
    libgtk2.0-0 \
    libnss3 \
    libatk-bridge2.0-0 \
    libx11-xcb1 \
    libxcb-dri3-0 \
    libdrm-common \
    libgbm1 \
    libasound2 \
    libxrender1 \
    libfontconfig1 \
    libxshmfence1 \
    && apt-get install -y xvfb libva-dev libgdiplus \
    && rm -rf /var/lib/apt/lists/*

# Copy the built function JAR
COPY --from=installer-env /home/site/wwwroot /home/site/wwwroot

ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true

libgdiplus 패키지는 그래픽 렌더링을 위한 GDI+ 호환성을 제공합니다. libnss3libatk-bridge2.0-0는 Chromium의 샌드박싱 및 접근성 계층에서 필수로 요구됩니다. xvfb는 가상 프레임버퍼를 제공하며, 일부 데비안(Debian) 환경에서는 헤드리스 모드에서도 Chromium(Chromium)이 이를 필요로 합니다. rm -rf /var/lib/apt/lists/* 블록의 마지막에 있는 RUN 단계는 패키지 관리자 캐시를 제거하여 최종 이미지 크기를 최대한 작게 유지합니다.

{(Azure Functions 기본 이미지 버전이 변경되거나 다른 Linux 배포판이 기본으로 사용될 경우 필요한 패키지가 달라질 수 있습니다. Debian, Ubuntu, CentOS 및 Alpine을 대상으로 한 종속성 매트릭스는 IronPDF Linux 설치 가이드를 참조하십시오.)}

Docker 이미지를 어떻게 빌드하고 푸시합니까? {#build-push-docker}

Maven 프로젝트가 빌드되고 Dockerfile이 업데이트되면 컨테이너 이미지를 조립하고 Docker 레지스트리에 업로드할 수 있습니다. Azure Functions는 Function 앱이 생성되거나 업데이트될 때 이 이미지를 가져옵니다.

1단계 — Maven 프로젝트 빌드 및 패키지화:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/build.sh
# Compile the Java code and package it as a JAR
mvn clean package
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/build.sh
# Compile the Java code and package it as a JAR
mvn clean package
SHELL

Maven은 함수 코드를 컴파일하고, 모든 종속성(두 IronPDF 아티팩트 포함)을 해결한 후, target/ 디렉터리에 배포 가능한 JAR 파일을 생성합니다. 진행하기 전 모든 컴파일 오류를 수정하십시오.

2단계 — Docker 이미지 빌드:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-build.sh
# Replace <DOCKER_ID> with your Docker Hub username or ACR login server
docker build --tag <DOCKER_ID>/ironpdf-azure-functions:v1.0.0 .
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-build.sh
# Replace <DOCKER_ID> with your Docker Hub username or ACR login server
docker build --tag <DOCKER_ID>/ironpdf-azure-functions:v1.0.0 .
SHELL

이는 Dockerfile에 명시된 Linux 패키지를 설치하고 JAR 파일을 복사하며 최종 이미지를 레이어링합니다. 첫 빌드에서는 패키지 다운로드 및 레이어 캐시 설정으로 인해 몇 분이 소요될 수 있습니다. 같은 기본 이미지를 사용하는 후속 빌드는 상당히 빠릅니다.

3단계 — Docker Hub에 이미지 푸시:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-push.sh
# Authenticate if not already logged in
docker login

# Push the image to the registry
docker push <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/docker-push.sh
# Authenticate if not already logged in
docker login

# Push the image to the registry
docker push <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
SHELL

{(Azure Container Registry(ACR)는 Docker Hub의 비공개 대안입니다. ACR은 Azure Active Directory와 직접 통합되며 이미지 개인 정보가 중요한 실행 작업에 대해 권장되는 선택입니다.)}

Azure에 함수를 어떻게 배포합니까? {#deploy-to-azure}

이미지가 레지스트리에 있으면 Azure Function 앱을 생성(또는 업데이트)하여 이를 참조할 수 있습니다. az functionapp create 명령어는 단일 단계에서 Function App을 프로비저닝하고, 스토리지 계정에 연결하며, 컨테이너 이미지를 설정합니다.

1단계 — Function 앱 생성 또는 업데이트:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-deploy.sh
az functionapp create \
  --name <APP_NAME> \
  --storage-account <STORAGE_NAME> \
  --resource-group AzureFunctionsContainers-rg \
  --plan myPremiumPlan \
  --deployment-container-image-name <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-deploy.sh
az functionapp create \
  --name <APP_NAME> \
  --storage-account <STORAGE_NAME> \
  --resource-group AzureFunctionsContainers-rg \
  --plan myPremiumPlan \
  --deployment-container-image-name <DOCKER_ID>/ironpdf-azure-functions:v1.0.0
SHELL

<APP_NAME>을 Function App의 전역 고유 이름으로, <STORAGE_NAME>을 기존 Azure Storage 계정 이름으로, <DOCKER_ID>을 이전 단계에서 사용한 Docker Hub 사용자 이름 또는 ACR 로그인 서버로 대체하십시오.

--plan myPremiumPlan 플래그는 프리미엄 호스팅 플랜을 선택합니다. IronPDF의 Chromium 엔진은 렌더링 동안 상당한 메모리를 소모합니다; 소모 계획의 1.5 GB 메모리 한계는 종종 불충분합니다. 프리미엄 계획은 최소 3.5 GB를 제공하며 콜드 스타트 지연을 제거하는 사전 웜 인스턴스를 지원합니다.

2단계 — 배포 확인:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-verify.sh
# Check that the function app is running and the container has been pulled
az functionapp show \
  --name <APP_NAME> \
  --resource-group AzureFunctionsContainers-rg \
  --query "state"
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/az-verify.sh
# Check that the function app is running and the container has been pulled
az functionapp show \
  --name <APP_NAME> \
  --resource-group AzureFunctionsContainers-rg \
  --query "state"
SHELL

컨테이너가 성공적으로 시작되면 이 명령은 "Running"를 반환합니다. "Starting" 또는 오류가 반환되면, Azure 포털의 Function App 내 로그 스트림에서 컨테이너 풀링 또는 시작 오류가 있는지 확인하십시오.

{(Consume(Serverless) 계획은 IronPDF에 Azure Functions를 사용하는 데 권장되지 않습니다. Chromium과 함께하는 PDF 렌더링에는 소비 계획에서 할당된 것보다 더 많은 메모리가 필요합니다. 프리미엄 또는 전용(App Service) 계획을 사용하여 메모리 부족 오류를 방지하십시오.)}

함수를 어떻게 트리거하고 테스트합니까? {#trigger-and-test}

Function App이 Running 상태를 보고하면, RenderPdf 엔드포인트는 요청을 수신할 준비가 됩니다. 엔드포인트 URL은 Function App 이름과 @FunctionName 어노테이션에 정의된 함수 이름을 기반으로 예측 가능한 패턴을 따릅니다.

브라우저 또는 curl을 사용하여 테스트:

//:path=/static-assets/pdf/content-code-examples/tutorials/azure/test-request.sh
# Replace <APP_NAME> with the Function App name
curl -o output.pdf \
  "https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com"
//:path=/static-assets/pdf/content-code-examples/tutorials/azure/test-request.sh
# Replace <APP_NAME> with the Function App name
curl -o output.pdf \
  "https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com"
SHELL

성공적인 응답 시 output.pdf이라는 이름의 PDF 파일이 현재 디렉터리에 저장됩니다. curl의 -o 플래그는 바이너리 응답 본문을 터미널에 출력하는 대신 파일로 기록합니다.

브라우저에서 테스트할 때 다음으로 이동하십시오:

https://<APP_NAME>.azurewebsites.net/api/RenderPdf?url=https://www.example.com

브라우저는 PDF 다운로드를 prompts할 것입니다. 이를 열어 페이지가 올바르게 렌더링되었는지 확인하십시오.

{(콜드 스타트 후 첫 요청은 Azure가 컨테이너 이미지를 가져오고 IronPDF가 Chromium을 초기화하는 동안 20–60초가 걸릴 수 있습니다. 이전 컨테이너 수명 내의 후속 요청은 훨씬 빠릅니다. 프리미엄 계획의 사전 웜 인스턴스 기능은 최소한 하나의 인스턴스를 연속으로 실행하여 콜드 스타트를 제거합니다.)}

오류 확인을 위한 로그 확인: Azure 포털로 이동하여 기능 앱을 열고 모니터링 아래의 로그 스트림을 선택하십시오. context.getLogger() 호출의 로그 항목이 거의 실시간으로 여기에 표시되므로, 렌더링 오류 진단이 간편해집니다.

다음 단계는 무엇인가요? {#next-steps}

이 가이드는 Azure Functions Docker 컨테이너 내에서 IronPDF for Java를 배포하고 URLs을 PDF로 렌더링하는 HTTP로 트리거되는 함수를 작성하며, 필요한 Linux 종속성으로 Dockerfile을 구성하고 라이브 엔드포인트를 테스트하는 방법을 보여줍니다. 동일한 패턴은 최소한의 변경으로 보다 고급 사용 사례로 확장됩니다.

함수 확장:

  • URL 대신 PdfDocument.renderHtmlAsPdf(htmlString)을 사용하여 HTML 문자열을 직접 렌더링합니다.
  • IronPDF의 전체 Java PDF API를 사용하여 워터마크 적용, 여러 PDF 병합, 또는 디지털 서명을 추가
  • 요청 헤더나 POST 본문을 읽어 맞춤 HTML 콘텐츠나 렌더링 옵션 전달

프로덕션 준비 개선:

  • authLevelFUNCTION으로 변경하고, 기능 키를 정기적으로 순환하여 사용하십시오
  • Azure Key Vault를 사용하여 애플리케이션 설정에서 참조된 비밀을 저장하세요
  • Application Insights를 구성하여 렌더링 지연 및 실패율의 끝단을 관측하세요
  • Docker 이미지 업데이트 웹훅을 설정하여 새 이미지 버전이 푸시될 때 Azure가 자동으로 재배포하게 하세요

IronPDF for Java 가이드를 더 탐색하세요:

무료 IronPDF 체험판을 시작하여 평가 기간 동안 모든 렌더링 및 조작 기능을 워터마크 없이 액세스하세요. 생산에 배포할 준비가 되었을 때, IronPDF 라이선싱 옵션을 확인하여 프로젝트 규모에 맞는 계획을 찾으세요.

자주 묻는 질문

왜 Azure Functions에서 IronPDF에 Docker 배포가 필요한가요?

IronPDF는 런타임에 바이너리를 실행해야 하는 네이티브 Chromium 렌더링 엔진을 제공합니다. Azure Functions Zip 배포는 네이티브 바이너리를 실행할 수 없으므로 Docker 컨테이너 이미지만 지원되는 배포 경로입니다.

Docker 컨테이너 내부에서 IronPDF를 실행하려면 어떤 Maven 아티팩트가 필요한가요?

pom.xml에 두 개의 아티팩트가 필요합니다: Java API용 com.ironsoftware:ironpdf와 네이티브 Chromium 엔진용 com.ironsoftware:ironpdf-engine-linux-x64. 두 아티팩트 모두 동일한 버전 번호를 공유해야 합니다.

IronPDF를 위해 Dockerfile이 어떤 Linux 패키지를 설치해야 하나요?

Dockerfile은 libgdiplus, libxkbcommon-x11-0, libc6, libc6-dev, libgtk2.0-0, libnss3, libatk-bridge2.0-0, libx11-xcb1, libxcb-dri3-0, libdrm-common, libgbm1, libasound2, libxrender1, libfontconfig1, libxshmfence1, xvfblibva-dev를 설치해야 합니다.

RenderPdf 함수가 무엇을 하나요?

RenderPdf 함수는 HTTP 트리거된 Azure Function으로 url 쿼리 매개변수를 읽고 PdfDocument.renderUrlAsPdf로 전달한 후 호출자가 다운로드할 수 있는 PDF 파일을 받도록 Content-Disposition: attachment 헤더와 함께 결과 PDF 바이트를 반환합니다.

IronPDF에 어떤 Azure Functions 호스팅 플랜을 사용해야 하나요?

프리미엄 플랜을 권장합니다. IronPDF의 Chromium 엔진은 많은 메모리가 필요하며, 소비 플랜의 1.5 GB 한계보다 높은 경우가 많습니다. 프리미엄 플랜은 최소 3.5 GB를 제공하며 차가운 시작 지연을 제거하기 위한 사전 준비된 인스턴스를 지원합니다.

새로 배포된 기능의 첫 요청이 왜 느린가요?

차가운 시작 후의 첫 요청은 20–60초가 걸릴 수 있으며, Azure는 컨테이너 이미지를 가져와야 하고 IronPDF는 자신의 Chromium 엔진을 초기화해야 합니다. 동일한 컨테이너 수명 내의 후속 요청은 훨씬 빠르게 응답합니다. 프리미엄 플랜의 사전 준비된 인스턴스 기능은 이 지연을 제거할 수 있습니다.

기존 Azure Function 앱을 새 Docker 이미지로 업데이트하려면 어떻게 해야 하나요?

새로운 태그로 이미지를 다시 빌드하고 푸시한 다음, --deployment-container-image-name 값을 새로 업데이트하고 az functionapp create를 다시 실행하거나 Azure 포털에서 Function App의 배포 센터 아래에서 컨테이너 설정을 업데이트하세요.

IronPDF가 Azure Function에서 URL뿐만 아니라 HTML 문자열을 렌더링할 수 있나요?

네. PdfDocument.renderUrlAsPdf(url)PdfDocument.renderHtmlAsPdf(htmlString)로 교체하여 HTML 문자열을 직접 렌더링할 수 있습니다. 함수 구조와 응답 처리는 동일하게 유지됩니다.

요청에서 url 쿼리 매개변수가 누락되면 무엇이 발생하나요?

함수는 url 매개변수가 null인지 확인하고 PDF 렌더링을 시도하기 전에 설명 메시지가 포함된 HTTP 400 잘못된 요청 응답을 반환합니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

시작할 준비 되셨나요?
버전: 2026.5 just released
Still Scrolling Icon

아직도 스크롤하고 계신가요?

빠른 증거를 원하시나요?
샘플을 실행하세요 HTML이 PDF로 변환되는 것을 지켜보세요.