post Image
IBM OpenWhiskというサーバーレス実行環境を用いて、Swiftでおみくじ🎍

クラウドサービスは、AWS・Azure・GCPなどありますが、Swiftに対応しているサービスがあるのは現状IBM Bluemixのみのはずです(他のサービスでも仮想UbuntuマシンでSwift実行環境を整えることなどはできるがそれは除く)。

本記事では、そのうちOpenWhiskという、サーバーレス実行環境をSwiftで使ってみます。他のクラウドサービスの以下に相当するサービスです。

Swiftが使える以外にもオープンソース公開されているという特徴があります。そのため、Issue・Pull Requestを投げたり、自前サーバーに環境を構築することができます。

しばらくベータ版でしたが、昨年2016年12月にめでたく正式リリースされました🎉
General Availability: What’s new in IBM Bluemix OpenWhisk? – Bluemix Blog

Swiftでおみくじを作ってみる

では、Swiftでおみくじを作っていきます。

IBM Bluemixコンソールにアクセスできるようにする

IBM Bluemixコンソールにアクセスして、アカウント登録します。30日間はリソースに制限はありつつもほぼすべての機能を無料で試用できます。それを超えると、クレジットカード登録が必要です。他のクラウドサービスと同様、Billingで意図しない課金が発生していないか気を付けながら使いましょう。

OpenWhiskの価格は、 OpenWhisk – Pricing に記載されています。

  • 無料枠: 毎月40万GB-seconds
  • 超過分: $0.000017/1GB-second

参考: クラウドサービスIBM Bluemixを無料で使うノウハウまとめ – Qiita

OpenWhiskを使ってみる

OpenWhiskがトップページです。
OpenWhisk – Editorにてブラウザ上でコードを書いたり操作したりできますが、本記事ではコマンドライン中心にやっていくので、OpenWhisk – CLIにて、wskというコマンドラインツールをダウンロード設定していきます。

コマンドラインツールのインストール

僕はダウンロードしてmv wsk /usr/local/binにて配置しました。pipインストールする方法もあるようですが、数ヶ月前の記事の通りやったら404エラーで、確かな方法が分からなかったので諦めました。

Authorization Keyのセット

OpenWhisk – CLIに書いてあるコマンドをコピペして実行します。

$ wsk property set --apihost openwhisk.ng.bluemix.net --auth ㊙️ひみつのauthentication key㊙️

設定ができたか確認

こちらを入力して、

$ wsk action invoke /whisk.system/utils/echo -p message hello --blocking --result

こちらが返ってくれば成功です。

{
    "message": "hello"
}

オプションの意味を、wsk action invoke --helpコマンドで確認してみます。

-b, --blocking blocking invoke

デフォルトでは呼び出すだけで結果が返ってくるのを待たないようなので、結果を確認したい場合必要のようです。

-r, --result show only activation result if a blocking activation (unless there is a failure)

activation resultのみを得たい時のオプションですね。省くと次のような冗長なレスポンスとなりました。

ok: invoked /whisk.system/utils/echo with id 7503c91d5d104b1c99583960aaae2b56
{
    "namespace": "メールアドレス_mono",
    "name": "echo",
    "version": "0.0.41",
    "subject": "メールアドレス",
    "activationId": "7503c91d5d104b1c99583960aaae2b56",
    "start": 1483419817114,
    "end": 1483419817117,
    "duration": 3,
    "response": {
        "status": "success",
        "statusCode": 0,
        "success": true,
        "result": {
            "message": "hello"
        }
    },
    "logs": [],
    "annotations": [
        {
            "key": "limits",
            "value": {
                "logs": 10,
                "memory": 256,
                "timeout": 60000
            }
        },
        {
            "key": "path",
            "value": "whisk.system/utils/echo"
        }
    ],
    "publish": false
}

OpenWhiskのActionを作成

Web UIでやる場合は前述の通り、OpenWhisk – Editorを弄っていけば良いですが、今回はwskコマンドでやっていきたいので、Getting started with OpenWhiskを参照していきます。

Creating and invoking OpenWhisk actionsの項目にActionの作成の仕方が書いてあります。

Swiftでおみくじロジックを書く

OpenWhiskで呼び出せるSwiftスクリプトは、以下のようにargs: [String:Any]を受けて、[String:Any]を返すmain関数を用意する必要があるようです。

func main(args: [String:Any]) -> [String:Any] {
    // ここに何か書く
}

というわけで書きました。

import Foundation
// https://gist.github.com/rymcol/48a505c2a1c874daea52a296a2687f5f (そのままではランダムにならなかったので、さらに工夫)
#if os(Linux)
    private func arc4random_uniform(_ max: UInt32) -> Int32 {
        srand(UInt32(NSDate().timeIntervalSinceReferenceDate))
        return rand() % Int32(max-1)
    }
#endif

private func random(_ upper: Int) -> Int {
    return Int(arc4random_uniform(UInt32(upper))) % upper
}
// 文字化けするのでアルファベット🤕
//private let omikujis = ["大吉😋", "中吉💋", "小吉🐶", "吉😕", "末吉🤕", "凶😡", "大凶🔪"]
private let omikujis = ["daikichi", "chukichi", "shokichi", "kichi", "suekichi", "kyo", "daikyo"]
private func doOmikuji() -> String {
    return omikujis[random(omikujis.count)]
}

func main(args: [String:Any]) -> [String:Any] {
    // 文字化けするのでアルファベット🤕
//    let r = ["Swiftおみくじの結果です": doOmikuji()]
    let r = ["Swift Omikuji": doOmikuji()]
    print(r)
    return r
}

コメントに書いてありますが、Linux環境用にarc4random_uniform(_:)関数を用意する必要がありました🤕
また、日本語が文字化けしてしまい、解決法が分からなかったのでとりあえずアルファベットにしました🤕

Action作成・更新

omikujiという名前でアクションを作成します。

  • 作成: wsk action create omikuji omikuji.swift
    • 初回
    • wsk action listomikujiが一覧されることを確認
  • 更新: wsk action update omikuji omikuji.swift
    • 2回目以降

Action実行

上で/whisk.system/utils/echoを呼びましたが、それと同様に次のように呼べます。

wsk action invoke omikuji --blocking --result

うまくいくと、次のような結果が返ってきます。

{
    "Swift Omikuji": "chukichi"
}

エラーが発生したら、--resultを外して詳細を確認しましょう。

HTTPアクセスしてみる

Experimantal版の簡単な方法

Exposing your actions via API Gateway (Experimental)に書いてあります。

次のコマンドを実行すると、HTTPアクセス可能なURLを生成してくれます。

$  wsk api-experimental create /omikuji get omikuji

こちらでおみくじできます🎍:
https://8305f020-572f-4eed-acd1-d8887bee03c7-gws.api-gw.mybluemix.net/omikuji

REST APIを用いた方法

以下の情報を元にがんばりました。

ちょっと手こずりましたが、以下のようにするといけました。

認証情報を確認:

$ cat ~/.wskprops
→ AUTH=㊙️

curlでPOSTリクエスト:

curl -u ㊙️ -X POST --data '{}' -H "Content-Type: application/json"  https://openwhisk.ng.bluemix.net/api/v1/namespaces/名前空間名/actions/omikuji\?blocking\=true\&result\=true

ちょちょいとやるつもりが、けっこう手こずりました🤕
wsk action createコマンドで、多分単一Swiftファイルしか指定できないようでライブラリも使えなさそうなので、そうなるとけっこう利用シーンが限定されるかなと思いました🤔
Lambda系サービスははそういうもんなのかもしれないですが、とはいえもうちょっと自由が欲しいなと思いました。
でも大体使えるようになったので、連携機能使ったり実利用してみたりしたいなと思っています( ´・‿・`)

関連リンク


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。