Np-Urのデータ分析教室

オーブンソースデータなどWeb上から入手できるデータを用いて、RとPython両方使って分析した結果を書いていきます

GKE(Google Kubernetes Engine)でオリジナルのShinyアプリケーションを公開する

本記事は、Shiny Advent Calendar 2018の10日目の記事です。


そして、Shiny100本ノックの第33弾です。

今回は、GKE(Google Kubernetes Engine)上でShinyアプリケーションを動かしてみます。

GKE(Google Kubernetes Engine)について

以前こちらの記事で、GKEについて簡単に説明しました。

www.randpy.tokyo

その際は、公開されているDocker イメージを元にShinyアプリケーションを公開してみました。

その続編として、オリジナルのShinyアプリケーションをDockerイメージにしてGCPにアップし、それをGKE上で公開するところまでやってみます。
Shny環境を含むDocker イメージの作り方については、以下で紹介しているので、Dockerに慣れていない方はまずこちらを読んでみてください。
www.randpy.tokyo

Docker イメージを作ってGCPにアップするまで

よくあるヒストグラムを表示するだけの、簡単なアプリケーションをDocker イメージにしてみます。もし試す場合は、お好きなコードでDockerイメージを作ってみてください。

ui.R

library(shiny)

shinyUI(fluidPage(
  
  titlePanel("GCPにアップしたShinyアプリケーション"),
  
  sidebarLayout(
    sidebarPanel(
       sliderInput("bins",
                   "Number of bins:",
                   min = 1, max = 50, value = 30)
    ),
    mainPanel(
       plotOutput("distPlot")
    )
  )
))

server.R

library(shiny)

shinyServer(function(input, output) {
   
  output$distPlot <- renderPlot({
    
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
  })
})

Dockerfile

R環境・Shiny環境、そしてShiny Serverを含み、先ほどのui.Rとserver.Rを実行するためのDockerfileを用意します。
なお、以下のようなフォルダ構成を前提にしています。

ー shiny-code/
 ー ui.R
 ー server.R
ー Dockerfile

Dockerfile**

FROM rocker/shiny

RUN apt-get update && apt-get install -y \
    libssl-dev \
    && apt-get clean \ 
    && rm -rf /var/lib/apt/lists/ \ 
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
    
COPY ./shiny-code/ /srv/shiny-server/shiny/

ビルド

ソースコードとDockerfileができたので、ビルドしましょう。その後、GCPの中の、Container RegistryにPushします。

$ docker build . -t  asia.gcr.io/xxxxxxxxxxx/simple-shiny:1.0
$ gcloud docker -- push asia.gcr.io/xxxxxxxxxxx/simple-shiny:1.0

なお、xxxxxxxxxxxのところは該当するGCPのプロジェクトIDに、simple-shinyのところはイメージ名、1.0のところはイメージのバージョンを指定してください。

GKEで公開

あとは、こちらの記事にしたがって公開をしてください。
www.randpy.tokyo

kubectl run shiny1 --image gcr.io/gcer-public/shiny-googleauthrdemo:latest --port 3838

上のコマンド部分のイメージ名のところを先ほどpushしたものに変更するだけで、その他は一緒のコマンドを打ってもらえれば公開できます。


最後に

一度yamlファイル等を作ってしまえば、Dockerイメージ名を変更するだけで、すぐに公開できます。
公開する際の選択肢として、GCPを候補の一つにしてみてください。