Killercoda でハンズオン・シナリオを作ってみよう

# 要約
- Killercoda はマジすごい！便利！可愛い（？）ので、
皆でシナリオを体験したり作ったりしましょう。

# はじめに

- 本日 12/6（水）18 時開始の「[クラウドネイティブの旅に出よう: REST API、gRPC、GraphQL 触ってみた](https://ibm-developer.connpass.com/event/302483/)」という connpass イベントに登壇します。
    - 少し捕捉しておくと、このイベントは NSSOL と IBM の有志メンバーで行なっているシリーズ勉強会です。クラウドネイティブについて勉強し発表しています。
        - 以上、宣伝でした。
- こういう勉強会って話を聞くだけだと途中で飽きちゃったりしますよね。なので、発表者のデモ環境と参加者のハンズオン環境を兼ねて Killercoda を使うのが良いと考えています。
- [Killercoda](https://killercoda.com) とは、ブラウザを開くとすぐに Linux や Kubernetes 環境にアクセスできるウェブサービスです。
    - ユーザとしては、既存のシナリオからローカルのセットアップなどなく学ぶことができ、
クリエイターとしては、色々なツールや技術を教えるためのシナリオを提供することができます。

# Killercoda シナリオの概要

- Killercoda のシナリオを開始すると、こんな感じのビューになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105953/4f494093-47ae-8f80-1910-e221e88f9861.png)

    - 左側にはシナリオの説明欄があり、右側にはターミナルやエディタが表示されます。
        - エディタとしては [Theia](https://github.com/eclipse-theia/theia) と呼ばれる OSS が組み込まれています。
    - 説明欄に表示する md やシナリオ内で利用するファイル等を Github リポジトリで管理し、そのリポジトリを Killercoda と連携することでクリエイターはシナリオを公開することができるという仕組みです。
- ユーザは説明欄にある GUI 上のボタンをクリックしたり、ファイルをエディタで編集するなどしながらハンズオンを進めていくことができます。
    - Killercoda で個人的に最も優れていると思うのは、シナリオに記載されているコマンドを 1 クリックで実行させられることです。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105953/8e3a5cd4-2f05-09f5-f10b-519d21d41c7b.png)
    - テキストのコピーなどもできるため、「こう書き換えてみましょう」みたいな指示も出しやすいです。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105953/79efef80-a8f3-2fd0-d61f-02768f29c2e0.png)

# Killercoda シナリオの基本構成
- 本日のイベントのために私が作成した [gRPC のハンズオン・シナリオ](https://killercoda.com/tofuchic/scenario/grpc-quickstart)も [Github で管理されている](https://github.com/tofuchic/killercoda)ので、これを元に説明します。

- Killercoda の各シナリオは「イントロ・ステップ・まとめ」の三部構成になります。具体的には次のような JSON で、ステップだけが複数のページに分けて表現できるようになっています。
    ```json
    {
      "title": "Quick start: gRPC",
      "description": "Run the example, and later update the schema(.proto) and applications",
      "details": {
        "intro": {
          "text": "intro.md",
          "foreground": "foreground.sh",
          "background": "setup.sh"
        },
        "steps": [
          {
            "text": "step1.md"
          },
          {
            "text": "step2.md"
          },
          {
            "text": "step3.md"
          },
          {
            "text": "step4.md"
          },
          {
            "text": "step5.md"
          },
          {
            "text": "step6.md"
          },
          {
            "text": "step7.md"
          }
        ],
        "finish": {
          "text": "finish.md"
        }
      },
      "backend": {
        "imageid": "ubuntu"
      },
      "interface": {
        "layout": "ide"
      }
    }
    ```
    - `text` にマークダウンを指定することで、説明欄に表示する文章等を制御します。
        - たとえばこれが `step1.md` の内容です。
            ```md
            # Step 1: Prerequisites
            
            1. Check the Go version is one of the three latest major [releases of Go](https://go.dev/doc/devel/release).
            
                ```bash
                go version
                ```{{exec}}
            
            1. Install the [Protocol buffer](https://developers.google.com/protocol-buffers) compiler, `protoc`.
            
                ```bash
                apt install -y protobuf-compiler
                ```{{exec}}
            
            1. Install the Go plugins for the protocol compiler.
            
                ```bash
                go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
                go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
                ```{{exec}}
            
            1. Update the path.
            
                ```bash
                echo 'export PATH="$PATH:$(go env GOPATH)/bin"' >> ~/.bashrc
                source ~/.bashrc
                ```{{exec}}
            
            1. Check the commands are installed.
            
                ```bash
                protoc --version
                protoc-gen-go --version
                ```{{exec}}
            ```
            - `{{exec}}`という見慣れない表現があると思いますが、このように書いておくと、クリックでコマンド実行が実現できます。
    - `backend` に指定する `imageid` を変更することで、Linux 環境か Kubernetes 環境かを変更することができます。
        - 今回私が作ったハンズオンは Kubernetes が不要なため、`ubuntu` にしました。
    - `interface.layout` に `ide` と設定されていますが、これを指定することでシナリオスタート時のデフォルトビューがエディターになります。指定しないとデフォルトビューがターミナルになりますが、いずれにしても、どちらかが使えなくなるわけではありません。デフォルトビューが変わるだけなのでご安心ください。
    - `foreground` または `background` にシェルスクリプトを指定することで、随所で特定の処理を走らせることが可能です。たとえば、環境構築のための事前準備をユーザの手を煩わせることなく済ませる、といったことが可能です。
        - 各ステップやまとめにおいてもスクリプトを実行できるのですが、今回私はイントロでのみ使用しました。
            - デフォルトでインストールされていた `go` コマンドのバージョンが古かったので、最新版をインストールするスクリプトを走らせています。
    - 今回私は使っていませんが、`verify` にシェルスクリプトを指定することで、各ステップ毎に進捗を確認しながらシナリオを進めさせるような機能もあります。

# Killercoda シナリオの作成

- どうでしょうか、皆さんも何かシナリオを書きたくなってきたのではないでしょうか。
- 「コマンドの実行」や「テキストのコピー」の他、ネットワークに関する Killercoda 特有の仕様等があるのですが、[易しいガイド](https://killercoda.com/creators)があったり[サンプルシナリオが豊富](https://github.com/killercoda/scenario-examples)なので心強いです。


# Killercoda の課金形態

- FREE Membership
    - Killercoda、すごく便利なんですがなんとこれ無料で使えてしまうんです。
    - 一応次のような制約はあるのですが、後述するようにあまり気になることはありません。
         1. 1 つのシナリオは 1 時間経つと環境が削除される
         1. 同時に進められるシナリオは 1 つまで
            ...etc
- PLUS Membership
    - FREE Membership の制約が解除あるいは緩和されたプランです。
    - ひと月・半年・通年と 3 種類のサブスクリプションがあり、長く購入する方がディスカウントが利きます。

# 注意事項？

- Killercoda には実は前身たる Katacoda というサービスがありました。両方ともほぼ同じ機能を持っており、シナリオの移行ガイドなんかもあるのですが、どうして Katacoda はサ終してしまったのでしょうか。
    - 詳しくないのですが、おそらく収支が取れなくて存続できなかった、みたいな話だったかと思います。
- 当たり前ですが、リモートでコンテナが立ち上がっているのだとすれば、そのコンテナを動かしている基盤をホストしてくれている人たちがいるはずです。
- アクティブユーザ数に対してあまりに多くの無料ユーザがいると Katacoda の轍を踏ませることになってしまう気もします。
    - 正直、複数のシナリオを同時に進めたことなんてありませんし、1 時間で終わらなかったシナリオも大抵の場合は最初から進めるで問題ありません。
    - 課金する理由は見つからないのですが、しかし、推せるときに推しとけ、みたいな話もあります。


# おわりに

- ということで、Killercoda の薦めでした。
- 私の作成したハンズオン・シナリオを触っていただけた方がいて、もし何かフィードバックなどあれば Issue を作っていただけると幸いです。
- 本記事にたくさんの「いいね」が付いたら、私は Killercoda に課金しようと思います。