Share via


컨테이너 및 Azure Functions로 작업

이 문서에서는 Azure Container Apps 환경에서 실행되는 컨테이너화된 함수 앱을 작업할 수 있도록 Azure Functions가 제공하는 지원을 보여줍니다. 자세한 내용은 Azure Functions의 Azure Container Apps 호스팅을 참조하세요.

이 문서에서는 Linux 컨테이너에서 실행되는 함수 앱을 작업할 수 있도록 Azure Functions가 제공하는 지원을 보여줍니다.

문서 상단에서 컨테이너화된 함수 앱에 사용할 호스팅 환경을 선택하세요.

바로 시작하려면 다음 문서를 검토하여 Linux 컨테이너에서 실행되는 첫 번째 함수를 만들고 컨테이너 레지스트리의 이미지를 지원되는 Azure 호스팅 서비스로 배포하는 방법을 알아보세요.

Azure Container Apps에서 첫 번째 컨테이너화된 Azure Functions 만들기

Azure Container Apps에 배포하는 방법에 대한 자세한 내용은 Azure Functions의 Azure Container Apps 호스팅을 참조하세요.

컨테이너화된 함수 앱 만들기

Functions를 사용하면 함수 앱을 Linux 컨테이너로 쉽게 배포하고 실행할 수 있으며, 함수 앱은 고객이 만들고 유지 관리합니다. Functions는 컨테이너화된 함수 앱을 만들 때 사용할 수 있는 언어별 기본 이미지 집합을 유지 관리합니다.

Important

자체 컨테이너를 만들 때 컨테이너의 기본 이미지를 지원되는 최신 기본 이미지로 업데이트해야 합니다. Azure Functions에 지원되는 기본 이미지는 언어별로 다르며 Azure Functions 기본 이미지 리포지토리에서 찾을 수 있습니다.

Functions 팀은 이러한 기본 이미지에 대한 월별 업데이트를 게시하기 위해 최선을 다하고 있습니다. 정기 업데이트에는 Functions 런타임 및 언어 모두에 대한 최신 부 버전 업데이트 및 보안 수정 사항이 포함됩니다. 정기적으로 최신 기본 이미지에서 컨테이너를 업데이트하고 업데이트된 버전의 컨테이너를 다시 배포해야 합니다.

명령줄에서 로컬 컨테이너화된 함수 앱을 만들고 컨테이너 레지스트리에 이미지를 게시하는 방법에 대한 전체 예제는 로컬 컨테이너에서 함수 앱 만들기를 참조하세요.

Dockerfile 생성

Functions 도구는 함수 코드 프로젝트와 함께 Dockerfile을 생성하는 Docker 옵션을 제공합니다. Docker에서 이 파일을 사용하여 올바른 기본 이미지(언어 및 버전)에서 파생되는 컨테이너에 함수를 만들 수 있습니다.

Dockerfile을 만드는 방법은 프로젝트를 만드는 방법에 따라 달라집니다.

  • Azure Functions Core Tools를 사용하여 Functions 프로젝트를 만드는 경우 다음 예제와 같이 func init 명령을 실행할 때 --docker 옵션을 넣습니다.

    func init --docker
    
  • 다음 예제와 같이 기존 프로젝트 폴더에서 func init 명령을 실행할 때 --docker-only 옵션을 사용하여 기존 프로젝트에 Dockerfile을 추가할 수도 있습니다.

    func init --docker-only
    

전체 예제는 로컬 컨테이너에서 함수 앱 만들기를 참조하세요.

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

코드 프로젝트에서 Core Tools 생성 Dockerfile을 사용하면 Docker를 사용하여 로컬 컴퓨터에 컨테이너화된 함수 앱을 만들 수 있습니다. 다음 docker build 명령은 로컬 디렉터리의 프로젝트에서 컨테이너화된 함수 이미지를 만듭니다.

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

컨테이너를 만드는 방법에 대한 예제는 컨테이너 이미지 빌드 및 로컬로 확인을 참조하세요.

레지스트리의 이미지 업데이트

함수 코드 프로젝트를 변경하거나 최신 기본 이미지로 업데이트해야 하는 경우 컨테이너를 로컬로 다시 빌드하고 업데이트된 이미지를 원하는 컨테이너 레지스트리에 다시 게시해야 합니다. 다음 명령은 루트 폴더의 이미지를 업데이트된 버전 번호로 다시 빌드하고 레지스트리에 푸시합니다.

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

<REGISTRY_NAME>을 해당하는 Container Registry 인스턴스로 바꾸고 <LOGIN_SERVER>를 로그인 서버 이름으로 바꿉니다.

이제 새 이미지를 사용하도록 배포를 업데이트해야 합니다. 다음은 새 이미지를 사용하도록 함수 앱을 업데이트하는 예제입니다.

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

이 예제에서 <IMAGE_NAME>은 버전을 포함한 새 이미지의 전체 이름입니다. 프라이빗 레지스트리를 사용하려면 사용자 이름과 암호를 입력해야 합니다. 이러한 자격 증명을 안전하게 저장해야 합니다.

지속적인 배포를 사용하도록 설정하는 방안도 고려해야 합니다.

컨테이너를 사용하여 Azure Portal에서 만들기

Azure Portal에서 함수 앱을 만들 때 컨테이너 레지스트리의 이미지로 함수 앱을 배포하도록 선택할 수 있습니다. 컨테이너 레지스트리에서 컨테이너화된 함수 앱을 만드는 방법을 알아보려면 컨테이너에서 함수 앱 만들기를 참조하세요.

다음은 컨테이너 레지스트리에서 기존 컨테이너화된 함수 앱을 만들고 배포하는 단계입니다.

  1. Azure Portal 메뉴 또는 페이지에서 리소스 만들기를 선택합니다.

  2. 새로 만들기 페이지에서 컴퓨팅>함수 앱을 선택합니다.

  3. 호스팅 옵션 선택에서 프리미엄 계획>선택을 선택합니다.

    그러면 동적 크기 조정을 지원하는 프리미엄 플랜에서 Azure Functions에 호스트되는 함수 앱이 만들어집니다. App Service 요금제에서 실행되도록 선택할 수도 있지만, 이러한 종류의 전용 플랜에서는 함수 앱의 크기 조정을 고객이 관리해야 합니다.

  4. 기본 사항 페이지에서 함수 앱 설정을 다음 표에서 지정한 대로 사용합니다.

    설정 제안 값 설명
    구독 구독 함수 앱을 만드는 구독입니다.
    리소스 그룹 myResourceGroup 함수 앱을 만들 새 리소스 그룹의 이름입니다. 기존 리소스 그룹에서 새 함수 앱을 만들 때 알려진 제한 사항이 있으므로 리소스 그룹을 만들어야 합니다.
    함수 앱 이름 고유한 이름* 새 함수 앱을 식별하는 이름입니다. 유효한 문자는 a-z(대/소문자 구분 안 함), 0-9-입니다.
    코드 또는 컨테이너 이미지를 배포하려고 하나요? 컨테이너 이미지 레지스트리의 컨테이너화된 함수 앱을 배포합니다. 레지스트리에서 함수 앱을 만들려면 로컬 컨테이너에서 함수 앱 만들기를 참조하세요.
    지역 기본 지역 사용자 또는 함수가 액세스할 수 있는 기타 서비스에 가까운 지역을 선택합니다.
    Linux 플랜 새 계획(기본값) 앱을 호스트하는 새 프리미엄 계획을 만듭니다. 기존 프리미엄 계획을 선택할 수도 있습니다.
    요금제 Elastic Premium EP1 EP1이 가장 저렴한 계획입니다. 필요한 경우 더 큰 플랜을 선택할 수 있습니다.
    영역 중복 Disabled 비프로덕션 앱에서는 이 기능이 필요하지 않습니다.

    *앱 이름은 모든 Azure Functions 호스팅 앱 중에서 전역적으로 고유해야 합니다.

  5. 스토리지 탭에서 새 스토리지 계정을 만들고 모니터링 탭에서 새 Application Insight 인스턴스를 만드는 기본 옵션을 수락합니다. 기존 스토리지 계정이나 Application Insights 인스턴스를 사용하도록 선택할 수도 있습니다.

  6. 검토 + 만들기를 선택하여 앱 구성 선택을 검토합니다.

  7. 검토 + 만들기 페이지에서 설정을 검토한 다음, 만들기를 선택하여 기본 기준 이미지를 사용하여 함수 앱을 프로비전합니다.

  8. 함수 앱 리소스를 만든 후 리소스로 이동을 선택하고 함수 앱 페이지에서 배포 센터를 선택합니다.

  9. 배포 센터에서 컨테이너 레지스트리를 이미지의 원본으로 연결할 수 있습니다. 레지스트리에서 컨테이너에 대한 업데이트를 보다 강력하게 지속적으로 배포하기 위해 GitHub Actions 또는 Azure Pipelines를 사용하도록 설정할 수도 있습니다.

컨테이너를 사용하여 Azure Portal에서 만들기

Azure Portal에서 함수 앱을 만들 때 컨테이너 레지스트리의 이미지로 함수 앱을 배포하도록 선택할 수 있습니다. 컨테이너 레지스트리에서 컨테이너화된 함수 앱을 만드는 방법을 알아보려면 컨테이너에서 함수 앱 만들기를 참조하세요.

다음은 컨테이너 레지스트리에서 기존 컨테이너화된 함수 앱을 만들고 배포하는 단계입니다.

  1. Azure Portal 메뉴 또는 페이지에서 리소스 만들기를 선택합니다.

  2. 새로 만들기 페이지에서 컴퓨팅>함수 앱을 선택합니다.

  3. 호스팅 옵션 선택에서 Container Apps 환경>선택을 선택합니다.

  4. 기본 사항 페이지에서 함수 앱 설정을 다음 표에서 지정한 대로 사용합니다.

    설정 제안 값 설명
    구독 구독 함수 앱을 만드는 구독입니다.
    리소스 그룹 myResourceGroup 함수 앱을 만들 새 리소스 그룹의 이름입니다. 기존 리소스 그룹에서 새 함수 앱을 만들 때 알려진 제한 사항이 있으므로 리소스 그룹을 만들어야 합니다.
    함수 앱 이름 고유한 이름* 새 함수 앱을 식별하는 이름입니다. 유효한 문자는 a-z(대/소문자 구분 안 함), 0-9-입니다.
    지역 기본 지역 사용자 또는 함수가 액세스할 수 있는 기타 서비스에 가까운 지역을 선택합니다.

    *앱 이름은 Azure Container Apps 환경에서 고유해야 합니다.

  5. Azure Container Apps 환경의 경우 사용 + 전용 계획에서 제안된 새 환경을 수락합니다. 기본적으로 환경은 기본 워크로드 프로필과 영역 중복 없이 만들어지며, 이로 인해 비용이 최소화됩니다. 자세한 내용은 Azure Functions의 Azure Container Apps 호스팅을 참조하세요.

    기존 Container Apps 환경을 사용하도록 선택할 수도 있습니다. 사용자 지정 환경을 만들려면 대신 새로 만들기를 선택합니다. 컨테이너 앱 환경 만들기 페이지에서 기본이 아닌 워크로드 프로필을 추가하거나 영역 중복성을 사용하도록 설정할 수 있습니다. 환경에 대해 알아보려면 Azure Container Apps 환경을 참조하세요.

  6. 배포 탭을 선택하고 빠른 시작 이미지 사용을 선택 취소합니다. 그렇지 않으면 함수 앱이 함수 앱 언어의 기본 이미지에서 배포됩니다.

  7. 이미지 유형을 퍼블릭 또는 프라이빗 중에서 선택합니다. Azure Container Registry 또는 다른 프라이빗 레지스트리를 사용하는 경우 프라이빗을 선택합니다. 레지스트리 접두사를 포함한 이미지 이름을 입력합니다. 프라이빗 레지스트리를 사용하는 경우 이미지 레지스트리 인증 자격 증명을 입력합니다.

  8. 컨테이너 리소스 할당 아래에서 원하는 CPU 코어 수와 사용 가능한 메모리를 선택합니다. 환경에 다른 워크로드 프로필이 추가된 경우 기본이 아닌 워크로드 프로필을 선택할 수 있습니다. 이 페이지의 선택은 앱 호스팅 비용에 영향을 줍니다. 잠재적 비용을 추정하려면 Container Apps 가격 책정 페이지를 참조하세요.

  9. 검토 + 만들기를 선택하여 앱 구성 선택을 검토합니다.

  10. 검토 + 만들기 페이지에서 설정을 검토한 다음, 만들기를 선택하여 함수 앱을 프로비전하고 레지스트리에서 컨테이너 이미지를 배포합니다.

Azure Functions에서 이미지 작업

함수 앱 컨테이너가 레지스트리에서 배포되면 Functions는 원본 이미지에 대한 정보를 유지 관리합니다. 다음 명령을 사용하여 이미지에 대한 데이터를 가져오거나 사용된 배포 이미지를 변경합니다.

Container Apps 워크로드 프로필

워크로드 프로필은 배포 리소스를 보다 효율적으로 제어할 수 있는 Container Apps의 기능입니다. Azure Container Apps의 Azure Functions는 워크로드 프로필도 지원합니다. 자세한 내용은 Azure Container Apps의 워크로드 프로필을 참조하세요.

앱에 할당되는 CPU 및 메모리 리소스의 양을 설정할 수도 있습니다.

Azure CLI 또는 Azure Portal을 사용하여 워크로드 프로필과 리소스 할당을 모두 만들고 관리할 수 있습니다.

컨테이너 앱 환경을 만들 때 워크로드 프로필을 사용하도록 설정합니다. 예제는 프로필에서 컨테이너 앱 만들기를 참조하세요.

사용자 환경에서 프로필을 추가, 편집 및 삭제할 수 있습니다. 예제는 프로필 추가를 참조하세요.

워크로드 프로필을 사용하도록 설정된 환경에서 컨테이너화된 함수 앱을 만드는 경우 실행할 프로필도 지정해야 합니다. 이 예제와 같이 az functionapp create 명령의 --workload-profile-name 매개 변수를 사용하여 이 작업을 수행합니다.

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI>  --workload-profile-name <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

az functionapp create 명령에서 --environment 매개 변수는 Container Apps 환경을 지정하고 --image 매개 변수는 함수 앱에 사용할 이미지를 지정합니다. 이 예제에서는 <STORAGE_NAME>을 이전 섹션에서 스토리지 계정에 대해 사용한 이름으로 바꿉니다. 또한 <APP_NAME>을 사용자에게 적합한 전역 고유 이름으로 바꿉니다.

앱에 할당된 리소스를 설정하려면 <CPU_COUNT>를 원하는 가상 CPU 수(최소 0.5에서 프로필에서 허용하는 최대 수)로 바꿉니다. <MEMORY_SIZE>의 경우 전용 메모리 양을 1GB에서 프로필에서 허용되는 최대 크기까지 선택합니다.

az functionapp container set 명령을 사용하여 할당된 리소스 및 앱에서 사용하는 워크로드 프로필을 관리할 수 있습니다.

az functionapp container set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --workload-profile-name  <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

애플리케이션 설정

Azure Functions를 사용하면 컨테이너화된 함수 앱에 대한 애플리케이션 설정을 표준 방식으로 작업할 수 있습니다. 자세한 내용은 애플리케이션 설정 사용을 참조하세요.

Azure로의 지속적인 배포 사용

Important

현재는 탄력적 프리미엄 플랜에서 컨테이너를 실행하는 경우 Webhook 기반 배포가 지원되지 않습니다. 이 섹션에서 설명한 지속적인 배포 방법을 사용해야 하는 경우 App Service 요금제로 컨테이너를 배포하세요. 탄력적 프리미엄 플랜에서 실행하는 경우 리포지토리의 컨테이너를 업데이트할 때마다 앱을 수동으로 다시 시작해야 합니다.

레지스트리의 이미지를 업데이트할 때마다 Azure Functions에서 이미지 배포를 자동으로 업데이트하도록 설정할 수 있습니다.

  1. 다음 명령을 사용하여 지속적인 배포를 사용하도록 설정하고 webhook URL을 가져옵니다.

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    az functionapp deployment container config 명령은 지속적인 배포를 사용하도록 설정하고 배포 웹후크 URL을 반환합니다. az functionapp deployment container show-cd-url 명령을 사용하여 나중에 언제든지 이 URL을 검색할 수 있습니다.

    이전과 같이 <APP_NAME>을 함수 앱 이름으로 바꿉니다.

  2. 배포 웹후크 URL을 클립보드에 복사합니다.

  3. Docker Hub를 열어 로그인하고, 탐색 모음에서 리포지토리를 선택합니다. 이미지를 찾아 선택하고, Webhook 탭을 선택하고, Webhook 이름을 지정하고, URL을 Webhook URL에 붙여넣은 다음, 만들기를 선택합니다.

    Docker Hub 창에 웹후크를 추가하는 방법을 보여 주는 스크린샷

  4. 웹후크 세트를 사용하면 Docker Hub에서 이미지를 업데이트할 때마다 Azure Functions에서 해당 이미지를 다시 배포합니다.

SSH 연결 사용

SSH를 사용하면 컨테이너와 클라이언트 간의 보안 통신을 설정할 수 있습니다. SSH를 사용하면 App Service 고급 도구(Kudu)를 사용하여 컨테이너에 연결할 수 있습니다. SSH를 사용하여 컨테이너에 쉽게 연결할 수 있도록 Azure Functions는 이미 SSH를 사용하도록 설정된 기본 이미지를 제공합니다. Dockerfile을 편집한 다음, 해당 이미지를 다시 빌드하여 다시 배포하기만 하면 됩니다. 그런 다음, 고급 도구(Kudu)를 통해 컨테이너에 연결할 수 있습니다.

  1. 다음 예제와 같이 Dockerfile에서 -appservice 문자열을 FROM 명령의 기본 이미지에 추가합니다.

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    이 예제에서는 Node.js 버전 18 기본 이미지의 SSH 사용 버전을 사용합니다. Azure Functions 기본 이미지 리포지토리를 방문하여 최신 버전의 SSH 지원 기본 이미지를 사용하고 있는지 확인하세요.

  2. 다음 예제와 같이 docker build 명령에서 <DOCKER_ID>를 Docker Hub 계정 ID로 바꿔서 실행하여 이미지를 다시 빌드합니다.

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. 업데이트된 이미지를 Docker Hub로 푸시합니다. 첫 번째 푸시보다 시간이 훨씬 적게 걸립니다. 이제 이미지의 업데이트된 세그먼트만 업로드하면 되기 때문입니다.

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions에서 자동으로 이미지를 함수 앱으로 다시 배포합니다. 이 프로세스는 1분 이내에 수행됩니다.

  5. 브라우저에서 https://<app_name>.scm.azurewebsites.net/을 열고 <app_name>을 고유한 이름으로 바꿉니다. 이 URL은 함수 앱 컨테이너의 고급 도구(Kudu) 엔드포인트입니다.

  6. Azure 계정에 로그인한 다음, SSH를 선택하여 컨테이너와의 연결을 설정합니다. Azure에서 아직도 컨테이너 이미지를 업데이트하고 있는 경우 연결하는 데 몇 분 정도 걸릴 수 있습니다.

  7. 컨테이너와의 연결이 설정되면 top 명령을 실행하여 현재 실행 중인 프로세스를 확인합니다.

    SSH 세션 내 작동하는 Linux top 명령어를 보여 주는 스크린샷

다음 단계

다음 문서에서는 컨테이너 배포 및 관리에 대한 자세한 정보를 제공합니다.