- 인쇄
- PDF
Python
- 인쇄
- PDF
Classic 환경에서 이용 가능합니다.
Python 형식의 액션을 생성하고 다양하게 활용하는 방법과 예제를 소개합니다.
액션 생성
Python으로 작성한 코드는 여러 개의 함수를 포함할 수 있지만 Main 함수는 프로그램의 시작점으로써 반드시 선언되어야 합니다. 이 점을 고려하여 이름과 장소를 포함하여 "Hello World"를 출력하는 Python 형식의 간단한 예제 코드 hello
는 다음과 같습니다.
def main(args):
name = args.get("name", "World")
place = args.get("place", "Naver")
greeting = "Hello " + name + " in " + place + "!"
print(greeting)
return {"payload": greeting}
위에서 작성한 코드를 사용하여 콘솔에서 'hello'라는 이름의 액션을 생성하는 과정은 다음과 같습니다.
의존성 파일을 함께 패키징하여 액션 생성
코드를 작성하다 보면 하나의 액션 외에 의존 모듈을 함께 패키징해야 하는 경우가 있습니다. 이러한 경우 관련된 파일들을 하나의 모듈로 패키징하고, 패키징된 파일을 이용하여 액션을 생성할 수 있습니다.
함수에 접근하기 위한 entry point인 main
함수는 __main__.py 파일 안에 정의되어 있어야 합니다. 예를 들어 메인 액션에서 사용되는 함수들이 작성된 helper.py 파일과 함께 패키징하여 액션을 생성하고 싶은 경우 다음 명령어를 사용하여 액션과 관련된 파일들을 helloPython.zip으로 압축합니다.
zip -r helloPython.zip __main__.py helper.py
이후 생성된 압축 파일을 사용하여 액션을 생성할 수 있습니다.
virtual environment와 함께 패키징하여 액션 생성
virtual environment와 함께 패키징하여 액션을 생성하는 방법을 운영체제 환경별로 설명합니다.
Linux & Mac
Cloud Functions에서 기본으로 제공되는 라이브러리 외 추가 라이브러리를 사용하기 위해 virtual environment(virtualenv
)를 사용하여 함께 패키징할 수 있습니다. 기본적으로 지원하는 패키징 방법과 동일하게 메인 함수는 __main__.py 파일 안에 정의되어 있어야 하며 virtualenv의 폴더 이름은 반드시 'virtualenv'로 설정해야 합니다.
virtual environment를 구축하여 Cloud Functions에서 제공하지 않는 pyjokes 라이브러리를 사용하여 joke를 반환하는 액션을 생성하는 예제는 다음과 같습니다.
virtualenv 이름을 가지는 virtualenv 환경을 구축해 주십시오.
virtualenv virtualenv source virtualenv/bin/activate pip install pyjokes
__main__.py에서
get_joke()
메서드를 호출하여 joke를 반환하는 코드를 작성해 주십시오.import pyjokes def main(args): return {"joke": pyjokes.get_joke()}
virtualenv 폴더와 __main__.py 파일을 함께 압축해 주십시오.
zip -r jokes.zip virtualenv __main__.py
생성된 압축 파일을 사용하여 액션을 생성해 주십시오.
Cloud Functions는 최대 액션 소스 코드의 크기가 38MB로 제한되어 있습니다. 따라서 사용하는 라이브러리가 많아 파일 크기가 제한 용량을 넘어가는 경우 배포가 제한될 수 있으며, 자주 사용되지 않는 액션의 경우 컨테이너가 cold 상태로 전환되어 초기 액션 실행 시간이 늘어날 수 있습니다.
Windows
Windows 환경에서는 Linux와 Mac 환경의 virtualenv와 동일한 형태로 지원이 어렵기 때문에 가상 환경을 구성하여 패키지화하는 두 가지 방법을 설명합니다. 단, Python이나 pip는 이미 설치되어 있는 상태여야 합니다.
- Docker를 사용하여 패키지화하는 방법: Docker를 이용할 수 있는 개발 환경인 경우 간단히 가상으로 개발 환경을 구성하여 패키지화할 수 있습니다. 패키지화하는 순서는 다음과 같습니다.
- 사용 중인 운영체제에 해당하는 Docker for Windows(Community Edition)나 Docker Toolbox를 설치해 주십시오.
(참고: https://www.docker.com/docker-windows) - 소스 코드 __main__.py를 작성해 주십시오.
import pyjokes def main(args): return {"joke": pyjokes.get_joke()}
- requirements.txt 파일을 작성해 주십시오.
pyjokes==0.5.0
- Docker 명령어를 사용하여 zip 파일을 생성해 주십시오.
- 다음과 같은 파일 구조에서 작업 경로를
C:\WorkingDir
로 가정c:\WorkingDir>dir XXXX-XX-XX 오후 09:07 <DIR> . XXXX-XX-XX 오후 09:07 <DIR> .. XXXX-XX-XX 오후 09:07 200 __main__.py XXXX-XX-XX 오후 09:07 100 requirements.txt ```
- Docker 명령어 실행: docker를 이용해서 가상의 개발 환경 생성 후 해당 환경을 압축해서 zip 파일로 생성하는 과정까지 함축
c:\WorkingDir> docker run --rm -v "\\C:\WorkingDir:/tmp" python:3.7.4-alpine /bin/sh -c 'mkdir workdir && cp -R /tmp/* /workdir/ && rm -rf /workdir/virtualenv && pip install virtualenv && apk add --no-cache zip && cd /workdir && virtualenv virtualenv && source virtualenv/bin/activate && pip install -r requirements.txt && zip -r /tmp/project.zip ./*'
- 다음과 같은 파일 구조에서 작업 경로를
- 압축한 파일을 업로드하여 액션을 생성해 주십시오.
- 사용 중인 운영체제에 해당하는 Docker for Windows(Community Edition)나 Docker Toolbox를 설치해 주십시오.
requirements.txt는 의존성 라이브러리의 버전을 알거나 작성 방법을 아는 경우 https://pip.pypa.io/en/stable/를 참고하여 직접 작성이 가능합니다. 만약 작성 방법을 모르면 Windows용 virtualenv를 설치한 다음pip freeze
를 이용하여 작성할 수 있습니다.
c:\WorkingDir>pip install virtualenv
c:\WorkingDir>virtualenv virtualenv
c:\WorkingDir>c:\WorkingDir\virtualenv\Scripts\activate
(virtualenv) c:\WorkingDir>pip freeze > requirements.txt
- 의존성 라이브러리들만 따로 패키지화하는 방법: Docker와 같은 추가 환경 구성이 어렵다면, windows용 python virtualenv에서 내 코드와 의존성 라이브러리들만 따로 압축해서 패키징할 수 있습니다. 패키지화하는 순서는 다음과 같습니다.
- 소스 코드 __main__.py를 작성해 주십시오.
import pyjokes def main(args): return {"joke": pyjokes.get_joke()}
- Virtualenv를 생성하고 의존성 패키지 설치 및 복사를 진행해 주십시오.
c:\WorkingDir>pip install virtualenv c:\WorkingDir>virtualenv virtualenv c:\WorkingDir>c:\WorkingDir\virtualenv\Scripts\activate (virtualenv) c:\WorkingDir>pip install pyjokes (virtualenv) c:\WorkingDir>xcopy .\virtualenv\Lib\site-packages\*.* .\ /e /h /k
- 작업 경로
c:\WorkingDir
내virtualenv
폴더를 제외하고 모두 zip 파일로 압축해 주십시오.
- 압축한 파일을 업로드하여 액션을 생성해 주십시오.
- 소스 코드 __main__.py를 작성해 주십시오.
requirements.txt와 함께 패키징하여 액션 생성
직접 virtual environment를 구성하여 패키징하지 않고, 액션 실행에 필요한 필수 의존성 라이브러리가 명시된 requirements.txt와 함께 __main__.py를 패키징하여 액션을 생성할 수 있습니다.
이 방법으로 생성된 액션의 경우, 컨테이너가 cold 상태에서 실행될 때 virtual environment를 구성하고 의존성 라이브러리들을 설치하게 됩니다.
- Python: 3.11 버전 이상의 런타임에서만 이용 가능합니다.
- 패키징되는 필수 의존성 라이브러리 목록의 파일 이름은 반드시 requirements.txt이어야 합니다.
- 의존성 라이브러리 설치를 위해 인터넷 통신이 필요합니다. 액션이 연동되는 Private Subnet에서 인터넷 통신을 위해 NAT Gateway 설정이 반드시 필요합니다. 설정 방법은 NAT Gateway 사용 가이드를 참조해 주십시오.
- requirements.txt 이름을 가지는 의존성 라이브러리들 목록을 작성해 주십시오.
pyjokes==0.6.0
- __main__.py에서
get_joke()
메서드를 호출하여 joke를 반환하는 코드를 작성해 주십시오.import pyjokes def main(args): return {"joke": pyjokes.get_joke()}
- requirements.txtx와 __main__.py 파일을 함께 압축해 주십시오.
$ zip -r jokes-with-dependencies.zip requirements.txt __main__.py
- 생성된 압축 파일을 사용하여 액션을 생성해 주십시오.
- 액션 컨테이너 내에서 vritual environment를 구성하고 필수 의존성 라이브러리를 설치하는 과정은 메모리 사용량이 많은 작업입니다. 따라서 설치되어야 하는 라이브러리가 많거나 용량이 큰 경우 액션 컨테이너의 메모리 제한을 초과하여, 액션 실행이 실패될 수 있습니다.
- 또한 설치를 위해 최소한으로 필요한 pip 버전이 맞지 않는 등의 이유로, 컨테이너 내에 구성되는 virtual environment 환경에 특정 의존성을 설치하는 것이 제한되어 액션 실행이 실패될 수 있습니다.
- 메모리 제한, pip 버전 등의 이유로 필수 의존성 라이브러리 설치가 제한 되는 경우, 직접 virtual environment 구성하고 패키징하여 액션을 생성하는 방법 이용을 권장 드립니다.