Python의 종속 항목 지정

Python으로 작성된 Cloud Functions를 위한 종속 항목을 지정하는 방법은 두 가지로, pip 패키지 관리자의 requirements.txt 파일을 사용하는 방법 또는 로컬 종속 항목을 함수와 함께 패키징하는 방법이 있습니다.

Pipfile/Pipfile.lock 표준을 사용하는 종속 항목 사양은 지원되지 않습니다. 프로젝트에 이러한 파일이 존재해선 안 됩니다.

pip를 사용하여 종속 항목 지정

Python의 종속 항목은 pip로 관리되며 requirements.txt라는 메타데이터 파일로 표현됩니다. 이 파일은 함수 코드가 포함된 main.py 파일과 동일한 디렉터리에 있어야 합니다.

함수를 배포 또는 재배포할 때 Cloud Functions는 requirements.txt 파일에 선언된 대로 pip를 사용해서 최신 버전의 종속 항목을 다운로드하고 설치합니다. requirements.txt 파일에는 패키지당 한 줄이 포함됩니다. 각 줄에는 패키지 이름과 선택사항으로 요청된 버전이 포함됩니다. 자세한 내용은 requirements.txt 참조를 참조하세요.

해당 빌드가 종속 항목 버전 변경사항의 영향을 받지 않도록 방지하려면 종속 항목 패키지를 특정 버전으로 고정하는 것이 좋습니다.

다음은 requirements.txt 파일의 예시입니다.

functions-framework
requests==2.20.0
numpy

함수 프레임워크는 모든 함수에 필요한 종속 항목입니다. Cloud Functions는 함수 생성 시 이를 자동으로 설치하지만 명확히 하자면 명시적 종속 항목으로 포함하는 것이 좋습니다.

함수에서 비공개 종속 항목을 사용하는 경우 functions-framework를 비공개 레지스트리에 미러링하는 것이 좋습니다. 미러링된 functions-framework를 함수에 대한 종속 항목으로 포함하여 공개 인터넷에서 패키지를 설치하지 않도록 합니다.

로컬 종속 항목 패키징

함수와 함께 종속 항목을 패키징하고 배포할 수도 있습니다. 이 방법은 pip 패키지 관리자를 통해 종속 항목을 사용할 수 없거나 Cloud Functions 환경의 인터넷 액세스가 제한된 경우에 유용합니다.

예를 들어 다음과 같은 디렉터리 구조를 사용할 수 있습니다.

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

그런 다음 import 문을 사용하여 localpackage에서 평소처럼 코드를 가져올 수 있습니다.

# Code in main.py
from localpackage import script

이 방법은 setup.py 파일을 실행하지 않습니다. 이러한 파일이 포함된 패키지는 계속 번들로 제공될 수 있지만 Cloud Functions에서 올바르게 실행되지 않을 수 있습니다.

벤더링 종속 항목

벤더링 종속 항목은 소스가 소스 코드 패키지에 직접 포함되어 있고 고유 코드와 함께 다시 빌드되는 종속 항목입니다. GOOGLE_VENDOR_PIP_DEPENDENCies 빌드 환경 변수를 사용하여 벤더링 pip 종속 항목을 만들고 배포 중에 설치하지 마세요.

벤더링 종속 항목 만들기

  1. 개발 시스템에 python3가 설치되어 있는지 확인합니다.

  2. 개발 트리 루트 디렉터리의 requirements.txt 파일에 애플리케이션 종속 항목을 선언합니다.

  3. requirements.txt 파일의 별도의 줄에 functions-framework를 포함하여 함수 프레임워크를 요구사항으로 선언합니다.

  4. 함수의 종속 항목을 로컬 디렉터리에 다운로드합니다. 이를 수행하는 단계는 종속 항목이 Python wheel(*.whl) 파일인지 또는 tar 파일(*.tar.gz)인지에 따라 다릅니다.

    1. 종속 항목이 Python wheel(*.whl)인 경우 다음 pip 명령어를 사용하여 개발 트리의 루트 디렉터리에 다운로드합니다.

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_NAME \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      다음과 같이 바꿉니다.

      • DIRECTORY: 다운로드할 로컬 디렉터리의 이름
      • PYTHON_RUNTIME_NAME: 호환성 검사에 사용할 Python 버전

      결과 디렉터리 구조는 다음과 같습니다.

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. 종속 항목이 tar 파일인 경우(*.tar.gz):

      1. 종속 항목이 Python으로 작성된 경우 pip를 사용하여 다운로드합니다.

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. 종속 항목이 C 또는 C++로 작성된 코드로 구성된 경우 별도로 다운로드하고 컴파일해야 합니다.

  5. 함수 및 벤더링 종속 항목을 배포합니다.

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    다음과 같이 바꿉니다.

    • FUNCTION_NAME: 배포 중인 Cloud Functions 함수 이름
    • PYTHON_RUNTIME_NAME: 배포된 함수를 실행할 Python 런타임의 이름(예: python311). 이 버전은 로컬 개발 환경에서 사용한 것과 동일한 Python 런타임 버전이어야 합니다.
    • DIRECTORY: 벤더링 종속 항목이 포함된 디렉터리의 이름

빌드팩 사용에 대한 자세한 내용은 빌드팩으로 함수 빌드를 참조하세요.

비공개 종속 항목 사용

Artifact Registry의 비공개 종속 항목

Artifact Registry Python 저장소는 Python 함수의 비공개 종속 항목을 호스팅할 수 있습니다. Cloud Functions에 배포할 때 빌드 프로세스는 Cloud Build 서비스 계정의 Artifact Registry 사용자 인증 정보를 자동으로 생성합니다. 추가 사용자 인증 정보를 생성하지 않고도 requirements.txt에 Artifact Registry URL만 포함하면 됩니다. 예를 들면 다음과 같습니다.

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

빌드에 여러 저장소가 필요한 경우 Artifact Registry 가상 저장소를 사용하여 pip가 저장소를 검색하는 순서를 안전하게 제어합니다.

다른 저장소의 비공개 종속 항목

종속 항목은 SSH 키 액세스를 제공하지 않는 Cloud Build 환경에 설치됩니다. SSH 기반 인증이 필요한 저장소에 호스팅되는 패키지는 이전 섹션에 설명된 대로 프로젝트 코드와 함께 벤더링 및 업로드되어야 합니다.

pip install 명령어를 -t DIRECTORY 플래그와 함께 사용하면 앱을 배포하기 전에 다음과 같이 비공개 종속 항목을 로컬 디렉터리에 복사할 수 있습니다.

  1. 종속 항목을 로컬 디렉터리에 복사합니다.

    pip install -t DIRECTORY DEPENDENCY
  2. __init__.py 파일을 DIRECTORY 디렉터리에 추가하여 모듈로 변환합니다.

  3. 이 모듈에서 가져와서 종속 항목을 사용합니다.

    import DIRECTORY.DEPENDENCY

사전 설치 패키지

다음 Python 패키지는 배포 중 함수와 함께 자동으로 설치됩니다. 함수 코드에서 이러한 패키지를 사용하는 경우 requirements.txt 파일에 다음 버전을 포함하는 것이 좋습니다.

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

Python 3.8 이상

click==8.1.7
cloudevents==1.9.0
deprecation==2.1.0
Flask==2.2.5
functions-framework==3.0.0
gunicorn==20.1.0
importlib-metadata==6.7.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
packaging==23.1
typing_extensions==4.7.1
watchdog==1.0.2
Werkzeug==2.2.3
zipp==3.15.0

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

또한 Python 런타임에는 실행 환경에 여러 시스템 패키지가 포함되어 있습니다. 함수가 목록에 없는 시스템 패키지를 필요로 하는 종속 항목을 사용하면 패키지를 요청할 수 있습니다.