Python 액션 사용하기

액션 생성하기

먼저 아래와 같이 이름과 장소를 포함한, "Hello World"를 출력하는 간단한 Python 액션인 'hello'를 작성합니다.

hello python Action

def main(args):
    name = args.get("name", "World")
    place = args.get("place", "Naver")
    greeting = "Hello " + name + " in " + place + "!"
    print(greeting)
    return {"payload": greeting}

Python 코드는 여러 개의 함수를 포함할 수 있지만 main 함수는 프로그램의 시작점으로서 반드시 선언되어야 합니다.

위에서 작성한 코드로 hello라는 이름의 액션을 생성합니다.

compute-15-2-201

의존성 파일을 함께 패키징하여 액션 생성하기

코드를 작성하다 보면 하나의 액션 외의 의존 모듈을 패키지해야 하는 경우가 있습니다. 이런 경우, 관련된 파일들을 하나의 모듈로 패키징하고, 패키징된 파일을 이용하여 액션을 생성할 수 있습니다.

함수에 접근하기 위한 entry point인 main 함수는 __main__.py 파일 안에 정의되어 있어야 합니다. 예를 들어 메인 액션에서 사용되는 함수들이 작성된 helper.py 파일과 함께 패키징하여 액션을 만들고 싶다면 아래의 명령어를 사용하면 됩니다.

액션과 관련된 파일들을 helloPython.zip으로 압축합니다.

zip -r helloPython.zip __main__.py helper.py

이후 생성된 압축 파일을 사용하여 액션을 생성합니다.

virtual environment와 함께 패키징하여 액션 생성하기

1. Linux & Mac

Cloud Functions에서 기본으로 제공되는 라이브러리 외의 추가 라이브러리를 사용하기 위해 virtual environment(virtualenv)를 사용하여 함께 패키징할 수 있습니다.

기본적으로 지원하는 패키징 방법과 동일하게 메인 함수는 __main__.py 파일 안에 정의되어 있어야 하며 virtualenv의 폴더 이름은 반드시 'virtualenv'로 설정해야 합니다.

예제

virtual environment를 구축하여 Cloud Functions에서 제공하지 않는 pyjokes 라이브러리를 사용하여 joke를 반환하는 액션을 생성하는 예제입니다.

  1. 먼저 virtualenv 이름을 가지는 virtualenv 환경을 구축합니다.

     virtualenv virtualenv
     source virtualenv/bin/activate
     pip install pyjokes
    
  2. __main__.py에서 get_joke() 메서드를 호출하여 joke를 반환하는 아래의 코드를 작성합니다.

     import pyjokes
    
     def main(args):
         return {"joke": pyjokes.get_joke()}
    
  3. virtualenv 폴더와 __main__.py 파일을 함께 압축합니다.

     zip -r jokes.zip virtualenv __main__.py
    

Cloud Functions는 최대 액션 소스 코드의 크기가 48MB로 제한되어 있습니다. 따라서 사용하는 라이브러리가 많아 파일 크기가 제한 용량을 넘어가는 경우 배포가 제한될 수 있으며, 자주 사용되지 않는 액션의 경우 컨테이너가 cold 상태로 전환되어 초기 액션 실행 시간이 늘어날 수 있습니다.

2. Windows

현재 Windows OS에서는 mac과 Linux에서 지원하는 virtualenv와 동일한 형태로 지원하기 힘든 상태입니다. Windows에서는 가상으로 환경을 구성해서 패키지화하는 두 가지 방법을 안내합니다.(Python이나 pip는 설치되어 있다고 가정합니다.)

방법 1. Docker를 사용하여 패키지

Docker를 이용할 수 있는 개발 환경이라면, 간단히 가상으로 개발환경을 구성해서 패키지화할 수 있습니다.

Step 1. 자신의 OS에 맞는 Docker for Windows (Community Edition) 또는 Docker Toolbox를 설치합니다.

참조 : https://www.docker.com/docker-windows

Step 2. 소스코드 작성

__main__.py

import pyjokes

def main(args):
    return {"joke": pyjokes.get_joke()}

Step 3. requirements.txt 파일 작성

requirements.txt

pyjokes==0.5.0
  • 위 문서를 만드는 방법은 의존성 라이브러리의 버전을 알고 있거나, 작성법을 안다면 직접 작성 가능합니다.

  • 참조 : https://pip.readthedocs.io/en/1.1/requirements.html

  • 작성법을 모르면 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
    

Step 4. 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.6.1-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 ./*'
    

Step 5. Zip 파일 업로드.

방법 2 의존성 라이브러리들만 따로 패키징

Docker와 같은 추가 환경 구성이 어렵다면, windows용 python vitualenv에서 내 코드와 의존성 라이브러리들만 따로 압축해서 패키징할 수 있습니다.

Step 1. 소스코드 작성

__main__.py

import pyjokes

def main(args):
    return {"joke": pyjokes.get_joke()}

Step 2. Vitualenv 생성 및 의존성 패키지 설치 및 복사

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

Step 3. 작업 경로 c:\WorkingDirvirtualenv 폴더를 제외하고 모두 압축 (zip)

compute-15-2-202

Step 4. 압축된 파일 업로드

기본 파라미터 설정하기

매번 액션을 실행할 때마다 파라미터를 전달하는 대신, 특정 파라미터에 기본값을 지정할 수 있습니다. 위에서 생성한 hello 액션의 place 파라미터에 기본 값을 등록해보도록 하겠습니다.

compute-15-2-105

액션 실행 시 파라미터 전달하기

액션 실행 시 입력으로 파라미터를 전달할 수 있습니다. Main 함수에 전달되는 파라미터는 JSON object 형식으로 전달됩니다.

파라미터는 액션 실행 시 직접 입력하거나, JSON 형식의 파일을 작성하여 전달할 수 있습니다. 파일을 통해 파라미터를 전달하는 경우에는 아래와 같은 JSON 형식의 파일을 작성해야 합니다.

compute-15-2-106

액션 런타임 정보

각 액션 컨테이너에는 기본 라이브러리들이 내장되어 있으며, 이 라이브러리들은 별도의 추가적인 작업 없이 임포트하여 사용하실 수 있습니다.

Python 3 라이브러리

Python 3.6.1 버전을 제공하며, 액션 생성 시 명시적으로 Python 3 액션 컨테이너를 생성할 수 있습니다.

  • aiohttp v1.3.3
  • appdirs v1.4.3
  • asn1crypto v0.21.1
  • async-timeout v1.2.0
  • attrs v16.3.0
  • beautifulsoup4 v4.5.1
  • cffi v1.9.1
  • chardet v2.3.0
  • click v6.7
  • cryptography v1.8.1
  • cssselect v1.0.1
  • Flask v0.12
  • gevent v1.2.1
  • greenlet v0.4.12
  • httplib2 v0.9.2
  • idna v2.5
  • itsdangerous v0.24
  • Jinja2 v2.9.5
  • kafka-python v1.3.1
  • lxml v3.6.4
  • MarkupSafe v1.0
  • multidict v2.1.4
  • packaging v16.8
  • parsel v1.1.0
  • pyasn1 v0.2.3
  • pyasn1-modules v0.0.8
  • pycparser v2.17
  • PyDispatcher v2.0.5
  • pyOpenSSL v16.2.0
  • pyparsing v2.2.0
  • python-dateutil v2.5.3
  • queuelib v1.4.2
  • requests v2.11.1
  • Scrapy v1.1.2
  • service-identity v16.0.0
  • simplejson v3.8.2
  • six v1.10.0
  • Twisted v16.4.0
  • w3lib v1.17.0
  • Werkzeug v0.12
  • yarl v0.9.8
  • zope.interface v4.3.3

연관 정보 바로가기

아래 가이드에서 연관 정보를 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...