다음을 통해 공유


자습서: Azure Container Apps 및 PostgreSQL을 사용하여 Python 웹앱 빌드 및 배포

이 문서는 Python 웹앱을 컨테이너화하고 Azure Container Apps 에 배포하는 방법에 대한 자습서 시리즈의 일부입니다. Container Apps를 사용하면 복잡한 인프라를 관리하지 않고 컨테이너화된 앱을 배포할 수 있습니다.

이 자습서에서는 다음을 수행합니다.

  • 클라우드에서 컨테이너 이미지를 빌드하여 Python 샘플 웹앱(Django 또는 Flask)을 컨테이너화합니다.
  • Azure Container Apps에 컨테이너 이미지를 배포합니다.
  • 컨테이너 앱이 샘플 앱이 데이터를 저장하는 Azure Database for PostgreSQL - 유연한 서버 인스턴스에 연결할 수 있도록 하는 환경 변수를 정의합니다.

다음 다이어그램에서는 컨테이너 이미지 빌드 및 배포와 같은 이 자습서의 작업을 강조 표시합니다.

이미지 빌드에 대한 부분이 수동으로 강조 표시된 Azure Container Apps에서 Python 앱을 배포하는 데 관련된 서비스 다이어그램입니다.

필수 구성 요소

Azure 구독이 없는 경우 시작하기 전에 무료 계정 만드십시오.

Azure CLI 명령을 Azure Cloud Shell에서 또는 Azure CLI가 설치된 워크스테이션에서 실행할 수 있습니다.

로컬로 실행하는 경우 다음 단계에 따라 로그인하고 이 자습서에 필요한 모듈을 설치합니다.

  1. 필요한 경우 Azure에 로그인하고 인증합니다.

    az login
    
  2. 최신 버전의 Azure CLI를 실행하고 있는지 확인합니다.

    az upgrade
    
  3. az extension add 명령을 사용하여 containerapprdbms-connect Azure CLI 확장을 설치하거나 업그레이드합니다.

    az extension add --name containerapp --upgrade
    az extension add --name rdbms-connect --upgrade
    

    참고 항목

    시스템에 설치된 확장을 나열하려면 az extension list 명령을 사용할 수 있습니다. 예를 들어:

    az extension list --query [].name --output tsv
    

샘플 앱 가져오기

샘플 코드를 포크하고 개발자 환경에 복제합니다.

  1. 샘플 앱(Django 또는 Flask)의 GitHub 리포지토리로 이동하여 포크를 선택합니다.

    단계에 따라 리포지토리를 GitHub 계정으로 포크합니다. 포크 또는 GitHub 계정 없이 로컬 컴퓨터에 직접 코드 리포지토리를 다운로드할 수도 있습니다. 그러나 다운로드 방법을 사용하는 경우 이 시리즈의 다음 자습서에서 CI/CD(지속적인 통합 및 지속적인 업데이트)를 설정할 수 없습니다.

  2. git clone 명령을 사용하여 포크된 리포지토리를 python 컨테이너 폴더에 복제합니다.

    # Django
    git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container
    
    # Flask
    # git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container
    
  3. 디렉터리를 변경합니다.

    cd python-container
    

웹앱 코드에서 컨테이너 이미지 빌드

이러한 단계를 수행하면 샘플 코드에서 빌드된 Docker 컨테이너 이미지가 포함된 Azure Container Registry 인스턴스가 생성됩니다.

  1. az group create 명령을 사용하여 리소스 그룹을 만듭니다.

    az group create \
        --name pythoncontainer-rg \
        --location <location>
    

    <위치>을(를) 명령 az account list-locations -o table출력의 Azure 위치 Name 값 중 하나로 바꿉니다.

  2. az acr create 명령을 사용하여 컨테이너 레지스트리를 만듭니다.

    az acr create \
        --resource-group pythoncontainer-rg \
        --name <registry-name> \
        --sku Basic \
        --admin-enabled
    

    <레지스트리 이름> 사용하는 이름은 Azure 내에서 고유해야 하며 5~50자의 영숫자를 포함해야 합니다.

  3. az acr login 명령을 사용하여 레지스트리에 로그인합니다.

    az acr login --name <registry-name>
    

    이 명령은 이름에 "azurecr.io"를 추가하여 정규화된 레지스트리 이름을 만듭니다. 로그인에 성공하면 "로그인 성공" 메시지가 나타납니다. 레지스트리를 만든 구독과 다른 구독에서 레지스트리에 액세스하려면 --suffix 스위치를 사용하십시오.

    로그인에 실패하면 Docker 디먼이 시스템에서 실행되고 있는지 확인합니다.

  4. az acr build 명령을 사용하여 이미지를 빌드합니다.

    az acr build \
        --registry <registry-name> \
        --resource-group pythoncontainer-rg \
        --image pythoncontainer:latest .
    

    이러한 고려 사항은 다음과 같습니다.

    • 명령의 끝에 있는 점(.)은 빌드할 소스 코드의 위치를 나타냅니다. 샘플 앱의 루트 디렉터리에서 이 명령을 실행하지 않는 경우 코드 경로를 지정합니다.

    • Azure Cloud Shell에서 명령을 실행하는 경우 git clone 사용하여 먼저 리포지토리를 Cloud Shell 환경으로 끌어옵니다. 그런 다음 점(.)이 올바르게 해석되도록 디렉터리를 프로젝트의 루트로 변경합니다.

    • (동일한--image) 옵션을 제외 -t 하면 명령은 로컬 컨텍스트 빌드를 레지스트리에 푸시하지 않고 큐에 대기합니다. 푸시하지 않고 빌드하면 이미지가 빌드되는지 확인하는 데 유용할 수 있습니다.

  5. az acr repository list 명령을 사용하여 컨테이너 이미지가 만들어졌는지 확인합니다.

    az acr repository list --name <registry-name>
    

참고 항목

이 섹션의 단계에서는 기본 서비스 계층에서 컨테이너 레지스트리를 만듭니다. 이 계층은 개발자 시나리오를 대상으로 하는 기능 집합 및 처리량을 사용하여 비용 최적화되며 이 자습서의 요구 사항에 적합합니다. 프로덕션 시나리오에서는 표준 또는 프리미엄 서비스 계층을 사용할 가능성이 높습니다. 이러한 계층은 향상된 수준의 스토리지 및 처리량을 제공합니다.

자세한 내용은 azure Container Registry 서비스 계층참조하세요. 가격 책정에 대한 정보를 보려면 Azure Container Registry 가격 책정을 참조하세요.

PostgreSQL 유연한 서버 인스턴스 만들기

샘플 앱(Django 또는 Flask)은 PostgreSQL 데이터베이스에 레스토랑 리뷰 데이터를 저장합니다. 이 단계에서는 데이터베이스를 포함할 서버를 만듭니다.

  1. az postgres flexible-server create 명령을 사용하여 Azure에서 PostgreSQL 서버를 만듭니다. 이 명령이 완료되기 전에 몇 분 동안 실행되는 것은 드문 일이 아닙니다.

    az postgres flexible-server create \
       --resource-group pythoncontainer-rg \
       --name <postgres-server-name>  \
       --location <location> \
       --admin-user demoadmin \
       --admin-password <admin-password> \
       --active-directory-auth Enabled \
       --tier burstable \
       --sku-name standard_b1ms \
       --public-access 0.0.0.0 
    

    다음 값을 사용합니다.

    • pythoncontainer-rg: 이 자습서에서 사용하는 리소스 그룹 이름입니다. 다른 이름을 사용한 경우 이 값을 변경합니다.

    • <postgres-server-name>: PostgreSQL 데이터베이스 서버 이름입니다. 이 이름은 모든 Azure에서 고유해야 합니다. 서버 엔드포인트가 https://<postgres-server-name>.postgres.database.azure.com. 허용되는 문자는 A에서 Z, 0에서 9, 및 하이픈(-)입니다.

    • <위치>: 웹앱에 사용한 것과 동일한 위치를 사용합니다. <위치>는 명령 az account list-locations -o table출력에서 나온 Azure 위치 Name 값 중 하나입니다.

    • <관리자-사용자 이름>: 관리자 계정의 사용자 이름입니다. azure_superuser, admin, administrator, root, guest또는 public수 없습니다. 이 자습서에서는 demoadmin 사용합니다.

    • <관리자 암호>: 관리자 사용자의 암호입니다. 다음 세 가지 범주에서 8~128자를 포함해야 합니다. 영문 대문자, 영문 소문자, 숫자 및 영숫자가 아닌 문자

      Important

      사용자 이름이나 비밀번호를 만들 때 달러 기호($) 문자를 사용하지 마세요. 나중에 이러한 값을 사용하여 환경 변수를 만들 때 해당 문자는 Python 앱을 실행하는 데 사용하는 Linux 컨테이너 내에서 특별한 의미를 줍니다.

    • --active-directory-auth: 이 값은 PostgreSQL 서버에서 Microsoft Entra 인증을 사용할 수 있는지 여부를 지정합니다. Enabled으로 설정하세요.

    • --sku-name: 가격 책정 계층 및 컴퓨팅 구성의 이름입니다. 예를 들어 Standard_B1ms. 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요. 사용 가능한 계층을 나열하려면 az postgres flexible-server list-skus --location <location>사용합니다.

    • --public-access: 0.0.0.0사용합니다. 컨테이너 앱과 같은 Azure 서비스에서 서버에 대한 공용 액세스를 허용합니다.

    참고 항목

    도구를 사용하여 로컬 워크스테이션에서 PostgreSQL 서버로 작업하려는 경우 az postgres flexible-server firewall-rule create 명령을 사용하여 워크스테이션의 IP 주소에 대한 방화벽 규칙을 추가해야 합니다.

  2. az ad sign-in-user show 명령을 사용하여 사용자 계정의 개체 ID를 가져옵니다. 다음 명령에서 이 ID를 사용합니다.

    az ad signed-in-user show --query id --output tsv
    
  3. az postgres flexible-server ad-admin create 명령을 사용하여 PostgreSQL 서버에서 사용자 계정을 Microsoft Entra 관리자로 추가합니다.

    az postgres flexible-server ad-admin create \
       --resource-group pythoncontainer-rg \
       --server-name <postgres-server-name>  \
       --display-name <your-email-address> \
       --object-id <your-account-object-id>
    

    계정 개체 ID의 경우 이전 단계에서 얻은 값을 사용합니다.

참고 항목

이 섹션의 단계에서는 버스트 가능한 가격 책정 계층에서 단일 vCore 및 제한된 메모리를 사용하여 PostgreSQL 서버를 만듭니다. 버스트 가능한 계층은 CPU를 지속적으로 완전하게 사용하지 않는 워크로드에 대한 저렴한 옵션이며, 이 튜토리얼의 요구 사항에 적합합니다. 프로덕션 워크로드의 경우 범용 또는 메모리 최적화 가격 책정 계층으로 업그레이드할 수 있습니다. 이러한 계층은 더 높은 성능을 제공하지만 비용이 증가합니다.

자세한 내용은 Azure Database for PostgreSQL - 유연한 서버의 컴퓨팅 옵션을 참조하세요. 가격 책정에 대한 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요.

서버에 데이터베이스 만들기

이 시점에서 PostgreSQL 서버가 있습니다. 이 섹션에서는 서버에 데이터베이스를 만듭니다.

restaurants_reviews데이터베이스를 만들기 위해 az postgres flexible-server db create 명령어를 사용하십시오.

az postgres flexible-server db create \
   --resource-group pythoncontainer-rg \
   --server-name <postgres-server-name> \
   --database-name restaurants_reviews

다음 값을 사용합니다.

  • pythoncontainer-rg: 이 자습서에서 사용하는 리소스 그룹 이름입니다. 다른 이름을 사용한 경우 이 값을 변경합니다.
  • <postgres-server-name>: PostgreSQL 서버의 이름입니다.

az postgres 유연한 서버 연결 명령을 사용하여 데이터베이스에 연결한 다음 psql 명령을 사용할 수도 있습니다. psql을 사용하는 경우 셸에 모든 종속성이 포함되어 있으므로 Azure Cloud Shell 사용하는 것이 더 쉽습니다.

Azure Database for PostgreSQL 유연한 서버에 연결하고 psql 또는 Azure Data Studio같은 PostgreSQL을 지원하는 IDE를 사용하여 데이터베이스를 만들 수도 있습니다. psql을 사용하는 단계는 이 문서의 뒷부분에서 PostgreSQL 데이터베이스 관리 ID 구성을 참조하세요.

사용자 할당 관리 ID 만들기

Azure에서 실행 중일 때 컨테이너 앱의 ID로 사용할 사용자 할당 관리 ID를 만듭니다.

참고 항목

사용자 할당 관리 ID를 만들려면 계정에 관리 ID 기여자 역할 할당이 필요합니다.

az identity create 명령을 사용하여 사용자 할당형 관리 ID를 만듭니다.

az identity create --name my-ua-managed-id --resource-group pythoncontainer-rg

PostgreSQL 데이터베이스에서 관리 ID 구성

PostgreSQL 서버에서 관리 ID를 역할로 구성한 다음 restaurants_reviews 데이터베이스에 필요한 권한을 부여합니다. Azure CLI 또는 psql을 사용하는 경우 서버 인스턴스에서 Microsoft Entra 관리자로 구성된 사용자를 사용하여 Azure PostgreSQL 서버에 연결해야 합니다. PostgreSQL 관리자로 구성된 Microsoft Entra 계정만 서버에서 관리 ID 및 기타 Microsoft 관리자 역할을 구성할 수 있습니다.

  1. az account get-access-token 명령을 사용하여 Azure 계정에 대한 액세스 토큰을 가져옵니다. 다음 단계에서 액세스 토큰을 사용합니다.

    az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken
    

    반환된 토큰이 깁니다. 다음 단계에서 명령에서 사용할 환경 변수의 값을 설정합니다.

    MY_ACCESS_TOKEN=<your-access-token>
    
  2. az postgres flexible-server execute 명령을 사용하여 사용자 할당 관리 ID를 PostgreSQL 서버에서 데이터베이스 역할로 추가합니다.

    az postgres flexible-server execute \
        --name <postgres-server-name> \
        --database-name postgres \
        --querytext "select * from pgaadauth_create_principal('"my-ua-managed-id"', false, false);select * from pgaadauth_list_principals(false);" \
        --admin-user <your-Azure-account-email> \
        --admin-password $MY_ACCESS_TOKEN
    

    다음 값을 사용합니다.

    • 관리 ID에 다른 이름을 사용한 경우, 해당 명령 pgaadauth_create_principalmy-ua-managed-id을(를) 관리 ID의 이름으로 바꾸십시오.

    • --admin-user 값의 경우 Azure 계정의 이메일 주소를 사용합니다.

    • --admin-password 값의 경우 따옴표 없이 이전 명령의 출력에서 액세스 토큰을 사용합니다.

    • 데이터베이스 이름이 postgres인지 확인하십시오.

    참고 항목

    로컬 워크스테이션에서 az postgres flexible-server execute 명령을 실행하는 경우 워크스테이션의 IP 주소에 대한 방화벽 규칙을 추가했는지 확인합니다. az postgres flexible-server firewall-rule create 명령을 사용하여 규칙을 추가할 수 있습니다. 다음 단계에서 명령에 대해서도 동일한 요구 사항이 있습니다.

  3. 다음 az postgres flexible-server execute 명령을 사용하여 사용자에게 할당된 관리 ID에 restaurants_reviews 데이터베이스에 필요한 권한을 부여하시오.

    az postgres flexible-server execute \
        --name <postgres-server-name> \
        --database-name restaurants_reviews \
        --querytext "GRANT CONNECT ON DATABASE restaurants_reviews TO \"my-ua-managed-id\";GRANT USAGE ON SCHEMA public TO \"my-ua-managed-id\";GRANT CREATE ON SCHEMA public TO \"my-ua-managed-id\";GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"my-ua-managed-id\";ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"my-ua-managed-id\";" \
        --admin-user <your-Azure-account-email> \
        --admin-password $MY_ACCESS_TOKEN
    

    다음 값을 사용합니다.

    • 관리 ID에 다른 이름을 사용한 경우 명령의 모든 my-ua-managed-id 인스턴스를 관리 ID의 이름으로 바꿉니다. 쿼리 문자열에는 5개의 인스턴스가 있습니다.

    • --admin-user 값의 경우 Azure 계정의 이메일 주소를 사용합니다.

    • --admin-password 값의 경우 따옴표 없이 이전 출력의 액세스 토큰을 사용합니다.

    • 데이터베이스 이름이 restaurants_reviews인지 확인하세요.

    이 Azure CLI 명령은 서버의 restaurants_reviews 데이터베이스에 연결하고 다음 SQL 명령을 실행합니다.

    GRANT CONNECT ON DATABASE restaurants_reviews TO "my-ua-managed-id";
    GRANT USAGE ON SCHEMA public TO "my-ua-managed-id";
    GRANT CREATE ON SCHEMA public TO "my-ua-managed-id";
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "my-ua-managed-id";
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO "my-ua-managed-id";
    

Container Apps에 웹앱 배포

컨테이너 앱은 보안 경계 역할을 하는Azure Container Apps 환경에 배포됩니다. 다음 단계에서 환경을 만들고 그 안에 컨테이너를 만듭니다. 그런 다음 웹 사이트가 외부에 표시되도록 컨테이너를 구성합니다.

이러한 단계에는 Azure Container Apps 확장,containerapp 이 필요합니다.

  1. az containerapp env create 명령을 사용하여 Container Apps 환경을 만듭니다.

    az containerapp env create \
    --name python-container-env \
    --resource-group pythoncontainer-rg \
    --location <location>
    

    <위치>는 명령 az account list-locations -o table의 출력에서 얻은 Azure 위치 Name 값 중 하나입니다.

  2. az acr credential show 명령을 사용하여 Azure Container Registry 인스턴스의 로그인 자격 정보를 얻습니다.

    az acr credential show -n <registry-name>
    

    5단계에서 컨테이너 앱을 만들 때 명령의 출력에서 반환된 사용자 이름과 암호 중 하나를 사용합니다.

  3. 사용자 할당 관리 ID의 클라이언트 ID 및 리소스 ID를 얻으려면 az identity show 명령을 사용하세요.

    az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query "[clientId, id]" --output tsv
    

    5단계에서 컨테이너 앱을 만들 때 명령 출력의 클라이언트 ID(GUID) 값과 리소스 ID를 사용합니다. 리소스 ID의 형식은 /subscriptions/<subscription-id>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id.

  4. 다음 명령을 실행하여 비밀 키 값을 생성합니다.

    python -c 'import secrets; print(secrets.token_hex())'
    

    5단계에서 컨테이너 앱을 만들 때 비밀 키 값을 사용하여 환경 변수를 설정합니다.

    참고 항목

    이 단계에서 보여 주는 명령은 Bash 셸용입니다. 환경에 따라 python3사용하여 Python을 호출해야 할 수 있습니다. Windows에서는 -c 매개 변수의 명령을 작은따옴표 대신 큰따옴표로 묶어야 합니다. 환경에 따라 py 또는 py -3사용하여 Python을 호출해야 할 수도 있습니다.

  5. az containerapp create 명령을 사용하여 환경에서 컨테이너 앱을 만듭니다.

    az containerapp create \
    --name python-container-app \
    --resource-group pythoncontainer-rg \
    --image <registry-name>.azurecr.io/pythoncontainer:latest \
    --environment python-container-env \
    --ingress external \
    --target-port <5000 for Flask or 8000 for Django> \
    --registry-server <registry-name>.azurecr.io \
    --registry-username <registry-username> \
    --registry-password <registry-password> \
    --user-assigned <managed-identity-resource-id> \
    --query properties.configuration.ingress.fqdn \
    --env-vars DBHOST="<postgres-server-name>" \
    DBNAME="restaurants_reviews" \
    DBUSER="my-ua-managed-id" \
    RUNNING_IN_PRODUCTION="1" \
    AZURE_CLIENT_ID="<managed-identity-client-id>" \
    AZURE_SECRET_KEY="<your-secret-key>"
    

    꺾쇠 괄호 안에 있는 모든 값을 이 자습서에서 사용 중인 값으로 바꿔야 합니다. 컨테이너 앱의 이름은 Azure에서 고유해야 합니다.

    --env-vars 매개 변수의 값은 다음 값이 있는 key="value" 형식의 공백으로 구분된 값으로 구성된 문자열입니다.

    • DBHOST="\<postgres-server-name>"
    • DBNAME="restaurants_reviews"
    • DBUSER="my-ua-managed-id"
    • RUNNING_IN_PRODUCTION="1"
    • AZURE_CLIENT_ID="\<managed-identity-client-id>"
    • AZURE_SECRET_KEY="\<your-secret-key>"

    DBUSER 값은 사용자가 할당한 관리 ID의 이름입니다.

    AZURE_CLIENT_ID 값은 사용자 할당 관리 ID의 클라이언트 ID입니다. 이전 단계에서 이 값을 얻었습니다.

    AZURE_SECRET_KEY 값은 이전 단계에서 생성한 비밀 키 값입니다.

  6. Django의 경우에만 데이터베이스 스키마를 마이그레이션하고 생성합니다. (Flask 샘플 앱에서는 자동으로 수행되며 이 단계를 건너뛸 수 있습니다.)

    az containerapp exec 명령어를 사용하여 연결합니다.

        az containerapp exec \
            --name python-container-app \
            --resource-group pythoncontainer-rg
    

    그런 다음 셸 명령 프롬프트에서 python manage.py migrate입력합니다.

    컨테이너의 수정 버전을 마이그레이션할 필요가 없습니다.

  7. 웹 사이트를 테스트합니다.

    이전에 입력한 az containerapp create 명령은 앱을 탐색하는 데 사용할 수 있는 애플리케이션 URL을 출력합니다. URL이 azurecontainerapps.io으로 끝납니다. 브라우저에서 URL로 이동합니다. 또는 az containerapp browse 명령을 사용할 수 있습니다.

다음은 레스토랑과 두 개의 리뷰를 추가한 후 샘플 웹 사이트의 예입니다.

이 자습서에서 빌드된 샘플 웹 사이트의 스크린샷

배포 문제 해결

웹 사이트에 액세스하기 위한 애플리케이션 URL을 잊어버렸습니다.

Azure Portal에서 다음을 수행합니다.

  • 컨테이너 앱의 개요 페이지로 이동하여 애플리케이션 URL찾습니다.

VS Code에서:

  1. Azure 보기(Ctrl+Shift+A)로 이동한 후 작업 중인 구독을 확장합니다.
  2. Container Apps 노드를 확장하고, 관리 환경을 확장하고, python-container-app마우스 오른쪽 단추로 클릭한 다음,열기 선택합니다. VS Code는 애플리케이션 URL을 사용하여 브라우저를 엽니다.

Azure CLI에서:

  • 명령 az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn사용합니다.

VS Code에서 Azure 작업의 빌드 이미지는 오류를 반환합니다.

"오류: 컨텍스트를 다운로드하지 못했습니다. VS Code 출력 창에서 URL이 잘못된지 확인한 후, Docker 확장에서 레지스트리를 새로 고치세요. 새로 고치려면 Docker 확장을 선택하고 레지스트리 섹션으로 이동하여 레지스트리를 찾은 다음 선택합니다.

Azure 작업에서 빌드 이미지를 다시 실행하는 경우 이전 실행의 레지스트리가 있는지 확인합니다. 그렇다면 사용해요.

Azure Portal에서 컨테이너 앱을 만드는 동안 액세스 오류가 표시됩니다.

Azure Container Registry 인스턴스의 관리자 자격 증명을 사용하지 않도록 설정하면 "ACR '<이름>.azurecr.io'에 액세스할 수 없음"이 포함된 액세스 오류가 발생합니다.

포털에서 관리자 상태를 확인하려면 Azure Container Registry 인스턴스로 이동하여 액세스 키 리소스를 선택하고 관리 사용자 사용하도록 설정되어 있는지 확인합니다.

컨테이너 이미지가 Azure Container Registry 인스턴스에 표시되지 않음

  • Azure CLI 명령 또는 VS Code 출력의 출력을 확인하고 성공을 확인하는 메시지를 찾습니다.
  • Azure CLI를 사용하여 빌드 명령이나 VS Code 작업 프롬프트에서 레지스트리 이름이 올바르게 지정되었는지 확인합니다.
  • 자격 증명이 만료되지 않았는지 확인합니다. 예를 들어 VS Code에서 Docker 확장에서 대상 레지스트리를 찾아 새로 고칩니다. Azure CLI에서 az login실행합니다.

웹 사이트에서 "잘못된 요청(400)"을 반환합니다.

"잘못된 요청(400)" 오류가 발생하면 컨테이너에 전달된 PostgreSQL 환경 변수를 확인합니다. 400 오류는 Python 코드가 PostgreSQL 인스턴스에 연결할 수 없음을 나타내는 경우가 많습니다.

이 자습서에 사용된 샘플 코드는 RUNNING_IN_PRODUCTION컨테이너 환경 변수가 존재하는지 확인하며, 이 변수는 1같은 모든 값으로 설정할 수 있습니다.

웹 사이트에서 "찾을 수 없음(404)"을 반환합니다.

  • 컨테이너에 대한 개요 페이지에서 애플리케이션 URL 값을 확인합니다. 애플리케이션 URL에 "internal"이라는 단어가 포함된 경우 인그레스가 올바르게 설정되지 않습니다.
  • 컨테이너의 수신을 확인합니다. 예를 들어, Azure Portal에서 컨테이너의 수신 리소스로 이동합니다. HTTP 수신 사용하도록 설정되어 있는지 확인하고 선택한 모든 곳에서 트래픽을 허용합니다.

웹 사이트가 시작되지 않거나 "스트림 시간 제한"이 표시되거나 아무것도 반환되지 않습니다.

  • 로그를 확인합니다.
    • Azure Portal에서 컨테이너 앱의 수정 관리 리소스로 이동하여 컨테이너에 대한 프로비전 상태 확인합니다.
      • 상태가 프로비저닝인 경우, 프로비전이 완료될 때까지 기다리십시오.
      • 상태가 실패경우 수정 버전을 선택하고 콘솔 로그를 봅니다. 표시할 열의 순서를 선택하세요: 시간 생성, Stream_s, Log_s. 로그를 가장 최근으로 정렬하고 Stream_s 열에서 Python stderrstdout 메시지를 찾습니다. Python print 출력은 stdout 메시지입니다.
    • Azure CLI에서 az containerapp logs show 명령을 사용합니다.
  • Django 프레임워크를 사용하는 경우 데이터베이스에 restaurants_reviews 테이블이 있는지 확인합니다. 그렇지 않은 경우 콘솔을 사용하여 컨테이너에 액세스하고 실행 python manage.py migrate합니다.

다음 단계