edit-icon download-icon

Python ランタイム環境

最終更新日: May 31, 2019

現在、Function Compute は以下のランタイム環境をサポートしています。

  • Python 2.7 ( runtime = python2.7 )
  • Python 3.6 ( runtime = python3)

内容

このトピックでは、Python ランタイム環境の以下の機能について説明します。

logging モジュールの使用

logging モジュールを使用して、ログを出力することを推奨します。このモードで出力されたログには、エラーが発生したときに関連するログエントリを簡単に見つけるための、リクエスト ID などの情報が含まれています。

関数が stdout に出力するデータは、サービスの作成時に指定された Logstore に収集されます。次の方法でデータをログに記録できます。

  1. print コマンドを入力します。このモードでは、情報は変更されずにログに記録されます。

    1. def my_handler(event, context):
    2. print 'hello world'
    3. return 'done'

    前述のコマンドを実行すると、次の結果が表示されます。

    1. message:hello world
  2. logging モジュールを使用します。

    このモードでは、各ログエントリに、時間、 リクエスト ID、ログレベルなどの情報が含まれます。

    1. import logging
    2. def my_handler(event, context):
    3. logger = logging.getLogger()
    4. logger.info('hello world')
    5. return 'done'

    前述のコマンドを実行すると、次の結果が表示されます。

    1. message:2017-07-05T05:13:35.920Z a72df088-f738-cee3-e0fe-323ad89118e5 [INFO] hello world

ビルトインモジュールの使用

標準的な logging モジュールに加えて、Function Compute の Python ランタイム環境では、ユーザーがアクセスできる他のモジュールを提供しています。現在、次の表に示すモジュールが使用可能です。

モジュール名 説明 関連リンク
oss2 2.6.0 OSS https://github.com/aliyun/aliyun-oss-python-sdk
tablestore 4.6.0 Table Store https://github.com/aliyun/aliyun-tablestore-python-sdk
aliyun-fc2 2.0.4 Function Compute https://github.com/aliyun/fc-python-sdk
aliyun-mns 1.1.5 MNS https://github.com/bowenpay/mns-python-sdk
aliyun-python-sdk-cdn 2.6.2 CDN https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-cdn
aliyun-python-sdk-ram 3.0.0 RAM https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-ram
aliyun-python-sdk-sts 3.0.0 STS https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-sts py
aliyun-log-python-sdk 0.6.38 Log Service https://github.com/aliyun/aliyun-log-python-sdk
wand 0.4.4 画像処理ライブラリ http://docs.wand-py.org/en/0.4.4/
opencv 3.3.0.10 OpenCV http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html
numpy 1.13.3 科学計算ライブラリ http://www.numpy.org/
scipy 1.0.0 科学計算ライブラリ https://www.scipy.org/
matplotlib 2.0.2 描画ライブラリ https://matplotlib.org/
scrapy 1.4.0 データキャプチャライブラリ https://scrapy.org/

次の例では、画像の回転に wand を使用しています。

  1. from wand.image import Image
  2. def my_handler(event, context):
  3. with Image(blob=event) as img:
  4. print img.size
  5. with img.clone() as i:
  6. i.rotate(180)
  7. return i.make_blob()

前述の関数の event パラメーターは、画像のバイナリデータとして使用されます。その後に生成される画像も、バイナリデータの形式で返されます。他のサードパーティ製ライブラリのデモンストレーションについては、「 fc-python-demo 」をご参照ください。

カスタムモジュールの使用

カスタムモジュールを使用する必要がある場合は、コードと一緒にモジュールをパッケージ化する必要があります。たとえば、コマンドラインツール fcli を使用して、MySQL にアクセスするモジュール PyMySQL を追加するには、次の手順を実行します。

  1. コードと依存モジュールを格納するディレクトリを作成します。

    1. mkdir /tmp/code
  2. main.py という名前のコードファイルを作成し、/tmp/code ディレクトリに保存します。コードで pymysql と入力します。

    1. import pymysql.cursors
    2. # Connect to the database
    3. connection = pymysql.connect(host='localhost',
    4. user='user',
    5. password='passwd',
    6. db='db',
    7. charset='utf8mb4',
    8. cursorclass=pymysql.cursors.DictCursor)
    9. def my_handler(event, context):
    10. with connection.cursor() as cursor:
    11. # Read a single record
    12. sql = "SELECT count(*) FROM `users`"
    13. cursor.execute(sql)
    14. result = cursor.fetchone()
    15. print(result)
    16. return result
  3. 依存関係を /tmp/code ディレクトリにインストールします。

    1. cd /tmp/code
    2. pip install --install-option="--install-lib=$(pwd)" PyMySQL

    PyMySQL が依存するすべての Python ライブラリが、これらのライブラリがインストールされているかどうかに関係なく、pip install -t でダウンロードされます。モジュールのバージョンが指定されていない場合は、インストールに install-option メソッドを使用することを推奨します。このメソッドは、ローカル環境に存在しない Python ライブラリのみをダウンロードします。これにより、ローカルのサードパーティ製パッケージのサイズが縮小されます。次の図で、赤で囲まれたライブラリはダウンロードされていません。

    py-install

    依存関係がインストールされた後、 /tmp/code ディレクトリに以下の情報が表示されます。

    1. ls -l /tmp/code
    2. drwxr-xr-x 9 rockuw staff 306 Jul 5 16:48 PyMySQL-0.7.11.dist-info
    3. -rw-r--r-- 1 rockuw staff 74 Jul 5 16:02 main.py
    4. drwxr-xr-x 26 rockuw staff 884 Jul 5 16:48 pymysql
  4. 関数を作成して呼び出すために、fcli を使用します。

    1. ./fcli shell
    2. mkf my-func -h main.my_handler --runtime python2.7 -d /tmp/code
    3. invk my-func
注意:依存ファイルが、 C、C ++、または Go コードからコンパイルされた実行ファイルまたはライブラリファイルを使用する場合は、「sbox」 をご参照ください。

外部コマンドの使用

関数が Python で開発されていない外部ツールを使用する可能性があります。たとえば、C++ や Go コードからコンパイルされた shell スクリプトや、実行ファイルを使用するかもしれません。この場合、コードと一緒にパッケージ化し、関数で外部コマンドを実行して使用します。次の例は、shell スクリプトを実行する方法を示しています。

  1. import os
  2. import subprocess
  3. def my_handler(event, context):
  4. script_path = os.environ.get('FC_FUNC_CODE_PATH') + '/script.sh'
  5. ret = subprocess.check_output(['bash', script_path])
  6. return ret

注意:C、C ++、または Go コードからコンパイルされた実行ファイルは、Function Compute のランタイム環境と互換性がなければなりません。 Function Compute では、次の Python ランタイム環境をサポートしています。
  • Linux カーネル: Linux 4.4.24-2.al7.x86_64
  • Docker ベースイメージ: Docker Pull Python: 2.7; Docker Pull Python: 3.6

sbox コマンドは、fcli で使用することを推奨します。次の例では、ランタイム環境 Python 2.7 に、.so ファイルを使用して mysql-python をインストールします。

  1. sbox -d code -t python2.7 コマンドを入力します。このコマンドでは、 -d はコードが格納されているディレクトリを示します。この例では、コードは “/code” ディレクトリに保存されます。-t パラメーターは、言語を指定します。このコマンドを初めて実行するときは、イメージに対して PULL 操作を実行する必要があり、処理時間が長くなる可能性があることにご注意ください。

  2. サンドボックス環境にアクセスし、pip install -t . mysql-python コマンドを入力して、依存ライブラリをインストールします。

  3. exit コマンドを入力し、サンドボックス環境を終了します。_mysql.so ファイルを含む mysql-python ライブラリは、 /code ディレクトリにインストールされています。

注意:

  1. sbox コマンドを有効にするには、Docker がインストールされていることを確認してください。Docker のインストール方法の詳細については、「Docker のインストール」をご参照ください。

  2. sbox コマンドの実行に必要なイメージは、Docker の公式リポジトリに保存されています。イメージのダウンロードが遅い場合は、Alibaba Cloud Container Service の使用を推奨します。詳細については、「関連ドキュメント」をご参照ください。

  3. root ユーザーのみが Linux オペレーティングシステムで Docker を実行できます。sudo fcli shell コマンドを実行して、fcli を有効にしてください。あるいは、関連ドキュメントに従って Linux ホストを設定し、Docker を root 以外のユーザーとして管理することもできます。

  4. サードパーティ製ライブラリをパッケージ化したり、関数をテストしたり、トラブルシューティングを行うには、サンドボックス環境を使用することを推奨します。これにより、開発環境とランタイム環境の不一致による問題を回避できます。特に、関数がバイナリファイルに依存する場合は、サンドボックス環境で関連する依存関係をコンパイルしてください。

    1. songluo@demo $ fcli shell
    2. Welcome to the Function Compute world. Have fun!
    3. >>> sbox -d code -t python2.7
    4. Entering the container. Your code is in the /code direcotry.
    5. root@c5adc6ffd861:/code# pip install -t . mysql-python
    6. Collecting mysql-python
    7. Downloading MySQL-python-1.2.5.zip (108kB)
    8. 100% |████████████████████████████████| 112kB 440kB/s
    9. Building wheels for collected packages: mysql-python
    10. Running setup.py bdist_wheel for mysql-python ... done
    11. Stored in directory: /root/.cache/pip/wheels/38/a3/89/ec87e092cfb38450fc91a62562055231deb0049a029054dc62
    12. Successfully built mysql-python
    13. Installing collected packages: mysql-python
    14. Successfully installed mysql-python-1.2.5
    15. root@c5adc6ffd861:/code# exit

依存関係に .so ファイルなどの、動的リンクライブラリファイルが含まれている場合は、これらのファイルを lib フォルダに配置します。Function Compute のランタイム環境では、lib ディレクトリが path 変数に追加されます。

例外処理

関数が実行されたときに例外が発生すると、Function Compute は例外を捉え、そのエラーメッセージをホストに返します。たとえば、次のコードが記述されているとします。

  1. def my_handler(event, context):
  2. raise Exception('something is wrong')

次の応答が返されます。

  1. {
  2. "errorMessage": "something is wrong",
  3. "errorType": "Exception",
  4. "stackTrace": [
  5. [
  6. "File \"/code/main.py\"",
  7. "line 2",
  8. "in my_handler",
  9. "raise Exception('something is wrong')"
  10. ]
  11. ]
  12. }

例外が発生した場合、関数が呼び出すレスポンスの HTTPヘッダーには X-Fc-Error-Type: UnhandledInvocationError 情報が含まれます。Function Compute のエラータイプについての詳細は、「エラーメッセージ」をご参照ください。