1. Overview#
이번 문서에서는 Apache OpenWhisk
기반의 IBM Cloud Functions
를 사용하여 Cloudant
에 저장된 이미지를 Watson Visual Recognition
으로 분류하는 application을 만들어 볼것입니다.
다음 문서를 직접 해보고 작성한 문서입니다.
링크: link
2. Prerequisites#
IBM Cloud 계정 : link
IBM Watson 계정 : link
NodeJs설치 : link
Local Test version
Node js
: v10.15.3
환경이 window라면 git bash를 설치해주세요.
Git Bash : link
3. Application Flow#
application의 flow는 다음 그림과 같습니다.
- 이미지파일을 고릅니다.
- upload버튼을 통해 이미지파일은
Cloudant DB
에 저장됩니다. - 새로운 이미지가 DB에 저장되면 트리거에의해
Cloud Function
이 실행됩니다. Cloud Function
은 이미지를 가져와 처리를 위해Watson Visual Recognition
를 실행시킵니다.Visual Recognition
의 결과값인 Score와 Class등을Cloudant
에 저장합니다.- 유저는 자신이 업로드한 이미지에 대한 분류결과를 확인할 수 있습니다.
4. Basic Concepts#
Apache OpenWhisk#
IBM Cloud Functions
의 기반이 되는 Apache OpenWhisk
에 대해 알아보겠습니다.
이벤트에 대해 함수를 실행시키는 Opensource Cloud Serverless 플랫폼으로, 개발자가 코드를 실행하는데 있어 컨테이너 관리나 운영으로부터 자유롭게 해줄 수 있습니다.
용어에 대한 설명을 간략하게 하겠습니다.
- Trigger : DB, 장치, 웹 등에서 발생한 이벤트들을 감지합니다.
- Actions : 지원되는 프로그래밍 언어의 단일 함수로 구현된 코드로, 트리거가 발생하였을 때 실행되어 결과를 반환합니다.
- Rules : 트리거에서 감지된 이벤트에 대해 어떤 액션이 실행될지 정의합니다.
- Sequences : 액션을 연결하는 조합을 만들어 실행할 수 있습니다.
- Packages : 트리거와 액션을 모아 하나의 패키지로 공개할 수 있습니다. 패키지로 정의된 외부 서비스를 사용할 수도 있고, 직접 만든 패키지를 외부에 공개할 수도 있습니다.
Serverless?#
Serverless는 서버 없이 모든 규모의 이벤트에 대해 코드를 실행하여 응답하는 클라우드 컴퓨팅 방식입니다. 서버가 없다는 것은 해당 이벤트에 대해 별도로 할당된 서버가 없어 사용자가 인프라 및 플랫폼 관리를 할 필요가 없다는 의미입니다.
Serverless 플랫폼에서는 요청이 있을 때만 필요한 코드를 실행하고, 요청이 많을 경우에는 그에 비례하는 자원을 할당하여 동시에 처리하는 방법으로 사용률과 확장성을 극대화할 수 있습니다.
5. Step#
Clone the git#
웹페이지를 구성할 소스코드를 클론받습니다.
$ git clone https://github.com/IBM/serverless-image-recognition
링크가 터졌을 때를 대비한 링크 : link
Cloudant Create&Config#
먼저 Cloudant를 생성합니다.
생성링크 -> link
생성할 때, use both legacy credentials and IAM
을 체크해주는 것을 잊지맙시다!
만들고 난 뒤 인증정보를 생성합니다.
생성한 인증정보에서 password와 username을 찾아서 클론받은 프로젝트 내부 local.env
에 기재합니다.
Image를 담을 DB와 Tag를 담을 Tag DB의 이름을 images와 tags으로 기입합니다. 혹시 자신이 다른이름을 사용할 것이라면 수정하셔도 됩니다.
이제 Cloudant 웹 콘솔을 실행시켜 DB를 생성해보겠습니다.
DB의 이름은 앞서 적었던것과 같은 이름으로 적어주세요.
CORS#
Same-Origin Policy
에 의해 javascript로 다른 웹페이지에 접근할때는 같은 출처의 페이지로만 접근할 수 있습니다. 같은 출처라는 것은 호스트명, 프로토콜, 포트가 같다는 것을 의미합니다.
때문에 로컬에서 실행시킨 web app이 cloud에 올라간 cloudant
에 접근하기 위해서는 CORS
(Cross-Origin Resource Sharing)를 활성화 시켜야 합니다.
CORS에대한 설명 : wiki
설정은 간단합니다. Account>CORS로 이동합니다.
다음 모든 도메인이 접근할 수 있게 All domains에 체크해주시면 됩니다.
만약 허가된 도메인만 접근하게 하려면 원하는 도메인을 적고 Add Domain을 하시면 됩니다.
Watson Visual Recognition#
먼저 인스턴스를 생성해줍니다.
생성링크 -> link
Cloudant와 마찬가지로 서비스 인증정보를 만들어 줍니다.
apikey를 복사하여 local.env
의 apikey에 붙여넣어줍시다.
Add Trigger#
IBM Cloud Functions Console로 이동 -> link
트리거 탭으로 이동해서 create를 누르고 cloudant를 선택합니다.
다음 이미지와 같이 빈칸들을 채워주시면 됩니다.
username, password, host는 cloudant의 서비스인증정보를 참조, DB의 이름은 트리거에 의해 이미지를 watson visual recognition
에 보내야 하므로 source DB의 이름을 적어주어야 합니다.
Add Action#
이제 트리거가 발생하였을 때, 어떠한 액션을 취할 것인지를 정의해주어야 합니다.
Connected Action > Create로 이동합니다.
액션의 이름과 Runtime환경을 정의해줍니다.
source code -> link
소스코드를 Code탭에 복사 붙여넣기 합니다.
Parameters탭에서 각 parameter들을 입력해줍니다.
username과 password는 cloudant에서 참조.
Deploy#
wskdeploy
를 설치합니다.
설치 링크 : link
wskdeploy?
yaml로 쓰여진 Manifest파일을 사용하여 OpenWhisk Programming 모델을 구성해주는 utility입니다.
local.env
에 저장하였던 환경변수들을 세팅해줍니다.
$ source local.env
wskdeploy를 설치하였던 폴더경로를 참고하여 local.env
가 있는 폴더에서 wskdeploy를 실행합니다.
$ wskdeploy
web/scripts/upload.js
에서 다음 파라미터들을 수정해줍니다.
usernameCloudant = "YOUR_CLOUDANT_USERNAME"
passwordCloudant = "YOUR_CLOUDANT_PASSWORD"
필요한 패키지들을 설치해주고 application을 실행시킵니다.
$ npm install
$ npm start
일렉트론 앱이 실행되고, 이미지를 실제로 넣어보면 분류가 되는 것을 확인할 수 있습니다.
일렉트론 앱말고도 web/index.html
를 더블클릭하여 웹페이지로도 확인할 수 있습니다.
6. Another Step (CLI)#
위의 과정 중, 몇몇 과정을 커맨드라인으로 입력하는 방법입니다.
set up#
IBM Cloud Functions CLI 설정을 위해 플러그인을 설치합니다.
$ ibmcloud plugin install cloud-functions
ibmcloud에 로그인합니다.
$ ibmcloud login --sso
$ ibmcloud target -cf
환경변수를 설정합니다.
$ source local.env
아래 명령으로 cloudantDB를 사용하기 위한 package를 설치하고 env셋업을 합니다.
$ bx wsk package refresh
Add Trigger -cli#
$ ibmcloud wsk trigger create update-trigger2 --feed serverless-pattern-cloudant-package/changes --param dbname images
Add Action -cli#
$ ibmcloud wsk action create update-document-with-watson2 actions/updateDocumentWithWatson.js \
--kind nodejs:8 \
--param USERNAME $CLOUDANT_USERNAME \
--param PASSWORD $CLOUDANT_PASSWORD \
--param DBNAME $CLOUDANT_IMAGE_DATABASE \
--param DBNAME_PROCESSED $CLOUDANT_TAGS_DATABASE \
--param WATSON_VR_APIKEY $WATSON_VISUAL_APIKEY
Make Rule -cli#
$ ibmcloud wsk rule create update-trigger-rule2 update-trigger2 update-document-with-watson2
Delete#
$ ibmcloud wsk package delete serverless-pattern-cloudant-package
$ ibmcloud wsk trigger delete update-trigger2
$ ibmcloud wsk action delete update-document-with-watson2
$ ibmcloud wsk rule delete update-trigger-rule2