IBM Cloud Functions CLI를 통해 cloudant No-sql db에 data를 쓰고 지우는 action을 실습 해보자. 본 실습은 기본적으로 action,trigger,endpoint,rule 등에 대한 이해가 필요하다.
(필요한 사람은 이전 lab을 보고 오면 되겠다.)

Step Summary
· CLI 설치
· functions 를 이용한 cloudant db read/write 실습

[1st: CLI 설치]
1. ibm cloud -> functions ->getting started-> overview로 이동
download cli 버튼 클릭 , 가이드에 따라 설치
(이미 설치를 했다면 2번 스텝으로 이동)

2. shell 을 통한 IBM Cloud Cli설치
본인의 os 환경에 맞게 명령을 수행 한다.

macOS
curl -fsSL https://clis.ng.bluemix.net/install/osx | sh

Linux 
curl -fsSL https://clis.ng.bluemix.net/install/linux | sh

Windows PowerShell
iex(New-ObjectNet.WebClient).DownloadString('https://clis.ng.bluemix.net/install/powershell')

 

3. IBM Cloud Functions plugin 설치
$bx plugin install Cloud-Functions -r Bluemix

4. login
(본인 org와 space 정보를 이용해야 한다. 노란 부분을 본인 정보로 변경해서 수행하자.)
$bx login -a api.ng.bluemix.net -o “xxx@xxx.com” -s “korea
또는 single sign on을 이용할 수도 있다.
$bx login -a api.ng.bluemix.net -o “xxx@xx.xxx.com” -s “korea” –sso

5. 확인
$bx wsk action invoke /whisk.system/utils/echo -p message hello –result
아래와 같은 결과가 나오면 제대로 수행 된 것이다.
{ “message”: “hello” }

 

[2nd: functions를 이용한 db read/write]

1. 실습을 위한 cloudant database instance를 만들자.
“cloudant-serverless” 란 이름으로 생성.
( link를 이용하자. https://console.bluemix.net/catalog/services/cloudant-nosql-db/)

2. instance를 만들었으면 cats라는 database를 만들자.

3. env 값을 cli 환경변수로 셋팅 한다.
(대소문자 구분)
$export CLOUDANT_INSTANCE=”Cloudant-Serverless”
$export CLOUDANT_DATABASE=”cats”

4. ibm cloud에 로그인

(이미 로그인을 했다면, 본 스텝은 넘어가도 된다.)
(본인 org와 space 정보를 이용해야 한다. 노란 부분을 본인 정보로 변경해서 수행하자.)
$bx login -a api.ng.bluemix.net -o “xxx@xxx.com” -s “korea
또는 single sign on을 이용할 수도 있다.
$bx login -a api.ng.bluemix.net -o “xxx@xx.xxx.com” -s “korea” –sso

5. cloudantdb를 사용 하기 위한 package가 설치 되어 있어야 한다.
아래 명령으로 설치와 함께 env setup이 된다.
$bx wsk package refresh

설치된 package를 확인 하자.
$bx wsk package list

6. action 생성
process-change.js 파일을 만들고 action으로 등록 해보자.
코드는 아래와 같이 생성하자.

function main(params)
{
    return new Promise(function(resolve, reject) {
      if (!params.name) {
        reject({
          'error': 'name parameter not set.'
        });
        return;
      } else {
        var message = 'A ' + params.color +' cat named ' + params.name + ' was added.';

        resolve({
          change:message
        });
        return;
  }
    });
  }

process-change.js 의 main function을 action으로 등록 한다.
$bx wsk action create process-change process-change.js

7. 생성된 action unit test
$bx wsk action invoke –blocking –param name Tahoma –param color Tabby process-change

8. action 확인
$bx wsk action list

9. sequence 생성
db/read 와 process-change action을 묶은 sequence를 만든다. 두개의 action이 순차적으로 수행 된다.
(아래 커맨드는 그대로 사용하면 안되고, 본인의 action 명과 package명으로 바꿔야 한다.)
$bx wsk action create process-change-cloudant-sequence –sequence /xxx@xx.xxx.com_korea/Bluemix_${CLOUDANT_INSTANCE}_Credentials-1/read,/xx@xx.xxx.com_korea/process-change\

10. 생성확인
action이 sequence 속성으로 생성된것을 볼 수 있다.
$bx wsk action list

11. trigger생성
data-inserted-trigger란 이름으로 trigger를 생성하고 해당 trigger는 db의 change를 feed한다.
(아래 커맨드는 그대로 사용하면 안되고, 본인의 action 명과 package명으로 바꿔야 한다.)
$bx wsk trigger create data-inserted-trigger \
–feed /xxx@xx.xxx.com_korea/Bluemix_${CLOUDANT_INSTANCE}_Credentials-1/changes \
–param dbname “$CLOUDANT_DATABASE”

12. trigger 생성 확인

13. rule 생성
trigger와 action(sequence)를 엮어서 하나의 rule로 등록 한다. 이 말은 trigger에 해당하는 event가 발생하면 rule에 엮인 action(sequence)이 수행됨을 의미 한다.

$bx wsk rule create log-change-rule /xxx@xx.xxx.com_korea/data-inserted-trigger /xxx@xx.xxx.com_korea/process-change-cloudant-sequence

rule 생성 확인

14. cloudant package binding
wsk cloudant package에 나의 cloudant instance와 binding을 해야 data를 읽고 쓸 수 있다.
credential 정보는 ibm cloud -> cloudant service ->(1)service credentials 부분에서 확인 한다.
만약 (3) view credential이 없다면 (2)new credential 버튼으로 credential을 생성 하자.

credential을 확인했으면 export명령으로 cli 환경 변수로 등록 하자.
export CLOUDANT_INSTANCE=”Cloudant-Serverless” => 위의 스텝에서 이미 했다.
export CLOUDANT_USERNAME=”e4——2d-4b60—61351b6d1-bluemix”
export CLOUDANT_PASSWORD=”00e718ad——-4c0663180d—20077cced63″
export CLOUDANT_DATABASE=”cats” => 위의 스텝에서 이미 했다.

(본 과정은 좀 더 쉽게 할 수 있도록 package화 되어 제공 되지만 과정의 이해를 위하여 manually 진행 해보겠다. package에 대한 정보는 참고 2 link에서 찾을 수 있다.)

15. db insert action 생성
write-to-cloudant.js 파일 생성
아래 function은 db 정보를 파라미터로 받아서 insert문을 수행한다.

var request = require('request');
var Cloudant = require('cloudant');

var CONTENT_TYPE = "application/json";
function main(params)
{
    var cloudant = new Cloudant({
        account:params.CLOUDANT_USERNAME,
        password:params.CLOUDANT_PASSWORD
    });

    var database = cloudant.db.use(params.CLOUDANT_DATABASE);
    var docid=params.docid || 'InsertDoc';
    return new Promise(function(resolve, reject) {
    database.insert({name: 'JH',age:4,color:'yellow' }, docid,
        function(err, body) {
            if (err&&err.statusCode != 409) {
                console.log("Error within insert." + err);
                reject();
            } else {
                console.log("Success within  insert.");
                resolve();
            }
        }
    );
  });

 

}

 

16. 생성한 function을 action으로 등록
$bx wsk action create write-to-cloudant write-to-cloudant.js \
–param CLOUDANT_USERNAME “$CLOUDANT_USERNAME” \
–param CLOUDANT_PASSWORD “$CLOUDANT_PASSWORD” \
–param CLOUDANT_DATABASE “$CLOUDANT_DATABASE”

소스를 local에서 수정하게 될경우 action update를 해줘야 한다.
(bx wsk action update write-to-cloudant write-to-cloudant.js 이런식으로 하면 된다.)

17. 동작 모니터링
wsk 가 어떻게 동작 하는지 볼 수 있다.
$bx wsk activation poll

18. insert action 수행
$bx wsk action invoke –blocking –result write-to-cloudant –param docid ‘test2’

19. 로깅 결과 확인
아래 로깅을 보면 functions가 어떤 순서로 동작했는지 알 수 있다. 순서대로 따라가 보자.

1) write-to-cloudant 수행
test2 , JH, yellow 값을 갖는 doc을 입력 했다.
2) data-inserted-trigger
db의 change를 감지하는 trigger가 실행 된다. 본 trigger는 log-change-rule 이란 rule에 의해 process-change-cloudant-sequence 란 action과 연결 되어 있다.
3) process-change-cloudant-sequence 수행
trigger에 의해 action이 수행 된다. 본 seqeunce는 database를 read하는 package action과 , process-chage action이 합쳐진 것이다.
4) read
위의 2)~ 3) 과정에서 넘어온 값을 토대로 db를 읽는다. 예를 들자면 아래와 같은 command가 수행 되는 것
$bx wsk action invoke /yjh@kr.ibm.com_korea/Bluemix_Cloudant-Serverless_Credentials-1/read –blocking –result –param dbname cats –param docid test2
5) process-change 수행
본 action은 parameter로 넘어온 값을 stdout으로 찍는다.

         (아래에서 위로 봐야 함)

junghyeons-air:svlCloudantDB junghyeonyoo$ bx wsk activation poll
Enter Ctrl-c to exit.
Polling for activation logs

Activation: 'process-change' (2fe0b452356342f7a0b4523563b2f748)
[
    "2018-05-11T01:22:30.257209176Z stdout: JH",
    "2018-05-11T01:22:30.25724471Z  stdout: yellow",
    "2018-05-11T01:22:30.257253295Z stdout: A yellow catnamed JH was added."
]

Activation: 'read' (56f96d2a40304e25b96d2a4030ee25d9)
[
    "2018-05-11T01:22:30.237749671Z stdout: success { _id:'test2',",
    "2018-05-11T01:22:30.237802561Z stdout: _rev:'1-973fda49982a036d553a42deaace8e44',",
    "2018-05-11T01:22:30.237811227Z stdout: name:'JH',",
    "2018-05-11T01:22:30.237817584Z stdout: age: 4,",
    "2018-05-11T01:22:30.237823733Z stdout: color: 'yellow'}"
]

Activation: 'process-change-cloudant-sequence'(698689fea3e049178689fea3e09917f4)
[
    "56f96d2a40304e25b96d2a4030ee25d9",
    "2fe0b452356342f7a0b4523563b2f748"
]

Activation: 'data-inserted-trigger'(9773573b87f44e2ab3573b87f4ae2ab7)
[
"{\"statusCode\":0,\"success\":true,\"activationId\":\"698689fea3e049178689fea3e09917f4\",
\"rule\":\"yjh@kr.ibm.com_korea/log-change-rule\",
\"action\":\"yjh@kr.ibm.com_korea/process-change-cloudant-sequence\"}"
]

Activation: 'write-to-cloudant'(50de0c5caf934a4e9e0c5caf93ba4e9f)
[
    "2018-05-11T01:22:30.133562585Z stdout: Success within insert."
]

참고.
https://github.com/IBM/ibm-cloud-functions-cloudant-trigger
https://github.com/IBM/ibm-cloud-functions-data-processing-cloudant

토론 참가

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.