† IPFSを実行しながら学んでいく6 ~ 自分だけのプライベートIPFSネットワークを作って ~
IPFSをインストールし実行すると、デフォルトではパブリックな分散ネットワークに接続されます
接続しているピアを以下のように確認することができます。
$ ipfs swarm peers /ip4/104.131.131.82/udp/4001/quic/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ /ip4/128.199.253.187/udp/4001/quic/p2p/12D3KooWB9d8RTihyv1uK6E9N7ymZoLg9gmneWgSpHh1bVEjykqu /ip4/144.168.197.150/udp/4001/quic/p2p/12D3KooWB7qad7jrhpuegYgmcyES68wsm1rZQfSPoeMihL9YCkRK ~~~
今回はパブリックではなく、プライベートなピアを構築したいと思います。 自分だけ、もしくは仲間内や会社内だけの利用といったユースケースを想定しています。
やってみる
go-ipfsを使い、ローカルPCにあるipfsと、AWSのEC2上のipfsの2つのノードを持つネットワークにしてみます。
※ ローカルPCはipfsをすでにインストール済みとして進めます
<img src="https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2022/07/Untitled-Diagram.drawio-1.png" alt="" width="431" height="311" class="alignnone size-full wp-image-909513" />
ブートストラップノードは、他のノードが他のピアを見つけるために接続できるIPFSノードで、AWS上に作成します。 クライアントノードであるローカルPCからだけアクセスできることを目指します。
Amazon LinuxにGoをインストール
go-ipfsの実行するのでGo言語をインストールする必要があります
ダウンロードページからLinux用のバイナリをダウンロードします。
ダウンロード後、ファイルを解凍します。
$ tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz $ ll /usr/local/go/bin/ go gofmt
/usr/local/go/bin/の下に実行ファイルができるので、ここをパスに追加します。
$ export PATH=$PATH:/usr/local/go/bin $ go version go version go1.18.4 linux/amd64
Amazon LinuxにIPFSをインストール
t2.microのインスタンスを起動しておきます(IPFSには512MiBのメモリが必要)
ここから最新のLinuxバイナリをからダウンロードします
※ 執筆時(2022/07/13)では、v0.14.0-rc1
$ wget https://dist.ipfs.io/kubo/v0.14.0-rc1/kubo_v0.14.0-rc1_linux-amd64.tar.gz
ファイルを解凍し、
$ tar -xvzf kubo_v0.14.0-rc1_linux-amd64.tar.gz
フォルダに移動後、インストールスクリプトを実行します
$ cd kubo $ sudo bash install.sh Moved ./ipfs to /usr/local/bin
以下のコマンドを実行してインストールの確認をします
$ ipfs --version ipfs version 0.14.0-rc1
初期化
ノードを初期化します
$ ipfs init --profile server
プライベートにしてみる
IPFSではswarmという機能があります。これは、
インターネット上の他のipfsピアとの接続をオープンし、リッスンし、維持するコンポーネントです。
ipfs swarm
コマンドを使って操作することができます。
プライベートなネットワークにするには、swarm.keyというものを作成し、これをネットワーク内で共有できる状態にすることが必要とのこと。
go-ipfs-swarm-key-genというプログラムで作れるので、ありがたく使わせてもらいます。
$ go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen@latest $ ipfs-swarm-key-gen > ~/.ipfs/swarm.key
作成されたswarm.keyを、クライアントノードにコピーします。
クライアントノードでの保存場所は、ipfs実行ユーザーの.ipfs
フォルダ内です
次は、両方のノードからブートストラップの情報を削除します。のちにプライベートネットワーク用に構成するためです。
$ ipfs bootstrap rm --all removed /dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN ~~~ ~~~
削除後、ブートストラップノードを含む各ノードにブートストラップノードのIPアドレスとピアID(ハッシュアドレス)を追加します。
ブートストラップノードのピアIDは以下のコマンで表示できます。
$ ipfs config show | grep PeerID "PeerID": "<<id>>"
ピアIDを控えたら、以下のコマンドを全てのノードで実行します。
$ ipfs bootstrap add /ip4/<ブートストラップノードのIPアドレス>/tcp/4001/ipfs/<ブートストラップノードのピアID>
プライベートネットワークの起動
設定が終わったので、ネットワークを起動してIPFSのテストをしてみます。
デーモンを起動します。
$ ipfs daemon Initializing daemon... go-ipfs version: 0.13.0 Repo version: 12 System version: amd64/darwin Golang version: go1.18.3 Swarm is limited to private network of peers with the swarm key Swarm key fingerprint: 3b9a01d450f4a47bff077eddb86d436a Swarm listening on /ip4/127.0.0.1/tcp/4001 Swarm listening on /ip4/192.168.1.104/tcp/4001 Swarm listening on /ip6/240f:6c:3036:1:52d4::1005/tcp/4001 Swarm listening on /ip6/::1/tcp/4001 Swarm listening on /p2p-circuit Swarm announcing /ip4/127.0.0.1/tcp/4001 Swarm announcing /ip4/192.168.1.104/tcp/4001 Swarm announcing /ip6/::1/tcp/4001 API server listening on /ip4/127.0.0.1/tcp/5001 WebUI: http://127.0.0.1:5001/webui Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 Daemon is ready
上記の出力の中に、
Swarm is limited to private network of peers with the swarm key
というのがありますが、プライベートで構成しているとこのログが出力されるようです。
ipfs swarm peers
でピア情報を表示させると、
$ ipfs swarm peers /ip4/13.231.120.86/tcp/4001/p2p/12D3KooWLFzHcmx4SkvDNcnnLfW2q2gN4djRSTF9kLA37cwEjznk
このように追加したノードの情報だけが出力されるはずです。
IPFSにファイルを追加
一つのノードで適当なファイルを作成し、IPFSに追加してみます
$ echo "Hello World!" > hoge.txt $ ipfs add hoge.txt added QmTUBaeR86fxQFewstqDERdENdWRWz7EcF59VXZaHD9uiu hoge.txt
その後、もう片方のノードでファイルを参照できるか確認します。
$ ipfs cat QmTUBaeR86fxQFewstqDERdENdWRWz7EcF59VXZaHD9uiu Hello World!
上記のように、catで追加したテキストファイルの内容が出力されると成功です
webuiを確認したところ、ピアの数も1となっており、今回の環境と一致していました。
IPFSのプライベートネットワークの作成と検証はこれで終了です。