パッケージ(Package)、アクション(Action)を利用する
パッケージ(Package)
パッケージ(Package)は、関連するアクションを1か所に集めて管理するために使われます。
パッケージを作成する
- パッケージを作成する際、パッケージ名は他のResource名と重複することはできません。
- Resource:パッケージ、アクション、トリガー
- デフォルトパラメータは、パッケージに属している全てのアクションに適用されるパラメータです。
- パッケージ名は、英文大文字・小文字、数字、特殊文字のうち、アンダースコア(
_
)、ハイフン(-
)を含むことができます。 - アクションがパッケージに含まれる場合、そのアクション名は、
{package_name}/{action_name}
形式で決められます。
アクション(Action)
アクション(Action)は、ユーザーが定義するステートレス(Stateless)コードのコードスニペット(Snippets)として、色んな言語で作成することができます。
アクションは、明示的に実行されるか、特定のイベントの結果で実行されることができるが、アクションが実行される度に1つの固有の'Activation'が作られます。 'Activation'は、Activation IDで区分され、アクションの実行結果及びメタデータを盛り込んでいます。 アクションのInputとOutputとは、いずれもキー値(key-value)形式のJSON値です。 アクションは、また別のアクションを実行させることができ、複数のアクションが集まって1つの'Sequence アクション'を作ることもできます。
対応可能な言語は、次の通りです。
- Node.js 6、8
- Python 3
- Java 8
- Swift 3.1.1
- PHP 7.1
- Go 1.1
- .Net Core 2.2
- Ruby (対応予定)
- Node.js 10 (対応予定)
アクションコンテナー
それぞれのアクションは、相互独立したコンテナー上で駆動されます。
1つのアクションが実行される度に、そのアクションのためのコンテナーが作られ、ユーザーの定義したコードが実行され、結果が転送されます。
一度作られたコンテナーは、直ちに終了されずに一定時間の間維持され、同じアクションが実行されると、再利用されます。
(別のユーザーのコードを実行した空間は再利用しません。)
アクションが初めて実行される際、コンテナーを作ることは凡そ50~200msほどかかり、この時間を短縮するために'pre-warming'という技法が適用されています。
'pre-warming'を通じて、予め特定の言語のアクションコンテナーを駆動させておくことができます。
アクションの実行結果(Activation)
通常、アクションを実行した結果は、以下のような情報を盛り込んでいます。
namespace
:アクションの属するnamespace。ユーザーとの契約によって割り当てられた固有空間です。契約の終了後、再契約の際には別のnamespaceを割り当てられます。name
:アクション名activationId
:アクションの実行結果の固有IDstart
:アクションが開始された時刻end
:アクションが終了した時刻duration
:アクションが実行された期間(ms)response
:アクションの実行結果。アクションが最終的に返した結果は、result
フィールドで転送されます。logs
:ユーザーがアクション内で出力したログannotations
:アクションに関連する情報publish
:アクションが共有されたか否か
アクションの実行結果の例は、次の通りです。
{
"namespace": "style95",
"name": "rp",
"version": "0.0.1",
"subject": "style95",
"activationId": "626c0dfabf274aa7ac0dfabf270aa759",
"start": 1517461496130,
"end": 1517461496451,
"duration": 321,
"response": {
"status": "success",
"statusCode": 0,
"success": true,
"result": {
"status": "ok"
}
},
"logs": [],
"annotations": [
{
"key": "path",
"value": "style95/rp"
},
{
"key": "waitTime",
"value": 33
},
{
"key": "kind",
"value": "nodejs:6"
},
{
"key": "limits",
"value": {
"logs": 10,
"memory": 256,
"timeout": 60000
}
},
{
"key": "initTime",
"value": 262
}
],
"publish": false
}
アクションを実行する際、result
オプションを利用すると、上記の情報のうち、result
に該当する情報のみが返されます。
{
"status": "ok"
}
アクションログを残す
全てのアクションコンテナーは、stdout
やstderr
で出力された情報にTimestamp情報を追加し、logs
フィールドに返します。
NodeJSアクションでログを残す
function main(params) {
var name = params.name || 'World';
var place = params.place || 'Naver';
var payload = 'Hello, ' + name + ' in ' + place + '!';
console.log(payload)
console.error(payload)
return {payload: payload};
}
実行結果を照会すると、以下のようなlogs
情報を確認することができます。
{
...
"logs": [
"2018-02-01T06:50:26.134193098Z stdout: Hello, World in Naver!",
"2018-02-01T06:50:26.134293524Z stderr: Hello, World in Naver!"
],
...
}
Pythonアクションでログを残す
from __future__ import print_function
import sys
def main(args):
name = args.get("name", "stranger")
greeting = "Hello " + name + "!"
print (greeting)
print (greeting, file=sys.stderr)
return {"greeting": greeting}
{
...
"logs": [
"2018-02-01T07:16:33.847246459Z stderr: Hello stranger!",
"2018-02-01T07:16:33.847308738Z stdout: Hello stranger!"
],
...
}
類似する方式で別の言語のアクションでも、stdout
又はstderr
でメッセージを出力してログを残すことができます。次は、ログを残したアクションの例(NodeJS)です。
ログを残したアクションの例(NodeJS)
アクションメタデータ(Action Metadata)を利用する
全てのアクションは、基本的に次のような環境変数が提供されます。
__OW_API_HOST
:現在アクションが実行されるCloud Funtionsのendpoint情報__OW_API_KEY
:現在アクションを実行するのに使われたAPIキー__OW_NAMESPACE
:現在実行中のアクションの実行結果が保存されるnamespace情報__OW_ACTION_NAME
:現在実行中のアクションのfull name__OW_ACTIVATION_ID
:現在実行中のアクションのActivation ID__OW_DEADLINE
:アクションが実行され得る最終時刻
Example:metadata.js
function main(params) {
return {
payload: {
apihost: process.env.__OW_API_HOST,
namespace: process.env.__OW_NAMESPACE,
name: process.env.__OW_ACTION_NAME,
activation: process.env.__OW_ACTIVATION_ID,
deadline: process.env.__OW_DEADLINE
}
};
}
関連情報へ
下のガイドから関連情報をご確認いただけます。