패키지(Package), 액션(Action) 사용하기
패키지(Package)
패키지(Package)는 관련 있는 액션을 한 곳에 모아서 관리하기 위해 사용됩니다.
패키지 생성하기
- 패키지를 생성할 때 패키지 이름은 다른 Resource의 이름과 중복될 수 없습니다.
- Resource : 패키지, 액션, 트리거
- 디폴트 파라미터는 패키지에 속해 있는 모든 액션에 적용되는 파라미터입니다.
- 패키지 이름은 영문 대소문자, 숫자, 특수 문자 중 밑줄(
_
),하이픈(-
)을 포함할 수 있습니다. - 액션이 패키지에 포함될 경우 해당 액션의 이름은
{package_name}/{action_name}
형태로 결정됩니다.
액션(Action)
액션(Action)은 사용자가 정의하는 상태 비저장(Stateless) 코드의 코드 조각(Snippets)으로, 다양한 언어로 작성될 수 있습니다.
액션은 명시적으로 실행되거나 특정 이벤트의 결과로 실행될 수 있는데, 액션이 실행될 때마다 하나의 고유한 'Activation'이 생성됩니다. 'Activation'은 Activation ID로 구분되며, 액션의 실행 결과 및 메타 정보를 담고 있습니다. 액션의 Input과 Output은 모두 키-값(key-value) 형태의 JSON 값입니다. 액션은 또 다른 액션을 실행시킬 수 있으며, 여러 개의 액션이 모여 하나의 '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 (추후 지원)
액션 컨테이너
각각의 액션은 서로 독립된 컨테이너 상에서 구동됩니다.
하나의 액션이 실행될 때마다, 그 액션을 위한 컨테이너가 생성되며, 사용자가 정의한 코드가 실행되고, 결과가 전달됩니다.
한번 생성된 컨테이너는 바로 종료되지 않고 일정 시간 동안 유지되며, 동일한 액션이 실행되면 재사용됩니다.
(다른 사용자의 코드를 실행 한 공간을 재활용하지는 않습니다.)
액션이 처음 실행될 때, 컨테이너를 생성하는 일은 대략 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
}
};
}
연관 정보 바로가기
아래 가이드에서 연관 정보를 확인할 수 있습니다.