PHP
faas
IBM-Cloud
IBM-Cloud-Functions

IBM Cloud FunctionsでPHPアプリケーションを作る

IBM Cloud FunctionsというFaaS環境でPHPアプリケーションを作る。IMB Cloud FunctionsはApache OpenWhiskというOSSをベースに作られている。

IBM Cloudのアカウントを作る

IBM Cloudのアカウントをまだ持っていない場合はこのページなどから登録しよう。このページでなくとも、登録時はライト・アカウントという無償プランになるっぽい。

値段

値段はIBM Cloud Functions - Pricingに書いてある。

「1 GB のメモリー割り振りにつき、実行 1 秒あたり $ 0.000017」という値段設定。

400,000 GB 秒までは無料。

例ではアクション実行時間が500ミリ秒、アクション・メモリーが128MB、一ヶ月あたりの実行が5,000,000回のときは無料と書いてある。

実際

0.5 s * 0.128 GB * 5,000,000 = 320,000 GB 秒 < 400,000 GB 秒

なので、無用枠に収まる。ちなみに一秒ごとに一回実行したとすると一ヶ月で60*60*24*30=2,592,000回になる。

実行できるアクション

Create and invoke Actions(日本語版は更新が遅いので英語版を見たほうがよい)によれば使える環境はJavaScript, Swift, Python, Java, PHP, Docker。Dockerが使えるので基本的になんでもできる。より詳しくはCloud Functions システムの詳細に書いてある。

CLI

実行するコードが単一ファイルならweb UIで設定できるが、複数ファイルからなる場合はzipにして、CLIでアップロードする必要がある。

CLIのダウンロード方法はここに書いてある。

ログインのコマンドが

$ bx login -a api.ng.bluemix.net -o  -s

となっているが、-oに「CLOUD FOUNDRY 組織」、-sに「CLOUD FOUNDRY スペース」を設定する必要がある。「CLOUD FOUNDRY 組織」には登録したメールアドレス、「CLOUD FOUNDRY スペース」にdevを指定するとログインできる。

$ bx login -a api.ng.bluemix.net -o <メールアドレス> -s dev

アクションの作成

Create and invoke Actions(英語版)にPHPアクションの作り方が書いてある。PHPのバージョンは7.1。例えばhello.phpというファイル名で以下のソースコードを含んだファイルを作る。

<?php
function main(array $args) : array
{
    $name = $args["name"] ?? "stranger";
    $greeting = "Hello $name!";
    echo $greeting;
    return ["greeting" => $greeting];
}

PHPアクションではmainという関数が実行される。mainには連想配列をパラメータとして渡すことが出来て、戻り値として連想配列を返す様に書く。

$ bx wsk action create helloPHP hello.php

でhelloPHPという名前でアクションを作る。ドキュメントにはbxが最初についてないが、つけないとwskというコマンドが無いエラーになるので、bxを最初に付ける必要がある。

作ったアクションは以下のコマンドで実行できる。

$ bx wsk action invoke --result helloPHP --param name World
  {
      "greeting": "Hello World!"
  }

複数パラメータを与えたい時は

$ bx wsk action invoke --result helloPHP --param key1 value1 --param key2 value2

などとする。

複数ファイルから成る場合はzipで固める。そのときエントリーポイントとなるmain関数が書かれているファイルはindex.phpという名前でなくてはいけない。composerで入れた依存するパッケージを加えたい場合は

$ zip -r helloPHP.zip index.php vendor

でzip化して

$ bx wsk action create helloPHP --kind php:7.1 helloPHP.zip

でアクションを作る。zipにした場合は拡張子から判断できないため--kind php:7.1で種類を指定してあげる必要がある。更新したい時はupdateを使う。

$ bx wsk action update helloPHP --kind php:7.1 helloPHP.zip

アクションの設定

ここから先はWeb UIでやったほうがわかりやすい。

https://console.bluemix.net/openwhisk/actions でアクション名をクリックするとアクションの詳細画面に移る。

デフォルトパラメータでアクションのデフォルトパラメータを設定できる。

ランタイムに行くと、使用するメモリなどを修正できる。デフォルトでは256MBになっているので、そんなに必要ない時は変更しよう。最小値は128MB。memory_get_peak_usageを使うとPHP によって割り当てられたメモリの最大値がわかるので参考になるかも。

echo number_format(memory_get_peak_usage(true)). PHP_EOL;

などで確認できる。

トリガーとルールの作成

https://console.bluemix.net/openwhisk/triggers からトリガーを作成できる。

トリガーの種類は以下の通り。


Cloudant

特定の Cloudant データベースが更新されるたびにアクションをトリガーします。

Custom Trigger

特定の REST エンドポイントが POST されるたびにアクションをトリガーします。

GitHub

GitHub リポジトリーが更新されるたびにアクションをトリガーします。

MessageHub

新規メッセージがキューに書き込まれるたびにアクションをトリガーします。

Mobile Push

プッシュ通知がモバイル・アプリに送信されるたびにアクションをトリガーします。

Periodic

時刻に基づいてアクションをトリガーします。

例えばPeriodicで1分ごとに実行できる。トリガーにアクションを設定することでアクションを実行できる。

モニター

モニターからログを見ることができる。

image.png

このようにレスポンスが見れる。✔マークをクリックすると標準出力の内容が見れる。