로컬 Linux 컨테이너에서 함수 앱 만들기

이 문서에서는 Azure Functions Core Tools를 사용하여 로컬 컴퓨터의 Linux 컨테이너에서 첫 번째 함수를 만들고, 함수를 로컬로 확인한 다음, 컨테이너화된 함수를 컨테이너 레지스트리에 게시하는 방법을 보여 줍니다. 컨테이너 레지스트리에서 컨테이너화된 함수를 Azure에 쉽게 배포할 수 있습니다.

이 문서의 단계를 비롯하여 컨테이너화된 함수를 Azure에 배포하는 전체 예제는 다음 문서 중 하나를 참조하세요.

컨테이너 레지스트리에서 기존 컨테이너화된 함수 앱을 사용하여 Azure Portal에서 함수 앱을 만들 수도 있습니다. 자세한 내용은 컨테이너를 사용하여 Azure Portal 만들기를 참조하세요.

개발 언어 선택

먼저 Azure Functions 도구를 사용하여 언어별 Linux 기본 이미지를 사용하여 Docker 컨테이너에서 함수 앱으로 프로젝트 코드를 만듭니다. 문서 상단에서 원하는 언어를 선택하세요.

Core Tools는 함수 언어에 가장 최신 버전의 올바른 기본 이미지를 사용하는 프로젝트에 대한 Dockerfile을 자동으로 생성합니다. 최신 기본 이미지에서 컨테이너를 정기적으로 업데이트하고 업데이트된 버전의 컨테이너에서 다시 배포해야 합니다. 자세한 내용은 컨테이너화된 함수 앱 만들기를 참조하세요.

필수 조건

시작하기 전에 다음과 같은 요구 사항이 있어야 합니다.

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

만든 컨테이너화된 함수 앱 이미지를 컨테이너 레지스트리에 게시하려면 로컬 컴퓨터에서 실행되는 Docker ID 및 Docker가 필요합니다. Docker ID가 없는 경우 Docker 계정을 만들 수 있습니다.

또한 Container Registry 빠른 시작의 컨테이너 레지스트리 만들기 섹션을 완료하여 레지스트리 인스턴스를 만들어야 합니다. 정규화된 로그인 서버 이름을 기록해 두세요.

가상 환경 만들기 및 활성화

적절한 폴더에서 다음 명령을 실행하여 .venv라는 가상 환경을 만들고 활성화합니다. Azure Functions에서 지원하는 Python 버전 중 하나를 사용해야 합니다.

python -m venv .venv
source .venv/bin/activate

Python에서 venv 패키지를 Linux 배포에 설치하지 않은 경우 다음 명령을 실행합니다.

sudo apt-get install python3-venv

활성화된 가상 환경에서 이후의 모든 명령을 실행합니다.

로컬 함수 프로젝트 만들기 및 테스트

터미널 또는 명령 프롬프트에서 선택한 언어에 대해 다음 명령을 실행하여 함수 앱 프로젝트를 현재 폴더에 만듭니다.

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

빈 폴더에서 다음 명령을 실행하여 Maven archetype으로부터 Functions 프로젝트를 생성합니다.

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

-DjavaVersion 매개 변수는 함수 런타임에 사용할 Java 버전을 알려줍니다. Java 11에서 함수를 실행하려면 -DjavaVersion=11을 사용합니다. -DjavaVersion을 지정하지 않으면 Maven은 기본적으로 Java 8로 설정됩니다. 자세한 내용은 Java 버전을 참조하세요.

Important

이 문서를 완료하려면 JAVA_HOME 환경 변수를 올바른 버전의 JDK 설치 위치로 설정해야 합니다.

Maven은 배포 시 프로젝트 생성 완료를 위해 필요한 값을 요청합니다. 프롬프트에 따라 다음 정보를 제공합니다.

prompt 설명
groupId com.fabrikam Java에 대한 패키지 명명 규칙에 따라 모든 프로젝트에서 프로젝트를 고유하게 식별하는 값입니다.
artifactId fabrikam-functions 버전 번호가 없는 jar의 이름인 값입니다.
version 1.0-SNAPSHOT 기본값을 선택합니다.
패키지 com.fabrikam.functions 생성된 함수 코드에 대한 Java 패키지인 값입니다. 기본값을 사용하세요.

Y를 입력하거나 Enter 키를 눌러 확인합니다.

Maven은 새 폴더에 artifactId라는 프로젝트 파일을 만드는데, 이 예제에서는 fabrikam-functions입니다.

--docker 옵션은 프로젝트에 대한 Dockerfile을 생성하는데, 이는 Azure Functions 및 선택한 런타임에서 사용하는 데 적합한 컨테이너를 정의합니다.

프로젝트 폴더로 이동합니다.

cd fabrikam-functions

다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수의 고유한 이름이고, --template 인수는 함수의 트리거를 지정합니다. func new는 프로젝트에 C# 코드 파일을 만듭니다.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

다음 명령을 사용하여 함수를 프로젝트에 추가합니다. 여기서 --name 인수는 함수의 고유한 이름이고, --template 인수는 함수의 트리거를 지정합니다. func newfunction.json이라는 구성 파일을 포함하는 함수 이름과 일치하는 하위 폴더를 만듭니다.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

함수를 로컬로 테스트하려면 프로젝트 폴더의 루트에서 로컬 Azure Functions 런타임 호스트를 시작합니다.

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

출력에 기록된 HttpExample 엔드포인트를 확인한 후 해당 엔드포인트로 이동합니다. 응답 출력에 환영 메시지가 표시됩니다.

출력에 기록된 HttpExample 엔드포인트를 확인한 후 http://localhost:7071/api/HttpExample?name=Functions로 이동합니다. 브라우저에서 name 쿼리 매개 변수에 제공된 값인 Functions를 다시 에코하는 "hello" 메시지를 표시해야 합니다.

Ctrl+C(macOS의 경우 Command+C)를 눌러 호스트를 중지합니다.

컨테이너 이미지 빌드 및 로컬로 확인

(선택 사항) 프로젝트 폴더의 루트에서 Dockerfile을 검사합니다. Dockerfile은 Linux에서 함수 앱을 실행하는 데 필요한 환경을 설명합니다. Azure Functions에 대해 지원되는 기본 이미지의 전체 목록은 Azure Functions 기본 이미지 페이지에 나와 있습니다.

루트 프로젝트 폴더에서 docker build 명령을 실행하고 이름으로 azurefunctionsimage, 태그로 v1.0.0를 입력합니다. <DOCKER_ID>를 Docker 허브 계정 ID로 바꿉니다. 이 명령은 컨테이너에 대한 Docker 이미지를 빌드합니다.

docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .

명령이 완료되면 새 컨테이너를 로컬에서 실행할 수 있습니다.

빌드를 확인하려면 로컬 컨테이너에서 docker run 명령을 사용하여 이미지를 실행합니다. 이때 <DOCKER_ID>를 다시 Docker Hub 계정 ID로 다시 바꾸고 -p 8080:80로 포트 인수를 추가합니다.

docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0

로컬 컨테이너에서 이미지가 시작되면 http://localhost:8080/api/HttpExample로 이동합니다. 이전과 동일한 인사 메시지가 표시되어야 합니다. 만든 HTTP 트리거 함수에 익명 권한 부여가 사용되기 때문에 액세스 키를 가져올 필요 없이 컨테이너에서 실행되는 함수를 호출할 수 있습니다. 자세한 내용은 권한 부여 키를 참조하세요.

로컬 컨테이너에서 이미지가 시작되면 http://localhost:8080/api/HttpExample?name=Functions로 이동합니다. 이전과 동일한 "hello" 메시지가 표시되어야 합니다. 만든 HTTP 트리거 함수에 익명 권한 부여가 사용되기 때문에 액세스 키를 가져올 필요 없이 컨테이너에서 실행되는 함수를 호출할 수 있습니다. 자세한 내용은 권한 부여 키를 참조하세요.

컨테이너에서 함수 앱을 확인한 후 Ctrl+C(macOS의 경우 Command+C)를 눌러 실행을 중지합니다.

레지스트리에 컨테이너 이미지 게시

컨테이너 이미지를 호스팅 환경에 배포할 수 있도록 하려면 컨테이너 레지스트리에 푸시해야 합니다.

Azure Container Registry는 컨테이너 이미지 및 관련 아티팩트를 빌드, 저장 및 관리하기 위한 프라이빗 레지스트리 서비스입니다. Azure 서비스에 컨테이너를 게시하려면 프라이빗 레지스트리 서비스를 사용해야 합니다.

  1. 다음 명령을 사용하여 레지스트리 인스턴스에 로그인합니다.

    az acr login --name <REGISTRY_NAME>
    

    이전 명령에서 <REGISTRY_NAME>을 Container Registry 인스턴스 이름으로 바꿉니다.

  2. 다음 명령을 사용하여 레지스트리 로그인 서버의 정규화된 이름으로 이미지에 태그를 지정합니다.

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    <LOGIN_SERVER>를 레지스트리 로그인 서버의 정규화된 이름으로 바꾸고 <DOCKER_ID>를 Docker ID로 바꿉니다.

  3. 다음 명령을 사용하여 레지스트리 인스턴스에 컨테이너를 푸시합니다.

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    
  4. Functions가 사용자 이름 및 암호를 사용하여 레지스트리에 연결할 수 있도록 다음 명령을 사용하여 기본 제공 관리자 계정을 사용하도록 설정합니다.

    az acr update -n <REGISTRY_NAME> --admin-enabled true
    
  1. 다음 명령을 사용하여 Functions가 레지스트리에 연결해야 하는 관리자 사용자 이름 및 암호를 검색합니다.

    az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
    

    Important

    관리자 계정 사용자 이름 및 암호는 중요한 자격 증명입니다. 안전하게 저장하고 퍼블릭 리포지토리 같은 액세스 가능한 위치에 저장하지 않도록 합니다.

다음 단계