패키지(Package), 액션(Action) 사용하기

패키지(Package)

패키지(Package)는 관련 있는 액션이나 피드를 한곳에 모아서 관리하고, 공인된 공유 패키지들을 내 패키지로 복사하기 위해 사용됩니다.

  • 패키지에 트리거나 룰은 포함될 수 없습니다.
  • 향후 공유 Public Package 기능을 추가하여 자주 사용하는 기능에 대한 지원을 계획하고 있습니다.

패키지 생성하기

  • 패키지를 생성할 때 패키지 이름은 다른 Entity와 중복될 수 없습니다.
    • Entity: 액션(패키지에 포함되지 않은 경우), 룰, 트리거
  • 디폴트 파라미터는 패키지에 속해 있는 모든 액션에 적용되는 파라미터입니다.
  • 패키지 이름은 영문 대소문자, 숫자, 특수 문자 중 밑줄(_),하이픈(-)을 포함할 수 있습니다.
  • 액션이 패키지에 포함될 경우 해당 액션의 이름은 {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: 액션 실행 결과의 고유 ID
  • start: 액션이 시작된 시간
  • 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
      }
    };
}

연관 정보 바로가기

아래 가이드에서 연관 정보를 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...