Python

Prev Next

Classic/VPC環境で利用できます。

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」という名前のアクションを作成する手順は、次の通りです。

cloudfunctions-example-python_v2_01_ko

依存関係ファイルを一緒にパッケージングしてアクションを作成

コードを作成していると、1つのアクション以外に依存モジュールを一緒にパッケージングする場合があります。このような場合は、関連する複数のファイルを1つのモジュールにパッケージングし、そのファイルを利用してアクションを作成できます。
関数にアクセスするための entry pointの main 関数は、__main__ .pyファイル内に定義されている必要があります。例えば、メインアクションで使用される複数の関数が作成された helper.pyファイルと一緒にパッケージングしてアクションを作成したい場合、以下のコマンドを使用してアクションに関連する複数のファイルを helloPython.zipに圧縮します。

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

その後、作成された圧縮ファイルを使用してアクションを作成できます。

virtual environmentと一緒にパッケージングしてアクションを作成

virtual environmentと一緒にパッケージングしてアクションを作成する方法を OS環境別に説明します。

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
    
  4. 作成された圧縮ファイルを使用してアクションを作成します。

参考

Cloud Functionsは、アクションソースコードの最大サイズが38MBに制限されています。そのため、使用するライブラリが多くファイルサイズが制限容量を超える場合は、リリースが制限されることがあります。頻繁に使われないアクションの場合はコンテナが cold状態になり、初期アクション実行時間が伸びることがあります。

Windows

Windows環境では、Linuxや Mac環境の virtualenvと同じサポートが困難なため、仮想環境を構成してパッケージングする2つの方法を説明します。ただし、Pythonや pipは既にインストールされている必要があります。

  • Dockerを使用してパッケージ化する方法: Dockerを利用できる開発環境の場合、仮想で簡単に開発環境を構成してパッケージ化できます。パッケージ化する手順は次の通りです。
    1. 使用中の OSに該当する Docker for Windows(Community Edition)や Docker Toolboxをインストールします。
      (参照: https://www.docker.com/docker-windows)
    2. ソースコード __main__ .pyを作成します。
      import pyjokes
      
      def main(args):
          return {"joke": pyjokes.get_joke()}
      
    3. requirements.txtファイルを作成します。
      pyjokes==0.5.0
      
    4. Dockerコマンドを使用して zipファイルを作成します。
      • 以下のようなファイル構造で作業パスを c:\WorkingDirと仮定
        powershell
        c:\WorkingDir>dir
        XXXX-XX-XX 午後 09:07

        .
        XXXX-XX-XX 午後 09:07 ..
        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-slim-buster /bin/sh -c 'mkdir workdir && cp -R /tmp/ * /workdir/ && rm -rf /workdir/virtualenv && pip install virtualenv && apt -y update && apt -y install zip && cd /workdir && virtualenv virtualenv && . virtualenv/bin/activate && pip install -r requirements.txt && zip -r /tmp/project.zip ./* '
        
    5. 圧縮したファイルをアップロードしてアクションを作成します。
参考

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で自分のコードと依存関係ライブラリだけ別途で圧縮してパッケージングできます。パッケージ化する手順は次の通りです。
    1. ソースコード__main__.pyを作成します。
      import pyjokes
      
      def main(args):
          return {"joke": pyjokes.get_joke()}
      
    2. 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
      
    3. タスクパス c:\WorkingDir内の virtualenvフォルダを除いてすべて zipファイルに圧縮します。
      compute-15-2-202_ko
    4. 圧縮したファイルをアップロードしてアクションを作成します。

requirements.txtと一緒にパッケージングしてアクションを作成

直接 virtual environmentを構成してパッケージングせずに、アクションの実行に必要な必須依存関係ライブラリが明示された requirements.txtと一緒に__main__.pyをパッケージングしてアクションを作成できます。
この方法で作成されたアクションの場合は、コンテナが cold状態で実行される時に virtual environmentを構成して依存関係ライブラリをインストールします。

参考
  • python: 3.11バージョン以上のランタイムでのみ利用できます。
  • パッケージングされる必須依存関係ライブラリリストのファイル名を requirements.txtにします。
  • 依存関係ライブラリのインストールのためにインターネット通信が必要です。アクションと連携する Private Subnetで、インターネット通信のために NAT Gateway設定が必要です。設定方法は NAT Gatewayご利用ガイドをご参照ください。
  1. requirements.txtの名前を持つ複数の依存関係ライブラリのリストを作成します。
    pyjokes==0.6.0
    
  2. __main__.pyで get_joke() メソッドを呼び出して jokeを返すコードを作成します。
    import pyjokes
    
    def main(args):
        return {"joke": pyjokes.get_joke()}
    
  3. requirements.txtxと__main__.pyファイルを一緒に圧縮します。
    $ zip -r jokes-with-dependencies.zip requirements.txt __main__ .py
    
  4. 作成された圧縮ファイルを使用してアクションを作成します。
注意
  • アクションコンテナ内で virtual environmentを構成し、必須依存関係ライブラリをインストールする手順はメモリの使用量が多い作業です。したがって、インストールするライブラリが多いか、サイズが大きい場合はアクションコンテナのメモリ制限を超えたために、アクション実行に失敗することがあります。
  • また、インストールのために最小限に必要な pipパージョンが合わないなどの理由で、コンテナ内に構成される virtual environment環境に特定の依存関係をインストールすることが制限され、アクション実行が失敗することがあります。
  • メモリ制限、pipバージョンなどの理由で必須依存関係ライブラリのインストールが制限される場合は、直接 virtual environmentを構成してパッケージングし、アクションを作成する方法をお勧めします。