Python 3.9는 이제 일반 안정화 버전으로 제공됩니다.

Python 3 런타임 환경

Python 3 런타임은 웹 서비스의 코드 및 종속 항목을 설치하고 서비스를 실행하는 소프트웨어 스택입니다.

표준 환경에서 App Engine용 Python 3 런타임은 app.yaml 파일에서 선언됩니다.

Python 3 버전

Python 3 런타임은 Python 3.7, Python 3.8, Python 3.9를 지원하며 app.yaml 파일에 지정된 안정적인 최신 출시 버전을 사용합니다. App Engine은 새로운 패치 출시 버전으로 자동 업데이트되지만 부 버전은 자동으로 업데이트되지 않습니다.

예를 들어 애플리케이션은 Python 3.7.0에 배포된 후 자동으로 Python 3.7.1로 업데이트될 수 있지만 다음 부 버전인 Python 3.8.0으로 자동 업데이트되지 않습니다.

직접 사용해 보기

Google Cloud를 처음 사용하는 경우 계정을 만들어 실제 시나리오에서 App Engine의 성능을 평가할 수 있습니다. 또한 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.

App Engine 무료로 사용해 보기

종속 항목

배포하는 동안 App Engine은 Python 패키지 관리자 pip를 사용하여 프로젝트의 루트 디렉터리에 있는 requirements.txt 메타데이터 파일에 정의된 종속 항목을 설치합니다. App Engine이 새로 설치를 수행하기 때문에 종속 항목을 업로드하지 않아도 됩니다.

Pipfile/Pipfile.lock 표준을 사용하는 종속 항목 사양은 현재 지원되지 않으며 프로젝트에 이러한 파일이 없어야 합니다.

애플리케이션 시작

런타임은 app.yaml 파일의 entrypoint 필드에 지정한 명령어를 실행하여 앱을 시작합니다. 이 진입점은 PORT 환경 변수에 지정된 포트에서 수신 대기하는 웹 서버를 시작해야 합니다. 예를 들면 다음과 같습니다.

entrypoint: gunicorn -b :$PORT main:app

앱에서 사용하는 웹 프레임워크는 요청을 앱의 적절한 핸들러로 라우팅하는 역할을 합니다.

앱이 다음 요구사항을 충족하고 entrypoint 필드가 지정되지 않는 경우 App Engine이 gunicorn 웹 서버로 앱을 시작합니다.

  • 앱 디렉터리의 루트에는 app이라는 WSGI 호환 객체가 있는 main.py 파일이 포함되어 있습니다.

  • 앱에는 Pipfile이나 Pipfile.lock 파일이 없습니다.

entrypoint 필드를 지정하지 않으면 App Engine이 requirements.txt 파일에 gunicorn을 자동으로 추가합니다.

진입점 권장사항

  • 진입점을 지정하지 않았다면 requirements.txt 파일에 gunicorn을 포함해선 안 됩니다.

  • 최상의 성능을 얻으려면 진입점은 가벼워야 합니다. 애플리케이션의 새 인스턴스가 생성될 때마다 실행되기 때문입니다.

  • 진입점 필드를 사용하여 앱의 성능을 조정할 수 있습니다. 예를 들어 gunicorn을 웹 서버로 사용하는 경우, 진입점 필드에서 --workers 플래그를 사용하여 앱을 제공하는 작업자 수를 구성할 수 있습니다.

    지정한 작업자 수가 App Engine 앱의 인스턴스 클래스와 일치해야 합니다.

    인스턴스 클래스 작업자
    F1 1
    F2 2
    F4 4
    F4_1G 8
    B1 1
    B2 2
    B4 4
    B4_1G 8
    B8 8

    이 지침은 작업자 수를 선택하는 출발지 역할을 합니다. 앱의 성능 특성에 따라 다른 작업자 수를 사용해야 할 수도 있습니다. 아래 예시는 앱 제공에 2개의 gunicorn 작업자를 사용하는 App Engine 배포를 보여줍니다.

    entrypoint: gunicorn -b :8080 -w 2 main:app
    

기타 웹 프레임워크

Django 및 Flask 외에도 uwsgiTornado와 같은 다른 웹 프레임워크를 App Engine과 함께 사용할 수 있습니다. 다음 예시에서는 uwsgi를 App Engine과 함께 사용하는 방법을 보여줍니다.

runtime: python39
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.19.1
flask==1.1.2

환경 변수

다음 환경 변수는 런타임에서 설정됩니다.

환경 변수 설명
GAE_APPLICATION App Engine 애플리케이션 ID입니다. 이 ID는 유럽에 배포된 애플리케이션의 'e~'와 같이 'region code~'로 시작됩니다.
GAE_DEPLOYMENT_ID 현재 배포 ID입니다.
GAE_ENV App Engine 환경입니다. standard로 설정합니다.
GAE_INSTANCE 서비스가 현재 실행되고 있는 인스턴스 ID입니다.
GAE_MEMORY_MB 애플리케이션 프로세스에 제공되는 메모리 양(MB)입니다.
GAE_RUNTIME app.yaml 파일에 지정된 런타임입니다.
GAE_SERVICE app.yaml 파일에 지정된 서비스 이름입니다. 서비스 이름을 지정하지 않으면 default로 설정됩니다.
GAE_VERSION 서비스의 현재 버전 라벨입니다.
GOOGLE_CLOUD_PROJECT 애플리케이션과 연결된 Cloud 프로젝트 ID입니다.
PORT HTTP 요청을 수신하는 포트입니다.

app.yaml 파일에 추가 환경 변수를 정의할 수 있지만 위 값을 재정의할 수 없습니다.

HTTPS 및 전달 프록시

App Engine은 부하 분산기에서 HTTPS 연결을 종료하고 애플리케이션에 요청을 전달합니다. 일부 애플리케이션에서는 원본 요청 IP와 프로토콜을 확인해야 합니다. 사용자의 IP 주소는 표준 X-Forwarded-For 헤더에서 제공됩니다. 이 정보가 필요한 애플리케이션은 프록시를 신뢰하도록 웹 프레임워크를 구성해야 합니다.

파일 시스템

런타임은 전체 파일 시스템을 포함합니다. 파일 시스템은 App Engine 인스턴스의 RAM에 데이터를 저장하는 가상 디스크인 /tmp 위치를 제외하고 읽기 전용입니다.

메타데이터 서버

애플리케이션의 각 인스턴스는 App Engine 메타데이터 서버를 사용하여 인스턴스와 프로젝트에 대한 정보를 쿼리할 수 있습니다.

다음 엔드포인트를 통해 메타데이터 서버에 액세스할 수 있습니다.

  • http://metadata
  • http://metadata.google.internal

다음 표에는 특정 메타데이터에 대해 HTTP 요청을 수행할 수 있는 엔드포인트가 나열되어 있습니다.

메타데이터 엔드포인트 설명
/computeMetadata/v1/project/numeric-project-id 프로젝트에 할당된 프로젝트 번호입니다.
/computeMetadata/v1/project/project-id 프로젝트에 할당된 프로젝트 ID입니다.
/computeMetadata/v1/instance/zone 인스턴스가 실행 중인 영역입니다.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email 프로젝트에 할당된 기본 서비스 계정 이메일입니다.
/computeMetadata/v1/instance/service-accounts/default/ 프로젝트의 모든 기본 서비스 계정이 나열됩니다.
/computeMetadata/v1/instance/service-accounts/default/scopes 기본 서비스 계정에 지원되는 모든 범위가 나열됩니다.
/computeMetadata/v1/instance/service-accounts/default/token 다른 Google Cloud APIs에 애플리케이션을 인증하기 위해 사용할 수 있는 인증 토큰을 반환합니다.

예를 들어 프로젝트 ID를 검색하려면 http://metadata.google.internal/computeMetadata/v1/project/project-id에 요청을 보냅니다.