LoginSignup
3
2

ShinyProxyをCloud9で動かす

Posted at

はじめに

統計解析向けに使われるR言語をWebアプリ化できるShinyというパッケージがあります。
この課題を解決できるShinyProxyというものを触ってみましたので、記事にしました。

参考

Shinyの課題

参考に紹介したQiitaの記事から引用します。

OSSのShiny Serverでは、1つのShinyappが 1 processで動くため、複数人のユーザでアクセスすると、急に動きがもっさりしがちです。例えば、ユーザA、Bの順でアクセスして、データをロードしはじめると、ユーザAの処理が終わるまで、ユーザBは待たないといけないので、待っている間ストレスがかかります

ShinyProxyでの解決

ShinyProxyでは以下のようなことを行って、先の課題を解決しています。

  1. Shinyのアプリをdockerイメージで用意します
  2. 上記イメージを使うよう、ShinyProxyで設定します
  3. ShinyProxyでユーザを認証し、ユーザごとにコンテナを起動してくれます

余談:その他の解法

ShinyProxyは自前でサーバを運用・管理する必要がありますが、以下のサービスを使えばサーバの管理も不要のようです。

認証機能込みのSTANDARDプランだと、月額16,000円くらいです。サーバ管理から解放されることを考えるとよい値段と思います。

やってみた

Cloud9のインスタンスは、コンテナを使うのでt3.smallにしました。

Standaloneモードで実行

Standaloneモードは、ホスト上でShinyProxyを動かすものになります。

まず公式のGetting Startedに従ってやっていきます。
Javaの確認です。

$ java -version
openjdk version "11.0.18" 2023-01-17 LTS
OpenJDK Runtime Environment Corretto-11.0.18.10.1 (build 11.0.18+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.18.10.1 (build 11.0.18+10-LTS, mixed mode)

DockerはCloud9だとインストール済みなので、Docker startup optionsに続きます。
こちらは、以下のサイトを参考にしました。

# 新規作成
$ mkdir /etc/systemd/system/docker.service.d
$ sudo vi /etc/systemd/system/docker.service.d/override.conf

# 以下の内容を追加
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -D -H tcp://127.0.0.1:2375

# 以下のコマンドを実行
$ sudo systemctl enable docker.service
$ sudo systemctl status docker.service
$ sudo systemctl start docker.service
$ sudo systemctl stop docker.service
$ sudo systemctl restart docker.service
$ sudo docker version

ShinyProxyを実行

ShinyProxyを実行するには、rpmファイルをダウンロードしてインストールする方法と、jarファイルを実行する方法があります。

jarファイルを直接実行する場合
$ wget https://github.com/openanalytics/shinyproxy/releases/download/v3.0.1/shinyproxy-3.0.1.jar

$ java -jar shinyproxy-3.0.1.jar 
インストールする場合
$ https://www.shinyproxy.io/downloads/shinyproxy_3.0.1_x86_64.rpm
$ sudo yum localinstall ./shinyproxy_3.0.1_x86_64.rpm 

$ sudo systemctl enable shinyproxy
$ sudo systemctl start shinyproxy
$ sudo systemctl status shinyproxy
# 止める場合
$ sudo systemctl status shinyproxy

プレビューで見てみますと、ログイン画面がでました。
image.png
image.png

一旦、CTRL-Cで止めます。

デモ用ShinyアプリのイメージをPULL

$ docker pull openanalytics/shinyproxy-demo

結構大きめでした。

$ sudo docker images | grep shinyproxy
openanalytics/shinyproxy-demo   latest    a4ad82a764ab   11 months ago   1.35GB

config

以下の公式を参考にしていきました。

jarでの実行時は、jarと同じフォルダに、application.ymlを配置します。

touch application.yml

インストールでの場合は/etc/shinyproxy/application.ymlになります。

authentication: simpleだけ修正します。

application.yaml
proxy:
  title: Open Analytics Shiny Proxy
  logo-url: https://www.openanalytics.eu/shinyproxy/logo.png
  landing-page: /
  heartbeat-rate: 10000
  heartbeat-timeout: 60000
  port: 8080
  authentication: simple
  admin-groups: scientists
  # Example: 'simple' authentication configuration
  users:
  - name: jack
    password: password
    groups: scientists
  - name: jeff
    password: password
    groups: mathematicians
  # Example: 'ldap' authentication configuration
  ldap:
    url: ldap://ldap.forumsys.com:389/dc=example,dc=com
    user-dn-pattern: uid={0}
    group-search-base:
    group-search-filter: (uniqueMember={0})
    manager-dn: cn=read-only-admin,dc=example,dc=com
    manager-password: password
  # Docker configuration
  docker:
    cert-path: /home/none
    url: http://localhost:2375
    port-range-start: 20000
  specs:
  - id: 01_hello
    display-name: Hello Application
    description: Application which demonstrates the basics of a Shiny app
    container-cmd: ["R", "-e", "shinyproxy::run_01_hello()"]
    container-image: openanalytics/shinyproxy-demo
    access-groups: [scientists, mathematicians]
  - id: 06_tabsets
    container-cmd: ["R", "-e", "shinyproxy::run_06_tabsets()"]
    container-image: openanalytics/shinyproxy-demo
    access-groups: scientists

logging:
  file:
    name: shinyproxy.log

再度、ShinyProxyを実行します。

jarファイル直接実行の場合
$ java -jar shinyproxy-3.0.1.jar
インストールの場合
$ sudo systemctl restart shinyproxy

プレビューは、以下のボタンを押してブラウザでの表示で行います。内部のプレビューではログイン後にエラーになりました。
image.png

image.png

application.yamlで設定したユーザでログインします。
image.png
image.png
起動するまでの待ち画面が表示されます。
image.png
起動後は、以下の画面になりました。
image.png

アプリの選択前後でコンテナが増えていることがわかります。

# アプリを選択する前
$ docker ps --no-trunc
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 選択した後
$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                           COMMAND                             CREATED              STATUS              PORTS                     NAMES
a4a01ca81f2b3e0f73e7cfc1bbf4f7269ee4b5c82679e3594540104763801089   openanalytics/shinyproxy-demo   "R -e shinyproxy::run_01_hello()"   About a minute ago   Up About a minute   0.0.0.0:20000->3838/tcp   nervous_moser

Containerizedモード

Containerizedモードは、ShinyProxy自体もコンテナで動かすものになります。
公式の以下の通りにやってみます。

新しいディレクトリを作り、そちらで行っていきます。

$ mkdir test-containerized && cd test-containerized

# Dockerfileを作成し、上記GitHubの内容をコピーします
$ touch Dockerfile

# application.ymlも同様にコピーします
$ touch application.yml

# Dockerネットワークを作ります
$ docker network create sp-example-net

# 確認
$ docker network ls

# build
$ docker build . -t shinyproxy-example

# run
$ docker run -v /var/run/docker.sock:/var/run/docker.sock:ro --group-add $(getent group docker | cut -d: -f3) --net sp-example-net -p 8080:8080 shinyproxy-example

Standaloneの時と同様に、ログインしてアプリが実行できました。
image.png
image.png
image.png

自作のShinyアプリをイメージにして使う方法

今まではShinyのアプリが既にdockerイメージになっていましたが、今度はShinyアプリをdockerイメージにする方法も行ってみました。

以下の2つを参考にしました。

$ mkdir test-apps && cd test-apps

# テンプレートをクローン
$ git clone https://github.com/openanalytics/shinyproxy-template.git

$ cd shinyproxy-template/

# Shinyアプリのイメージを作成
$ docker build -t openanalytics/shinyproxy-template .

$ cd ..

$ touch application.yml

最初に作ったapplication.ymlの、specのみ以下に差しかえます。

application.yml(一部)
specs:
  - id: euler
    display-name: Euler's number
    container-cmd: ["R", "-e", "shiny::runApp('/root/euler')"]
    container-image: openanalytics/shinyproxy-template
    access-groups: scientists

Shinyproxyを実行します。

$ wget https://github.com/openanalytics/shinyproxy/releases/download/v3.0.1/shinyproxy-3.0.1.jar

$ java -jar shinyproxy-3.0.1.jar

アクセスすると、デモと同様にログイン画面が出てきます。
image.png
image.png

自分でbuildしたアプリが動いています。
image.png

おわりに

今回は統計解析のWebアプリの運用を楽にできるShinyProxyを紹介しました。
Cloud9上での実行でしたが、EC2でも同様の方法で動くと思われます。

どなたかのお役に立てれば幸いです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2