Swift 액션 사용하기

Swift 액션을 만드는 과정은 JavaScript 액션을 만드는 것과 유사합니다. 아래의 예제를 통해 간단한 Swift 액션을 만들고 액션에 파라미터를 추가하여 사용하는 방법을 배울 수 있습니다.

액션 생성하기

먼저 아래와 같이 이름과 장소를 포함한, "Hello World in Naver!"를 출력하는 간단한 Swift 액션인 'hello'를 작성합니다.

func main(args: [String:Any]) -> [String:Any] {
    let name: String = args["name"] as? String ?? "World"
    let place: String = args["place"] as? String ?? "Naver"
    return [ "payload" : "Hello \(name) in \(place)!" ]
}

Swift 코드는 여러 개의 함수를 포함할 수 있지만 main 함수는 프로그램의 시작점으로서 반드시 선언되어야 합니다.

위에서 작성한 코드로 'helloSwift'라는 이름의 액션을 생성합니다.

compute-15-2-401

실행 가능한 Swift 액션으로 패키징하기

Cloud Functions에서 Swift 소스코드 파일을 사용하여 액션을 생성할 때 액션이 실행되기 전에 바이너리로 컴파일되어야 합니다. 한번 컴파일된 이후에는 작업을 대기하는 컨테이너가 제거되기 전까지 발생하는 후속 액션 호출에 대해서는 빠르게 응답합니다.

이처럼 컨테이너가 제거된 이후에는 처음 액션 실행 시 응답 지연이 발생하는데 이러한 응답 지연은 cold-start 지연으로 알려져 있습니다. 이러한 cold-start 지연을 피하기 위해서는 여러분의 Swift 파일을 직접 바이너리로 컴파일하고 생성된 ZIP 파일을 Cloud Functions에 업로드해야 합니다.

바이너리를 생성하는 가장 쉬운 방법은 실행될 환경과 동일한 환경 내에서 빌드하는 것입니다. 아래의 예제를 통해 직접 바이너리를 생성하는 것을 알아보도록 하겠습니다.

  1. 먼저 도커를 이용하여 Swift 액션 컨테이너를 실행합니다.

     $ docker run --rm -it -v "$(pwd):/owexec" openwhisk/action-swift-v3.1.1 bash
    

    이 명령어는 도커컨테이너 안의 bash shell을 이용할 수 있게 해줍니다.

  2. 소스코드를 복사하고 빌드하기 위해 준비합니다.

     $ cp /owexec/hello.swift /swift3Action/spm-build/main.swift
    
     $ cat /swift3Action/epilogue.swift >> /swift3Action/spm-build/main.swift
    
     $ echo '_run_main(mainFunction:main)' >> /swift3Action/spm-build/main.swift
    
  3. (선택 사항) Package.swift 파일을 만들고 의존 패키지들을 추가합니다.

     import PackageDescription
    
     let package = Package(
     name: "Action",
         dependencies: [
             .Package(url: "https://github.com/apple/example-package-deckofplayingcards.git", majorVersion: 3),
             .Package(url: "https://github.com/IBM-Swift/CCurl.git", "0.2.3"),
             .Package(url: "https://github.com/IBM-Swift/Kitura-net.git", "1.7.10"),
             .Package(url: "https://github.com/IBM-Swift/SwiftyJSON.git", "15.0.1"),
             .Package(url: "https://github.com/watson-developer-cloud/swift-sdk.git", "0.16.0")
         ]
     )
    

위의 예제에서는 example-package-deckofplayingcards 의존 패키지를 추가하였습니다. CCurl, Kitura-net 그리고 SwiftyJSON은 기본 Swift 액션에 포함되어 있으므로 Package.swift에 추가하여야 합니다.

  1. Package.swift를 spm-build 폴더에 복사합니다.

     $ cp /owexec/Package.swift /swift3Action/spm-build/Package.swift
    
  2. spm-build 폴더로 이동하여 컴파일합니다.

     $ cd /swift3Action/spm-build
     $ swift build -c release
    
  3. ZIP 파일을 생성하고 도커 컨테이너에서 빠져나옵니다.

     $ zip /owexec/hello.zip .build/release/Action
     $ exit
    

    hello.zip 파일은 hello.swift와 같은 폴더 내에 생성되어 있습니다.

  4. 이 파일을 helloSwifty 이름으로 새로운 액션을 생성합니다.

액션을 실행하여 더 빨라진 속도를 확인하실 수 있습니다.

기본 파라미터 설정하기

매번 액션을 실행할 때마다 파라미터를 전달하는 대신, 특정 파라미터에 기본값을 지정할 수 있습니다. 위에서 생성한 hello 액션의 place 파라미터에, 기본 값을 등록해보도록 하겠습니다.

compute-15-2-105

액션 실행 시 파라미터 전달하기

액션 실행 시 입력으로 파라미터를 전달할 수 있습니다. Main 함수에 전달되는 파라미터는 JSON object 형식으로 전달됩니다.

파라미터는 액션 실행 시 직접 입력하거나, JSON 형식의 파일을 작성하여 전달할 수 있습니다. 파일을 통해 파라미터를 전달하는 경우에는 아래와 같은 JSON 형식의 파일을 작성해야 합니다.

compute-15-2-106

액션 런타임 정보

각 액션 컨테이너에는 기본 라이브러리들이 내장되어 있으며, 이 라이브러리들은 별도의 추가적인 작업 없이 임포트하여 사용하실 수 있습니다.

Swift 3 라이브러리

Swift 3.1.1 환경을 제공합니다. 액션 생성 시 명시적으로 Swift 액션 컨테이너를 생성할 수 있으며, 디폴트 버전은 3.1.1입니다.

Swift 3.1.1 액션은 다음 패키지를 사용할 수 있습니다.

연관 정보 바로가기

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

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

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

    처리중...