Node-REDをGAE上で動かす

初投稿になります。
今まで枯れた技術ばかり触ってきましたが、新しめの技術を使う仕事になったため、デビューしました。よろしくお願いいたします。
今回はGAEのCustom Runtime上でNode-REDを動かす場合のサンプルを記載していきます。


#ゴール
Google Cloud Compute上にインスタンスを作成し、Node-REDアプリケーションをgcloudコマンドを使用してGoogle App Engine上にデプロイします。


#環境（GCP）
OS： Ubuntu 14.04 LTS
Machine Type: g1-small (1 vCPU, 1.7 GB memory)
その他の設定はデフォルトですが、GCS等を使用する場合は後から変えられないので、APIの権限を付与してください。


#手順

###事前準備
#####Node-REDのインストール
まずは下記ページを参考にNode-REDをインストールします。
http://nodered.org/docs/getting-started/installation
僕の場合は/root直下に.node-redフォルダが作成されました。この配下に実際に開発時に作成したフローのJSONファイルや設定ファイルが作成されます。


####Dockerfileを作成する。
Dockerを使用して、GAE上にデプロイを行います。
GAE Custom Runtime上にアプリケーションをデプロイする際は下記URLに記載のあるNode.jsのイメージをベースとします。
https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build#configuring_the_dockerfile

DockerファイルのサンプルもGit上にあるので、こちらをベースとさせて頂きました。
記載例としては以下のような感じです。

```

# Use the base App Engine Docker image, based on debian jessie.
  FROM gcr.io/google_appengine/base
# Install updates and dependencies
  RUN apt-get update -y && apt-get install --no-install-recommends -y -q curl python build-essential git ca-certificates libkrb5-dev && \
  apt-get clean && rm /var/lib/apt/lists/*_*
# Install the latest LTS release of nodejs
  RUN mkdir /nodejs && curl https://nodejs.org/dist/v4.4.5/node-v4.4.5-linux-x64.tar.gz | tar xvzf - -C /nodejs --strip-components=1
  ENV PATH $PATH:/nodejs/bin
# Install semver, as required by the node version install script.
  RUN npm install https://storage.googleapis.com/gae_node_packages/semver.tar.gz
# Add the node version install script
  ADD install_node /usr/local/bin/install_node
# Set common env vars
  ENV NODE_ENV production
# ここまでサンプルの記載

# ここから追記
# ベースイメージにNode-REDモジュールを追加
  RUN mkdir /node-red
  RUN mkdir /root/.node-red
  ADD .node-red /root/.node-red
  ADD v4.4.5 /node-red/v4.4.5
# PATHを追加
  USER root
  ENV PATH=$PATH:/node-red/v4.4.5/bin
# 念のためポート開放
  EXPOSE 8080
# Node-REDを起動する。
  CMD ["node-red"]

```


サマリとしてはローカルのファイル配置に合わせたDockerのイメージを作成し、Node-REDを動かしているという事です。


####settings.jsを修正する。
GAEはアプリケーションが稼働するポートは8080を指定するため、Node-REDの稼働ポートを8080に修正します。（Node-REDのデフォルトは1880）

```
#前略

module.exports = {
    // the tcp port that the Node-RED web server is listening on
    uiPort: 8080,

#後略
```

###デプロイ
####Node-REDモジュールのコピー
Dockerイメージに追加する.node-redフォルダとNode-REDの実行ファイルが含まれるnodejsのフォルダ（今回はバージョン4.4.5を使用しました）をコピーし、Dockerfileがあるフォルダに配置します。

####app.yamlの作成
GAEへのデプロイ用に下記のようなファイルを作成しました。

```

# customの指定は必須です。
runtime: custom
vm: true
threadsafe: true
# 任意のサービス名を指定下さい。
service: 'test'
resources:
  cpu: .2
  memory_gb: .15
# デプロイに失敗した際に永続的にインスタンスを起動していたため下記の設定とした。
automatic_scaling:
  min_num_instances: 1
  max_num_instances: 1
health_check:
  enable_health_check: false

```



####gcloudコマンド実行
下記コマンドを実行し、GAEのCustom Runtime上にデプロイします。

```
gcloud preview app deploy <app.yamlの絶対パス> --project <使用するGCPのプロジェクト> -q
```

####デプロイ確認
下記のフォルダにアクセスして、Node-REDの編集画面が開かれればデプロイ完了です。

https://＜app.yamlで指定したサービス名＞-dot-＜GCPのプロジェクト名＞.appspot.com/

フローの動作確認は下記のような指定になります。
https://＜app.yamlで指定したサービス名＞-dot-＜GCPのプロジェクト名＞.appspot.com/＜フロー名＞


##感想
・GAEではコマンドラインに出力されるログはGCPのLoggingの所に出てくるので、ログ管理を意識しなくて良いですし、GoogleのAPI呼び出しが楽になります。
・注意点としては、デプロイの度にイメージを作成し直すため、あくまで運用環境や稼働確認の環境とする事ですね。
・自分でも試行錯誤しながら進めたので、最適解ではないかもしれませんが、ご参考までにどうぞ。（Dockerfileの記載は不勉強なため、特に）