🦄

アイレポGateway をDockerを使いAWS AppRunnerにデプロイしてみた

2023/01/10に公開

こんにちはアイレポユーザー会でいつもお世話になっております。

ConMas i-Reporterアイレポを活用していますか?
一般的な機能でもたくさんの機能があるアイレポですがカスタマイズや連携をする際にはアイレポのAPI を使う他にPythonでAIやビックデータやIOTなど様々な恩恵が得ることができるConMasGatewayを使う方法があるかと思います。

Gateway はすごく良い。という噂は聞くけど、、。
どうやってるやるの?
気軽に出来ないの?
など展開の仕方に悩みがある方がいるかと思います。そんな方向けの記事です。

アイレポ Gateway を活用するには

  • 情シスへのサーバーインストール依頼の敷居が高い
  • Python、Node.js のインストールの敷居が高い

など活用する以前の壁があるかもしれません。

※i-Reporter の標準機能で ConmasGateway とは
https://www.ireporter7.jp/conmas-gateway

Gateway は Windows の他 Linux でも活用出来ると謳われております。
サポートサイトに Gateway のインストール方法がありますが Windows のインストールのみですので
もっと手軽に展開する方法として Docker を使い本番サーバーへの展開方法として最近リリースされ話題の AWS の AppRunner へのデプロイを試してみました。

今回の記事は Docker を活用してローカルで開発を行ない、その Docker をそのままの形で活用出来る AWS の AppRunner を使ってみます。

まずは下記の記事等を参考に Docker のインストールを済ませましょう。

※Docker インストール方法
https://qiita.com/gahoh/items/92217e0a887bb81e3155
https://chigusa-web.com/blog/windowsにdockerをインストールしてpython環境を構築/

まずサポートサイトから Gateway 一式をダウンロードし一番上の gateway というフォルダをルートディレクトリとしてVisualStudioCode で開きます。
gatewayというフォルダをドラッグアンドドロップで
VisualStudioCodeでルートディレクトリとして開くことも出来ます。



さて Gateway はサポートサイトからダウンロードしますとこのようなフォルダ構成になっておりDockerfileとrequirements.txtは今回の記事用に生成しています。

├── 📂actions
├── 📂config
├── 📂ex
├── 📂logs
├── 📂modules
├── 📂node_modules
├── 📂scripts
├── 📂sql
├── 📂uploads
├── Dockerfile
├── index.js
├── package-lock.json
├── package.json
└── requirements.txt

GatewayはNode.jsとPythonの双方の実行環境を必要とします。
本来は自分のパソコンで使用するには Node.js と Python というプログラミング言語をインストールする必要があります。
しかし
今回は Dockerという仕組みを使用してパソコン内にコンテナというものを作成しその中で Node.js と Python を操ります。
このようにすることで自分のパソコンの環境を汚さず色々なプログラミング言語やプログラムを試すことが出来るというメリットがDockerにはあります。

まずrequirements.txtというファイル名を VSCODE で作ります。

これは Python のパッケージ(ライブラリ)をpipで管理している場合、設定ファイルrequirements.txtを使って指定のパッケージを指定のバージョンで一括インストールすることができる便利なファイルです。
その際プロジェクトのルートフォルダにファイルを置くことが注意点です。

requirements.txt
matplotlib
qrcode
Image
python-barcode
pandas
xlrd
requests
Japanera
psycopg2
opencv-contrib-python-headless

次にDockerfileというファイル名を VSCODE で作り下部のコードを貼り付けます。
先程と同じくプロジェクトのルートフォルダにファイルを置くことが注意点です。

Dockerfile
FROM nikolaik/python-nodejs
WORKDIR /usr/src/app
COPY package*.json ./
COPY requirements.txt ./
RUN pip install -r requirements.txt
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "index.js" ]

1 行目のFROM nikolaik/python-nodejsは、Node.js と Python 両方使える Docker コンテナイメージを使うよ。ということです。
今回はDockerfileがスッキリするためスターの数や他の記事を参考に、こちらのイメージを使用することにしました。

https://hub.docker.com/r/nikolaik/python-nodejs

新しいターミナルを開きコマンドを叩きます。今回はVSCODE上でターミナルを開きます。

docker build -t gateway .

このコマンドはdockerというコマンドを使用し先程のDockerfileというファイルを使用してコンテナイメージを作る(ビルド)ということです。
※もしdockerというコマンドが使用できない場合Google等で検索することで解決はできるかと思います。

  • -t でgatewayという名前の docker のコンテナイメージを作るという意味です。
  • docker build -t gateway . このドットが先程のDockerfileを使うという意味です。

今までの作業(ビルド)を行うと以下のように DockerDesktop 上に gateway というコンテナイメージが作成されます。

docker image ls

でも同様の結果が得られます。

続いて以下のコマンドをターミナルで叩きます。

docker run -d --name gateway --rm -p 3000:3000 gateway

docker container ls

でも同様の結果が得られます。

これは先程作成したgatewayという名前の docker コンテナイメージからgatewayという名前の docker コンテナを作成するという意味です。

  • --rmオプションはコンテナ停止時にコンテナを削除するという意味です。
  • -pオプションはローカル上とdocker上のポートを3000番にあわせています。

※Docker イメージとコンテナの違い
https://www.kagoya.jp/howto/rentalserver/dockerimage/

これでdockerによるgatewayの開発環境が構築が出来ました。思ったより簡単じゃないでしょうか?
では正しく作成出来ているかcurlというコマンドを使用しテストしてみます。

curl http://localhost:3000/api/v1/getvalue/test --header 'Authorization: Bearer nihuidoaanca88'

以下のような結果が返ってき来たら成功です。※jqというコマンドで見やすくしています。

{
  "result": {
    "code": 0,
    "description": "Success!!!"
  },
  "apply": [
    {
      "item": "text",
      "sheet": 1,
      "cluster": 0,
      "type": "string",
      "value": "ABC"
    }
  ]
}
アイレポで試す場合

アイレポで試す場合はDesigner上でGatewayのアクションクラスターを用意し上記のurlを設定することで1枚目のシートのクラスターindexの0番目の値がABCとgatewayから入力されます。

以下のコマンドで作成したコンテナを停止します。停止とともにコンテナ自体も削除されます。※イメージは残ります。

docker stop gateway     

さて、ここまででローカルでのgatewayの開発環境が構築することが出来ました。
実際のローカルの開発ではコードを変更したらdocker buildを行うことを繰り返します。

でも、ローカルのままですと現場からの通信が届きません。
そこで今回は今作ったdockerコンテナイメージをAWSのAppRunnerというサービスを活用してみます。

まず今回作成したgatewayのオリジナルのDockerイメージをAWS用のリポジトリの登録先であるAmazonECRのページへ行きます。
マネージメントコンソールからECRと検索しAmazonECRのページへ行きます。

https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1

リポジトリを作成をクリックします。
※東京リージョンが望ましいです。

リポジトリ名をgatewayとしプライベートを選択後リポジトリを作成をクリックします。
その他の設定は今回は何も設定していません。


一覧に戻り画面上部に正常に作成されたという緑色のバーが現れます。

作成したgatewayリポジトリをチェックいれた状態でプッシュコマンドの表示をクリックします。

以下のようにローカルで実行する1から4までのコマンドが表示されます。
これ通りにコピーして使用するだけでAWS上にGatewayのDockerファイルが登録出来ます。
とっても簡単ですね!

AWS CLIをインストールとECRの認証方法

表示されたコマンドどおりにコマンドを叩きます。

ECRへのpushはしばらく時間がかかります。

アップロードが完了したら続いてはAppRunnerです。

その前に一覧上でURIをコピーしておきます。後ほど使用します。

※AWS APP RUNNER とは
https://aws.amazon.com/jp/apprunner/

マネージメントコンソールからAppRunnerと検索しAppRunnerへ行きサービスの作成をクリックします。

先程コピーしたコンテナイメージのURIを貼り付けます。コンテナレジストリを選択しデプロイ設定は楽をしたいため自動を選択しAppRunnerECRAccessRoleを選択し次へを押します。

サービス名をgatewayとしポートを3000番ポートにしました。

最終確認を行ない作成とデプロイを押します。

うまく行くとステータスがRunningとなります。
これだけで完成です!え??すごい。

デフォルトドメインで表示されたリンクをコピーしテストします。
※アドレスはそれぞれ違います。以下を修正してテストしましょう。

curl https://hogehoge.ap-northeast-1.awsapprunner.com/api/v1/getvalue/test --header 'Authorization: Bearer nihuidoaanca88'

ローカルと同様の以下のような結果が返ってき来たら成功です。※jqというコマンドで見やすくしています。

{
  "result": {
    "code": 0,
    "description": "Success!!!"
  },
  "apply": [
    {
      "item": "text",
      "sheet": 1,
      "cluster": 0,
      "type": "string",
      "value": "ABC"
    }
  ]
}

いかがでしたでしょうか?
AppRunnerを利用することでインフラ設定(ネットワーク、オートスケーリング、ロードバランシング、SSL、CI/CDなど)これらをまとめて(隠蔽して)出来てしまいます。
ローカルで変更したらpushすることで自動でコードが反映されます。。すごい。。

Dockerは慣れないかもしれませんが、
ローカルの環境がそのまま本番でも展開出来ることの雰囲気とメリットがなんとなくつかめましたでしょうか?

同じような内容で一つのdockerイメージがあれば
AzureでもGCPでもHerokuでも同じようなステップでデプロイが可能になります。
ベンダーロックインされない。
これがDockerの魅力でもあります。

GatewayとDockerは相性がとてもよいと思います。
次回はherokuのコンテナ方法を紹介します。お楽しみにしてください。
ではレッツ愛レポ!

Discussion