Fn Project ならオンプレミス環境でもサーバーレスが実現できるみたい

f:id:ts0818:20200926154618j:plain

Serverless computing is a cloud computing execution model in which the cloud provider runs the server, and dynamically manages the allocation of machine resources. Pricing is based on the actual amount of resources consumed by an application, rather than on pre-purchased units of capacity. It can be a form of utility computing.

Serverless computing - Wikipedia

Serverless computing can simplify the process of deploying code into production. Scaling, capacity planning and maintenance operations may be hidden from the developer or operator. Serverless code can be used in conjunction with code deployed in traditional styles, such as microservices. Alternatively, applications can be written to be purely serverless and use no provisioned servers at all. Kubeless This should not be confused with computing or networking models that do not require an actual server to function, such as peer-to-peer (P2P).

Serverless computing - Wikipedia

⇧ 「サーバーレス」と言えば、そうだね、クラウドアーキテクチャの1つだね。サーバーを動的に管理しますと。

必要な時だけサーバを稼働させることができますと、お財布に優しい、つまりコスト削減ができますと。 

 

Fn Project とは?

「サーバレス」をオンプレミス環境でも使いたい、そんなことを思ったことありませんか?そんな方に朗報! 

fnproject.io

The Fn project is an open-source container-native serverless platform that you can run anywhere -- any cloud or on-premise. It’s easy to use, supports every programming language, and is extensible and performant.

https://fnproject.io/

⇧  なんと、Fn Project ならオンプレミス環境でも「サーバレス」を実現できるらしいんです!しかも、OSSOpen Source Software)ってことで無料!

 

サーバレスのアーキテクチャって?

かの有名なマーティン・ファウラー氏が始めたと言われる情報発信のサイトによりますと、

martinfowler.com

⇧ サーバーレスのザックリしたイメージ図がありますが、

  1. We may want to keep some UX-related functionality in the server, if, for example, it’s compute intensive or requires access to significant amounts of data. In our pet store, an example is “search.” Instead of having an always-running server, as existed in the original architecture, we can instead implement a FaaS function that responds to HTTP requests via an API gateway (described later). Both the client and the server “search” function read from the same database for product data.

https://martinfowler.com/articles/serverless.html

API gateway を介してHTTP要求に応答する FaaS function を実装することで、必要な時だけ稼働させることが実現できるそうな。

FaaSってのは、 

mediatemple.net

⇧ 「FaaS(Function as a Service)」ってことらしく、機能の集まりを搭載したサーバーの部分ってことですかね。

 

ちなみに、マーティン・ファウラー氏は、

マーティン・ファウラー (Martin Fowler1963年 - ) は、アメリカ合衆国で活動しているソフトウェア技術者である。 ソフトウェアアーキテクチャについての、いくつかの本の著者、および講演者として、広く知られている。 とりわけオブジェクト指向分析とオブジェクト指向設計統一モデリング言語 (UML) 、アナリシスパターンをはじめとしたソフトウェアパターンエクストリーム・プログラミング (XP) を含むアジャイルソフトウェア開発方法論の、各分野において、活発に活動している。

マーティン・ファウラー - Wikipedia

⇧ ソフトウェアアーキテクチャで有名のようで、

⇧ 上記とかは評判が良いみたいですね。

第2版では、本文に掲載されてるコードがJavaScriptになってるようです。 

 

旧版は、掲載されてるコードがJavaになってるようです。 

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)
 

  

実際にサーバーレスの環境を準備してみる

Fn Project の「サーバレス」を実現するためには、

fnproject.io

Fn is a lightweight Docker-based serverless functions platform you can run on your laptop, server, or cloud. In this installation tutorial we’ll walk through installing Fn.

https://fnproject.io/tutorials/install/

⇧ ってな感じで、「Fn」をインストールする必要があるらしいのですが、

Before we can install Fn you’ll need:

  1. A computer running Linux or MacOS. If you have a Windows machine the easiest thing to do is install VirtualBox and run a free Linux virtual machine.
  2. Docker 17.10 (or higher) needs to be installed and running.

https://fnproject.io/tutorials/install/

⇧ 要件があって、

  1. OS(Operation System)がLinuxMacOSのマシン
  2. Docker 17.10 以上

が必要ですと。

OS(Operation System)がWindows の場合は、VirtualBoxをインストールして、OS(Operation System)がLinuxMacOS仮想マシンを構築すれば良いらしい。

Linux環境ってことは、WSL(Windows Subsystem for Linux)、WSL2(Windows Subsystem for Linux 2)とかでもいけるのかね?

Windows Subsystem for Linux (WSL) とは、Linuxの(ELFフォーマット形式の)バイナリ実行ファイルWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。

https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux

2019年6月、従来のWSL1とは機構のことなるWSL2を発表した。 従来のWSL1との違いは以下のとおりである。

https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux

本物のLinuxカーネルを使用することで互換性が向上し、仮想マシンを使用することでディスクI/O性能の足かせとなっていたWindowsのI/OスタックをバイパスしたことでディスクI/O性能が向上した。デメリットとして起動に数秒を要することやメモリー・フットプリントの悪化があげられる。

https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux

⇧ ってな感じで、説明を見る限りだと、WSL2(Windows Subsystem for Linux 2)ならイケそうな気がしないでもないように思えますが、どうなんでしょうね?

 

まぁ、今回は、VirtualBox仮想マシンを建てる方向で。

で、仮想マシンにDockerもインストールされてる必要があるということで、Dockerイメージを使って仮想マシンを建てようかと。

ちなみに、私が使っているノートパソコンのOS(Operation System)は、Windows 10 Home です。

ですので、 

をインストールしております。(VirtualBox や Docker ToolBox などのインストールの方法はネットで検索いただければ、ヒットすると思うので割愛)

 

利用するDockerイメージは以下にしようかと。

hub.docker.com

Linuxディストリビューションは、Alpine Linux となってますね。

Dockerのバージョンは、19.03.13 を使うことにします。

qiita.com

パッケージやアプリケーションのインストールにはapkを使用します。

超軽量なAlpine Linuxについて調べた - Qiita

⇧ 上記サイト様がまとめてくださってます。

パッケージ管理ツールが、「apk」になるので注意ですかね。

と思ったんですが、どうも、Docker ToolBox で作成する仮想マシンには、Dockerがインストールされるみたいなので、上記のDockerイメージは、「Docker in Docker」と説明にあるように、Dockerの入れ子を実現するもののようなので、一旦、Dockerイメージについては保留で。

 

というわけで、Docker ToolBox 、VirtualBox がインストールされてたという前提で進めていきます。

ただ、如何せん、自分の環境のDocker ToolBoxのバージョンが旧い...

f:id:ts0818:20200927155706p:plain

バージョンアップについては、

qiita.com

これを利用している時に、Dockerのバージョンを上げようと思いアップデートしようと思いましたがアップデートするための方法が見つからなかったため方法をメモします。

結論だけ書くと検索しても方法がなかなかでてきませんが、再インストールするだけで可能なようです。

Windows10のDockerToolBoxをアップデートする - Qiita

⇧ というように、再インストールでOKらしい。

ただ、既に、Dockerイメージなど使ってる場合、

既存の登録されているイメージ等は全て削除されますので必要に応じて、docker save 等のコマンドでバックアップを取っておきます。
(※ 怖い場合は復元ポイントとか用意しておくとよいかも)

Windows10のDockerToolBoxをアップデートする - Qiita

⇧ データが消えるので、バックアップしといたほうが良いみたい。

まぁ、自分は、データが残ってなかったので、バックアップなどは特に行わず、再インストールすることにします。

で、自分は、Chocolateyを使ってインストールしようと思いますが、

tech.guitarrapc.com

⇧ 上記サイト様によりますと、アンインストールが安定してないので、実際の現場では、Chocolateyの使用は見合わせたほうが良さ気です。

 

今回は、Chocolateyで再インストールします。(自分はChocolateyでDocker ToolBoxをインストールしているので、ChocolateyでDocker ToolBoxをアップグレードします。)

コマンドプロンプトを管理者権限で起動し、

f:id:ts0818:20200927162945p:plain

f:id:ts0818:20200927175410p:plain

バージョンアップできました。

f:id:ts0818:20200927175450p:plain

ちなみに、自分のVirtualBox のバージョンは、6.1.4 らしいです。
f:id:ts0818:20200927175745p:plain
 

では、DockerイメージをDocker Hubから取得します。

はい、エラー。

f:id:ts0818:20200927180224p:plain

 

どうやら、

docs.docker.jp

Docker コンテナを実行するには、次のようにします。

  • 新しい Docker 仮想マシンを作成(あるいは、既存のものを開始)
  • 環境を新しい仮想マシンに切り替え
  • docker クライアントを使ってコンテナの作成・読み込み・管理

 

Windows — Docker-docs-ja 1.13.RC ドキュメント

⇧ Docker ToolBoxをインストールしただけだと、defualtの仮想マシンが作成されないらしい。つまり、Dockerを利用するための仮想マシンの作成が必要らしい。

とりあえず、Docker込みの仮想マシンを作成する。

docker-machine create --driver virtualbox [仮想マシン名] 

ちなみに、自分は、前に作った仮想マシンが存在してたようで、「Docker machine "default" already exists」って怒られました。

f:id:ts0818:20200927181550p:plain

起動しようしたら、「machine does not exist」って...どっちやねん!

f:id:ts0818:20200927181951p:plain

とりあえず、削除はできたっぽい。

f:id:ts0818:20200927191046p:plain

f:id:ts0818:20200927191022p:plain

再作成してみる。

f:id:ts0818:20200927191624p:plain

f:id:ts0818:20200927191729p:plain

仮想マシンできたみたい。

「default」が起動してます。

f:id:ts0818:20200927191846p:plain

VirtualBoxVirtualBox マネージャーでも、Docker ToolBoxで作成された仮想マシン「default」が確認できます。

f:id:ts0818:20200927200838p:plain

 

どうやら、Docker ToolBoxのバージョンの互換性の問題なのかは不明ですが、前のバージョンで作成してた仮想マシンのデータで「create」や「start」はできないらしいですと。「rm」はできるみたいなんで、一旦、削除して新たに作成するしかなさそうですかね?

 

とりあえず、仮想マシンが起動できたようなので、環境変数を取得。で指示通りのコマンドを実施して仮想マシンに設定する感じですかね。

docker-machine env [仮想マシン名]

f:id:ts0818:20200927194049p:plain

 そうすると、Docker ToolBoxで作成した仮想マシン(ここでは、default と言う名前の仮想マシン)のDocker deamon が起動されるらしく、「docker version」で確認できる模様。

f:id:ts0818:20200927194806p:plain

ということで、「Fn」をインストールするための準備が整いましたので、仮想マシンにログインします。

docker-machine ssh [仮想マシン名]

f:id:ts0818:20200927200519p:plain

「Fn」をインストール。

curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

f:id:ts0818:20200927201159p:plain

「Fn」をインストールしただけだと、「Fn」のサーバー側がインストールされてないらしいので、以下のコマンドで「Fn」のサーバーの初回インストールと起動が行われるらしい。

fn start

f:id:ts0818:20200927201753p:plain

f:id:ts0818:20200927202014p:plain

⇧ 起動してます。

で、新たにコマンドプロンプトを起ち上げて、仮想マシンにログイン後「Fn」のバージョン確認すると、「Fn」のサーバー側のバージョンも表示されました。

f:id:ts0818:20200927202358p:plain

「Ctrl」 + 「C」 で「Fn」サーバーを停止すると、「Fn」のサーバー側のバージョンは確認できなくなるみたいです。

f:id:ts0818:20200927202842p:plain

仮想マシンを停止で。

docker-machine stop [仮想マシン名]

f:id:ts0818:20200927221140p:plain

 

とりあえず、環境の準備ができたので、次回は実際に、Javaで「サーバーレス」を試してみたいと思います。
いまは、FaaS(Function as a Service)の枠ができた感じだと思うので、実際に「Function」、つまり「機能」を作っていく感じになるかと。

 

2020年9月28日(月)追記 ↓ ここから

Visual Studio CodeのExtentionsのRemote-SSHでの接続ができなくなり、

net-newbie.com

⇧ 上記のサイト様を参考にさせていただいたところ、

仮想マシンを再作成した場合などは、SSHキーが変更されるらしいので、Windowsの場合は、「C:\Users\[ユーザー名]\.ssh\known_hosts」に登録されてる情報を削除しておいた方が良さ気です。

f:id:ts0818:20200928161943p:plain

例えば、自分の場合だと、IPアドレスが192.168.99.100の仮想マシンを再作成したので、「known_hosts」ファイルで、IPアドレスが192.168.99.100の行を削除します。

f:id:ts0818:20200928162349j:plain

 

それから、Visual Studio Codeのリモート接続を試したところ、無事、仮想マシンに接続できました。

f:id:ts0818:20200928162923p:plain

2020年9月28日(月)追記 ↑ ここまで 

 

今回はこのへんで。