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という名前のアクションを作ります。
依存ファイルを一緒にパッケージングしてアクションを作成する
コードを作成していると、1つのアクションの他の依存モジュールをパッケージしなければならない場合があります。このような場合、関連のファイルを1つのモジュールでパッケージングし、パッケージングされたファイルを利用してアクションを作ることができます。
関数にアクセスするための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を返すアクションを作成する例です。
まず、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は、最大のアクションソースコードのサイズが48MBに制限されています。よって、利用するライブラリーが多くて、ファイルサイズが制限容量を超過する場合、配布が制限されることがあり、頻繁に使用されないアクションの場合、コンテナーがcold状態に切り替わり、初期アクションの実行時間が延びることがあります。
2. Windows
現在、Windows OSにおいては、macとLinuxとに対応するvirtualenvと同様の形式での対応が困難な状態です。Windowsでは、仮想で環境を構築してパッケージ化する2つの方法をご案内します。(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
上記の文書を作る方法は、依存ライブラリーのバージョンを知っているか、作成法を知っている場合、直接作成が可能です。
作成法を知らない場合、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:\WorkingDir
内のvirtualenv
フォルダを除いて全て圧縮(zip)
Step 4. 圧縮されたファイルのアップロード
基本パラメータを設定する
毎回アクションを実行する度にパラメータを転送する代わりに、特定のパラメータに基本値を指定することができます。 上記で作成したhelloアクションのplaceパラメータに基本値を登録してみます。
アクション実行時にパラメータを転送する
アクションの実行の際、入力でパラメータを転送することができます。 Main関数に転送されるパラメータは、JSON object形式で転送されます。
パラメータは、アクションの実行の際に直接入力するか、JSON形式のファイルを作成して転送することができます。 ファイルを通じてパラメータを転送する場合には、以下のようなJSON形式のファイルを作成する必要があります。
アクションのランタイム情報
各アクションのコンテナーには、基本ライブラリーが内蔵されており、このライブラリーは別途の追加作業なしにインポートして利用することができます。
Python 3.6のライブラリー
Python 3.6.8バージョンを提供し、アクションの作成の際に明示的にPython 3.6のアクションのコンテナーを作成することができます。
- attrs v19.3.0
- Automat v20.2.0
- beautifulsoup4 v4.6.3
- certifi v2019.11.28
- cffi v1.14.0
- chardet v3.0.4
- Click v7.0
- constantly v15.1.0
- cryptography v2.8
- cssselect v1.1.0
- Flask v1.0.2
- gevent v1.3.6
- greenlet v0.4.15
- httplib2 v0.11.3
- hyperlink v19.0.0
- idna v2.7
- incremental v17.5.0
- itsdangerous v1.1.0
- Jinja2 v2.10.1
- kafka-python v1.4.3
- lxml v4.2.5
- MarkupSafe v1.1.1
- parsel v1.5.2
- pip v19.1.1
- pyasn1 v0.4.8
- pyasn1-modules v0.2.8
- pycparser v2.20
- PyDispatcher v2.0.5
- PyHamcrest v2.0.2
- pyOpenSSL v19.1.0
- python-dateutil v2.7.3
- queuelib v1.5.0
- requests v2.19.1
- Scrapy v1.5.1
- service-identity v18.1.0
- setuptools v41.0.1
- simplejson v3.16.0
- six v1.12.0
- Twisted v18.7.0
- urllib3 v1.23
- virtualenv v16.0.0
- w3lib v1.21.0
- Werkzeug v0.15.2
- wheel v0.33.3
- zope.interface v4.7.1
Python 3.7のライブラリー
Python 3.7.9バージョンを提供し、アクションの作成の際に明示的にPython 3.7のアクションのコンテナーを作成することができます。
- attrs v20.3.0
- Automat v20.2.0
- beautifulsoup4 v4.6.3
- certifi v2020.12.5
- cffi v1.14.4
- chardet v3.0.4
- constantly v15.1.0
- cryptography v3.3.1
- cssselect v1.1.0
- httplib2 v0.11.3
- hyperlink v21.0.0
- idna v2.7
- incremental v17.5.0
- kafka-python v1.4.3
- lxml v4.2.5
- parsel v1.6.0
- pip v20.3.3
- pyasn1 v0.4.8
- pyasn1-modules v0.2.8
- pycparser v2.20
- PyDispatcher v2.0.5
- PyHamcrest v2.0.2
- pyOpenSSL v20.0.1
- python-dateutil v2.7.3
- queuelib v1.5.0
- requests v2.19.1
- Scrapy v1.5.1
- service-identity v18.1.0
- setuptools v51.1.2
- simplejson v3.16.0
- six v1.15.0
- Twisted v18.7.0
- urllib3 v1.23
- virtualenv v16.0.0
- w3lib v1.22.0
- wheel v0.36.2
- zope.interface v5.2.0
関連情報へ
下のガイドから関連情報をご確認いただけます。