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'という名前のアクションを作ります。
実行可能なSwiftアクションでパッケージングする
Cloud FunctionsでSwiftソースコードファイルを利用してアクションを作成する際、アクションが実行される前にバイナリーでコンパイルされなければなりません。一度コンパイルされた後は、作業を待機するコンテナ―が削除される前まで後続のアクション呼び出しに対しては素早くレスポンスします。
このように、コンテナーが削除された後は、初めてのアクション実行の際にレスポンスの遅延が発生するが、このようなレスポンスの遅延は、cold-start遅延で知られています。このようなcold-startの遅延を避けるためには、自分のSwiftファイルを直接バイナリーでコンパイルして作成されたZIPファイルをCloud Functionsにアップロードする必要があります。
バイナリーを作る最も簡単な方法は、実行される環境と同じ環境内でビルドすることです。以下の例を通じて、直接バイナリーを作成することについて調べていきます。
まず、Dockerを利用してSwiftアクションのコンテナーを実行します。
$ docker run --rm -it -v "$(pwd):/owexec" openwhisk/action-swift-v3.1.1 bash
このコマンドは、Dockerのコンテナー内のbash shellを利用できるようにします。
ソースコードをコピーしてビルドするために準備します。
$ 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
(選択事項) 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に追加する必要があります。
Package.swiftをspm-buildフォルダにコピーします。
$ cp /owexec/Package.swift /swift3Action/spm-build/Package.swift
spm-buildフォルダに移動してコンパイルします。
$ cd /swift3Action/spm-build $ swift build -c release
ZIPファイル作成し、Dockerのコンテナーから抜け出ます。
$ zip /owexec/hello.zip .build/release/Action $ exit
hello.zipファイルは、hello.swiftのようなフォルダ内に作成されています。
このファイルを、helloSwifty名で新しいアクションを作成します。
アクションを実行し、より速くなった速度を確認することができます。
基本パラメータを設定する
毎回アクションを実行する度にパラメータを転送する代わりに、特定のパラメータに基本値を指定することができます。
上記で作成したhelloアクションのplace
パラメータに基本値を登録してみます。
アクション実行時にパラメータを転送する
アクションの実行の際、入力でパラメータを転送することができます。 Main関数に転送されるパラメータは、JSON object形式で転送されます。
パラメータは、アクションの実行の際に直接入力するか、JSON形式のファイルを作成して転送することができます。 ファイルを通じてパラメータを転送する場合には、以下のようなJSON形式のファイルを作成する必要があります。
アクションのランタイム情報
各アクションコンテナーには、基本ライブラリーが内蔵されており、このライブラリーは別途の追加作業なしにインポートして利用することができます。
Swift 3のライブラリー
Swift 3.1.1環境を提供します。アクションの作成の際に明示的にSwiftアクションのコンテナーを作成することができ、デフォルトバージョンは、3.1.1です。
Swift 3.1.1のアクションは、次のようなパッケージを利用することができます。
- KituraNet version 1.7.6, https://github.com/IBM-Swift/Kitura-net
- SwiftyJSON version 15.0.1, https://github.com/IBM-Swift/SwiftyJSON
- Watson Developer Cloud SDK version 0.16.0, https://github.com/watson-developer-cloud/swift-sdk
関連情報へ
下のガイドから関連情報をご確認いただけます。