Serverless Swift와 Slack Slash Commands를 사용해 CLI 대신하기 — Part 2

Jeongyeon Park
5 min readMay 9, 2018

--

Part 1에서는 IBM Cloud Functions와 Slack Slash Commands를 사용해서 CLI를 대신하는 방법을 알아보았다. 이번에는 Part 1처럼 했을 때 발생하는 문제들을 해결하는 방법을 알아본다.
하나는 Cold Start로 인한 타임아웃(Timeout)이고, 하나는 동작 환경의 차이다.

Cold Start 극복하기

서버리스(Serverless)의 특성상 사용시에만 인스턴스가 생성되기 때문에 자주 사용하지 않는 액션은 Cold Start를 겪게 된다.

https://medium.com/openwhisk/run-swiftly-precompiled-swift-actions-775addae0345

위 문서에서 hellowSwift를 로컬 머신에서 실행했는데 응답 시간이 거의 3초가 걸렸다고 한다. Slack Slash Commands는 3초 동안 응답이 없으면 타임아웃이 된다. 이를 극복하기 위해서는 미리 컴파일된 바이너리로 액션을 생성해야 한다.

바이너리 빌드 방법은 IBM Cloud Functions GitHub 저장소의 README를 참조한다. (https://github.com/ibm-functions/runtime-swift)
Docker 이미지는 ibmfunctions/action-swift-v4.1를 사용한다.

  1. 우선 Docker를 설치한다. (https://www.docker.com/community-edition#/download)
  2. 터미널에서 docker login 명령을 사용해서 Docker Hub에 로그인 한다.
  3. docker pull ibmfunctions/action-swift-v4.1 명령으로 이미지를 받는다.
  4. 소스 파일이 있는 디렉토리로 이동해서 docker run --rm -it -v "$(pwd):/owexec" ibmfunctions/action-swift-v4.1 bash 명령으로 컨테이너를 실행한다.
  5. owexec 디렉토리로 들어가보면 소스 파일을 확인할 수 있는데, 소스 파일들을 /swift4Action/spm-build/Sources/Action 디렉토리에 복사한다.
  6. cat /swift4Action/epilogue.swift >> /swift4Action/spm-build/Sources/Action/main.swift 명령을 실행한다.
  7. echo '_run_main(mainFunction:main)' >> /swift4Action/spm-build/Sources/Action/main.swift 명령을 실행한다.
  8. 의존성이 있는 경우 /swift4Action/spm-build 디렉토리에 있는 Package.swift 파일을 수정한다. 기본적으로 Package.swift 파일에 Watson SDK 의존성이 추가되어 있기 때문에 필요 없다면 의존성을 제거한다.
  9. /swift4Action/spm-build 디렉토리로 이동해서 릴리즈 모드로 빌드한다. swift build -c release
  10. Zip으로 압축한다. zip /owexec/your_package_name.zip ./.build/x86_64-unknown-linux/release/Action (빌드 결과를 보고 필요하면 경로를 변경한다.)
  11. Docker를 빠져나간다. exit

이제 바이너리가 준비가 되었다. 하지만 IBM Cloud Functions에 올리기 위해서는 IBM Cloud Functions CLI를 설치해야 한다.

  1. macOS에서는 curl -fsSL https://clis.ng.bluemix.net/install/osx | sh 명령이 편리하다.
  2. bx plugin install Cloud-Functions -r Bluemix
  3. bx login -a api.ng.bluemix.net -o "your_org" -s "your_space" (이 부분은 각자 대시보드를 보고 입력하자.)

이제 기존 액션을 갱신하기 위해 다음 명령을 입력한다(갱신 대신 생성을 위해서는 update 대신 create를 쓴다.). bx wsk action update your_action_name your_package_name.zip --kind swift:4.1

다시 Slack Slash Commands을 사용해보면 Cold Start에도 타임아웃이 발생하지 않는다.

서버리스의 동작 환경에서 확인하기

XCKoLog의 예전 소스 코드를 보면 OS 분기가 있다. Swift 3.1에서는 macOS와 Linux에서 사용하는 API가 다른 부분이 있었다. (지금은 동일 코드로 동작한다.)
IBM Cloud Functions에서 동작하는 코드를 만들기 위한 가장 쉬운 방법은 그들이 제공하는 Docker 이미지를 실행해서 빌드하는 것인데 조금 전에 그 일을 했고, 추가로 할 일은 없다.

마무리

서버리스는 Cold Start 이슈가 있고, 특히 Swift 액션은 컴파일 시간 때문에 소스 코드로 액션을 등록하면 Slack Slash Commands에서 타임아웃을 자주 볼 수 있다. 하지만 바이너리로 빌드한 액션은 Cold Start에도 타임아웃을 피할 수 있다. 또한 제공된 Docker 이미지를 쓰면 동작 환경 차이로 인한 문제가 없는지도 확인할 수 있다.

--

--