Python 앱 배포

App Engine에서 앱을 업로드하고 실행하려면 앱을 배포합니다. 앱을 배포할 때 해당 앱의 버전과 관련 서비스를 App Engine에서 만듭니다. 모든 소스 코드와 구성 파일을 포함한 전체 앱을 배포하거나 개별 버전이나 구성 파일을 배포하고 업데이트할 수 있습니다.

앱을 프로그래매틱 방식으로 배포하려면 Admin API를 사용하세요.

시작하기 전에

앱을 배포하려면 다음 조건이 충족되어야 합니다.

  • Google Cloud 프로젝트의 소유자App Engine 애플리케이션을 만들어야 합니다.

  • 사용자 계정에 필요한 권한이 있는지 확인합니다.

  • 프로젝트에서 앱을 배포할 수 있는 권한을 Cloud Build에 부여합니다. 앱을 배포할 때 App Engine은 Cloud Build를 사용하여 컨테이너에 앱을 빌드하고 컨테이너를 앱 리전의 런타임에 배포합니다. Cloud Build에는 기본적으로 Python 2 앱을 배포할 수 있는 권한이 없으므로 앱을 배포하려면 먼저 권한을 부여해야 합니다.

gcloud CLI 설치

gcloud CLI를 사용하여 앱을 배포하려면 gcloud CLI를 다운로드, 설치, 초기화해야 합니다.

SDK 다운로드

이미 gcloud CLI가 설치되어 있고 초기화한 ID가 아닌 Google Cloud 프로젝트 ID를 사용하도록 구성하려면 CLI 구성 관리를 참조하세요.

프록시 사용

HTTP 또는 HTTPS 프록시를 사용하는 시스템에서 배포 명령어를 실행하려면 프록시를 통해 통신할 수 있도록 도구를 구성해야 합니다.

다음 명령어를 실행하여 gcloud CLI를 구성합니다.

gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]

프록시에 usernamepassword를 설정할 수도 있습니다. 자세한 내용은 gcloud config를 참조하세요.

앱 배포

App Engine에 앱을 배포하려면 구성 파일(예: app.yaml)이 있는 위치에서 gcloud app deploy 명령어를 사용합니다.

고유한 버전 ID 선택

수동으로 확장된 인스턴스의 경우, 버전 ID는 숫자 인스턴스 ID와 구분되도록 문자로 시작해야 합니다. 이렇게 하면 요청이 올바른 대상으로 라우팅되며 다음과 같이 두 가지로 해석될 수 있는 123-dot-my-service.[REGION_ID].r.appspot.com과 같은 URL 패턴의 모호성을 방지할 수 있습니다.

  • 123 버전이 있는 경우 요청은 my-service 서비스의 123 버전으로 라우팅됩니다.
  • 123 버전이 없으면 요청은 my-service 서비스의 버전이 실행되는 인스턴스 ID 123으로 라우팅됩니다.

자동 확장 또는 기본 확장으로 구성된 인스턴스는 지원되지 않으므로, 이 인스턴스 버전에 원하는 대로 이름을 지정할 수 있습니다.

gcloud app deploy [CONFIGURATION_FILES]

기본적으로 이 명령어는 현재 디렉터리에서 app.yaml 구성 파일을 배포합니다. 앱의 app.yaml가 없는 디렉터리에서 명령어를 실행할 경우나 여러 앱을 배포하려는 경우 [CONFIGURATION_FILES]를 구성 파일 하나 이상에 대한 경로로 바꿉니다. 단일 공백을 사용하여 경로 이름을 구분합니다.

선택적 플래그:

  • --version: 커스텀 버전 ID를 지정합니다. 기본적으로 App Engine은 버전 ID를 생성합니다.
  • --no-promote: 전체 트래픽을 해당 버전으로 자동 라우팅하지 않고 앱을 배포합니다. 기본적으로 배포하는 각 버전은 트래픽 전체를 수신하도록 자동으로 구성됩니다.
  • --project: 대체 Google Cloud 프로젝트 ID를 gcloud CLI에서 기본값으로 초기화한 값으로 지정합니다.

자세한 내용은 gcloud app deploy 참조를 확인하거나 명령줄에서 gcloud help를 실행하세요.

예:

gcloud app deploy
gcloud app deploy app.yaml dos.yaml index.yaml
gcloud app deploy --version [YOUR_VERSION_ID] --no-promote --project [YOUR_PROJECT_ID]

App Engine에 이미 존재하는 버전과 동일한 버전 ID를 지정하는 버전을 배포할 경우, 배포하는 파일이 기존 버전을 덮어쓰게 됩니다. 이 경우 해당 버전이 트래픽을 제공하면 애플리케이션 트래픽이 중단될 수 있으므로 문제가 발생할 수 있습니다. 버전 ID가 다른 새 버전을 배포한 후 이 버전으로 트래픽을 옮기면 트래픽 중단을 방지할 수 있습니다.

여러 서비스 애플리케이션 배포

애플리케이션이 여러 서비스에 반영되어 있으면 개별적으로 타겟팅된 서비스나 모든 서비스를 동시에 배포하고 업데이트할 수 있습니다. 서비스에 업데이트를 배포하는 작업에는 개별 구성 파일 업데이트 또는 해당 버전의 소스 코드 업데이트가 포함될 수 있습니다.

예를 들어 각 버전이 자체 서비스에서 실행되는 버전 두 개를 App Engine에서 배포하고 만들 수 있습니다. 한 버전은 앱의 프런트엔드 서비스로 작동하고 다른 버전은 백엔드로 작동합니다. 그런 다음 개별 구성 파일을 배포하여 서비스의 설정만 업데이트할 수 있습니다. 뿐만 아니라, 프런트엔드나 백엔드의 소스 코드를 업데이트하거나 두 소스 코드를 동시에 업데이트하기 위해 서비스에 새 버전을 배포할 수도 있습니다.

여러 서비스 요구사항

다음 요구사항에 따라 동일한 배포 명령어를 사용하여 애플리케이션의 여러 서비스를 배포하고 업데이트할 수 있습니다.

  • 먼저 애플리케이션 버전을 default 서비스로 배포해야 이후에 서비스를 만들고 배포할 수 있습니다.

  • 해당 버전의 app.yaml 구성 파일에서 서비스 ID를 지정해야 합니다. 서비스 ID를 지정하려면 구성 파일마다 service: [YOUR_SERVICE_ID] 요소 정의를 포함합니다. 기본적으로 구성 파일에서 이 요소 정의를 제외하면 해당 버전이 default 서비스에 배포됩니다.

  • 여러 서비스를 동시에 배포하려면 배포 명령어에 해당되는 모든 app.yaml 구성 파일을 지정해야 합니다.

여러 서비스 배포

구성 파일이 있는 애플리케이션의 루트 디렉터리에서 배포 명령어를 실행하여 각 서비스의 app.yaml 파일에 상대 경로와 파일 이름을 지정합니다.

gcloud app deploy [CONFIGURATION_FILES]

여기서 [CONFIGURATION_FILES]는 공백으로 구분한 1개 이상의 구성 파일 경로 및 이름입니다.

예시
gcloud app deploy main/app.yaml service1/app.yaml service2/app.yaml

각 서비스가 성공적으로 배포되면 명령줄을 통해 인증을 받습니다.

빌드 로그 보기

Cloud BuildGoogle Cloud 콘솔의 Cloud Build 기록 섹션에서 볼 수 있는 빌드 로그와 배포 로그를 스트리밍합니다. 앱 리전의 빌드를 보려면 페이지 상단에 있는 리전 드롭다운 메뉴를 사용하여 필터링할 리전을 선택합니다.

색인 업데이트

앱이 사용하는 색인을 만들거나 업데이트하려면 index.yaml 구성 파일을 Datastore에 업로드합니다. 아직 존재하지 않는 색인은 구성 파일이 업로드된 후에 만들어집니다.

Datastore가 모든 색인을 생성하는 데 시간이 걸릴 수 있으므로 App Engine에서 색인을 바로 사용할 수 없습니다. 앱이 이미 트래픽을 수신하도록 구성된 경우 아직 생성 중인 색인을 필요로 하는 쿼리에서 예외가 발생할 수 있습니다.

예외 발생을 방지하려면 모든 색인이 생성될 때까지 기다려야 합니다. 예를 들면 다음과 같습니다.

  • 버전을 배포하기 전에 Datastore에 index.yaml 구성 파일을 업로드합니다.

    1. index.yaml 파일을 Datastore에 업로드합니다.

      gcloud datastore indexes create index.yaml

      자세한 내용은 gcloud datastore 참조를 확인하세요.

    2. Google Cloud 콘솔을 사용하여 모든 색인의 상태를 모니터링합니다.

      Datastore 페이지로 이동

    3. 색인 생성 작업이 모두 완료되면 App Engine에 새 버전을 배포합니다.

  • 버전에 트래픽을 이전하거나 분할하기 전에 색인을 생성합니다.

    1. 트래픽을 해당 버전으로 라우팅하지 않고 새 버전을 배포합니다. 트래픽이 버전으로 라우팅되지 않도록 app.yamlindex.yaml 파일 모두 지정하고 --no-promote 플래그를 포함합니다.
      gcloud app deploy app.yaml index.yaml --no-promote
    2. Google Cloud 콘솔을 사용하여 모든 색인의 상태를 모니터링합니다.

      Datastore 페이지로 이동

    3. 모든 색인이 빌드되면 Google Cloud 콘솔을 사용하여 트래픽을 버전으로 마이그레이션하거나 분할합니다.

      버전 페이지로 이동

색인에 대한 자세한 내용은 Datastore 색인 구성을 참조하세요.

문제해결

다음은 일반적으로 발생할 수 있는 오류 메시지입니다.

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
Google Cloud 프로젝트에 필수 App Engine 애플리케이션이 포함되어 있지 않은 경우 gcloud app create 명령어 실행을 시도하면 gcloud app deploy 명령어가 실패할 수 있습니다. 소유자 역할이 있는 계정에만 App Engine 애플리케이션을 생성하는 데 필요한 권한이 있습니다.
Command not found
로컬 개발 서버 도구 설정 방법은 로컬 개발 서버 사용을 참조하세요.
Import Error
gcloud CLI와 원본 App Engine SDK를 모두 설치하면 PATH에 대한 항목이 서로 충돌하여 가져오기 오류가 발생할 수 있습니다. gcloud CLI 명령어를 실행할 때 오류가 발생하면 로컬 개발 서버 실행 안내를 따릅니다.
[400] The first service (module) you upload to a new application must be the 'default' service (module)
애플리케이션의 여러 서비스를 배포하고 만들려면 먼저 default 서비스를 배포하고 만들어야 합니다. default 서비스에 버전을 배포하는 방법에 대한 자세한 내용은 여러 서비스 애플리케이션 배포를 참조하세요.
Too Many Versions (403)
App Engine에는 애플리케이션의 배포 버전 수에 대한 제한이 있습니다. 이러한 제한은 무료 애플리케이션과 배포된 애플리케이션에서 서로 다르게 적용됩니다. Google Cloud 콘솔을 사용하여 이전 버전을 삭제한 후 최신 코드를 업로드할 수 있습니다.
[13] An internal error occurred while creating a Cloud Storage bucket.

App Engine이 애플리케이션 생성 리전과 동일한 리전에서 기본 Cloud Storage 멀티 리전 버킷을 만듭니다. 이 버킷은 애플리케이션의 콘텐츠를 저장하는 데 필요합니다. 이 오류는 다음 시나리오에서 이 버킷을 만들 수 없을 때 반환됩니다.

[13] An internal error occurred

이 오류는 App Engine의 app.yaml 구성 파일에 vpc_access_connector 키의 잘못된 리소스 name가 포함된 경우에 발생할 수 있습니다. name 필드에 서버리스 VPC 액세스 커넥터가 생성되는 올바른 프로젝트와 리전이 포함되어 있는지 확인합니다.

app.yaml 구성이 유효한지 확인한 후 Google Cloud SDK를 사용하여 서비스를 다시 배포하고 --verbosity=debug 플래그를 추가한 후 Cloud 지원에 연락하여 명령어 결과를 제공합니다.

기타 배포 오류

배포에 실패하면 Cloud Build API가 프로젝트에 사용 설정되어 있는지 확인합니다. 앱을 처음 배포할 때 App Engine은 이 API를 자동으로 사용 설정하지만 이후 누군가가 API를 중지하면 배포가 실패합니다.

다음 단계