現在、Function Compute は以下のランタイム環境をサポートしています。
- Python 2.7 ( runtime = python2.7 )
- Python 3.6 ( runtime = python3)
内容
このトピックでは、Python ランタイム環境の以下の機能について説明します。
logging モジュールの使用
logging モジュールを使用して、ログを出力することを推奨します。このモードで出力されたログには、エラーが発生したときに関連するログエントリを簡単に見つけるための、リクエスト ID などの情報が含まれています。
関数が stdout に出力するデータは、サービスの作成時に指定された Logstore に収集されます。次の方法でデータをログに記録できます。
print
コマンドを入力します。このモードでは、情報は変更されずにログに記録されます。def my_handler(event, context):
print 'hello world'
return 'done'
前述のコマンドを実行すると、次の結果が表示されます。
message:hello world
logging
モジュールを使用します。このモードでは、各ログエントリに、時間、 リクエスト ID、ログレベルなどの情報が含まれます。
import logging
def my_handler(event, context):
logger = logging.getLogger()
logger.info('hello world')
return 'done'
前述のコマンドを実行すると、次の結果が表示されます。
message:2017-07-05T05:13:35.920Z a72df088-f738-cee3-e0fe-323ad89118e5 [INFO] hello world
ビルトインモジュールの使用
標準的な logging モジュールに加えて、Function Compute の Python ランタイム環境では、ユーザーがアクセスできる他のモジュールを提供しています。現在、次の表に示すモジュールが使用可能です。
次の例では、画像の回転に wand を使用しています。
from wand.image import Image
def my_handler(event, context):
with Image(blob=event) as img:
print img.size
with img.clone() as i:
i.rotate(180)
return i.make_blob()
前述の関数の event
パラメーターは、画像のバイナリデータとして使用されます。その後に生成される画像も、バイナリデータの形式で返されます。他のサードパーティ製ライブラリのデモンストレーションについては、「 fc-python-demo 」をご参照ください。
カスタムモジュールの使用
カスタムモジュールを使用する必要がある場合は、コードと一緒にモジュールをパッケージ化する必要があります。たとえば、コマンドラインツール fcli を使用して、MySQL にアクセスするモジュール PyMySQL を追加するには、次の手順を実行します。
コードと依存モジュールを格納するディレクトリを作成します。
mkdir /tmp/code
main.py という名前のコードファイルを作成し、/tmp/code ディレクトリに保存します。コードで
pymysql
と入力します。import pymysql.cursors
# Connect to the database
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
def my_handler(event, context):
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT count(*) FROM `users`"
cursor.execute(sql)
result = cursor.fetchone()
print(result)
return result
依存関係を /tmp/code ディレクトリにインストールします。
cd /tmp/code
pip install --install-option="--install-lib=$(pwd)" PyMySQL
PyMySQL が依存するすべての Python ライブラリが、これらのライブラリがインストールされているかどうかに関係なく、
pip install -t
でダウンロードされます。モジュールのバージョンが指定されていない場合は、インストールに install-option メソッドを使用することを推奨します。このメソッドは、ローカル環境に存在しない Python ライブラリのみをダウンロードします。これにより、ローカルのサードパーティ製パッケージのサイズが縮小されます。次の図で、赤で囲まれたライブラリはダウンロードされていません。依存関係がインストールされた後、
/tmp/code
ディレクトリに以下の情報が表示されます。ls -l /tmp/code
drwxr-xr-x 9 rockuw staff 306 Jul 5 16:48 PyMySQL-0.7.11.dist-info
-rw-r--r-- 1 rockuw staff 74 Jul 5 16:02 main.py
drwxr-xr-x 26 rockuw staff 884 Jul 5 16:48 pymysql
関数を作成して呼び出すために、fcli を使用します。
./fcli shell
mkf my-func -h main.my_handler --runtime python2.7 -d /tmp/code
invk my-func
注意:依存ファイルが、 C、C ++、または Go コードからコンパイルされた実行ファイルまたはライブラリファイルを使用する場合は、「sbox」 をご参照ください。
外部コマンドの使用
関数が Python で開発されていない外部ツールを使用する可能性があります。たとえば、C++ や Go コードからコンパイルされた shell スクリプトや、実行ファイルを使用するかもしれません。この場合、コードと一緒にパッケージ化し、関数で外部コマンドを実行して使用します。次の例は、shell スクリプトを実行する方法を示しています。
import os
import subprocess
def my_handler(event, context):
script_path = os.environ.get('FC_FUNC_CODE_PATH') + '/script.sh'
ret = subprocess.check_output(['bash', script_path])
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 をインストールします。
sbox -d code -t python2.7
コマンドを入力します。このコマンドでは、-d
はコードが格納されているディレクトリを示します。この例では、コードは “/code” ディレクトリに保存されます。-t
パラメーターは、言語を指定します。このコマンドを初めて実行するときは、イメージに対して PULL 操作を実行する必要があり、処理時間が長くなる可能性があることにご注意ください。サンドボックス環境にアクセスし、
pip install -t . mysql-python
コマンドを入力して、依存ライブラリをインストールします。exit
コマンドを入力し、サンドボックス環境を終了します。_mysql.so ファイルを含む mysql-python ライブラリは、 /code ディレクトリにインストールされています。
注意:
sbox コマンドを有効にするには、Docker がインストールされていることを確認してください。Docker のインストール方法の詳細については、「Docker のインストール」をご参照ください。
sbox コマンドの実行に必要なイメージは、Docker の公式リポジトリに保存されています。イメージのダウンロードが遅い場合は、Alibaba Cloud Container Service の使用を推奨します。詳細については、「関連ドキュメント」をご参照ください。
root ユーザーのみが Linux オペレーティングシステムで Docker を実行できます。
sudo fcli shell
コマンドを実行して、fcli を有効にしてください。あるいは、関連ドキュメントに従って Linux ホストを設定し、Docker を root 以外のユーザーとして管理することもできます。サードパーティ製ライブラリをパッケージ化したり、関数をテストしたり、トラブルシューティングを行うには、サンドボックス環境を使用することを推奨します。これにより、開発環境とランタイム環境の不一致による問題を回避できます。特に、関数がバイナリファイルに依存する場合は、サンドボックス環境で関連する依存関係をコンパイルしてください。
songluo@demo $ fcli shell
Welcome to the Function Compute world. Have fun!
>>> sbox -d code -t python2.7
Entering the container. Your code is in the /code direcotry.
root@c5adc6ffd861:/code# pip install -t . mysql-python
Collecting mysql-python
Downloading MySQL-python-1.2.5.zip (108kB)
100% |████████████████████████████████| 112kB 440kB/s
Building wheels for collected packages: mysql-python
Running setup.py bdist_wheel for mysql-python ... done
Stored in directory: /root/.cache/pip/wheels/38/a3/89/ec87e092cfb38450fc91a62562055231deb0049a029054dc62
Successfully built mysql-python
Installing collected packages: mysql-python
Successfully installed mysql-python-1.2.5
root@c5adc6ffd861:/code# exit
依存関係に .so ファイルなどの、動的リンクライブラリファイルが含まれている場合は、これらのファイルを lib フォルダに配置します。Function Compute のランタイム環境では、lib ディレクトリが path 変数に追加されます。
例外処理
関数が実行されたときに例外が発生すると、Function Compute は例外を捉え、そのエラーメッセージをホストに返します。たとえば、次のコードが記述されているとします。
def my_handler(event, context):
raise Exception('something is wrong')
次の応答が返されます。
{
"errorMessage": "something is wrong",
"errorType": "Exception",
"stackTrace": [
[
"File \"/code/main.py\"",
"line 2",
"in my_handler",
"raise Exception('something is wrong')"
]
]
}
例外が発生した場合、関数が呼び出すレスポンスの HTTPヘッダーには X-Fc-Error-Type: UnhandledInvocationError
情報が含まれます。Function Compute のエラータイプについての詳細は、「エラーメッセージ」をご参照ください。