概要
エッジサーバ(例えば,Raspberrypiなど)からクラウドサーバーへ,curlを使ってファイルをアップロードする方法を示します。
構成
エッジサーバー(クライアント)において,センサから取得したデータを記録する。それらデータを,一定時間毎にクラウドサーバーへ送信(アップロード)する。
- クライアント:エッジサーバー
- サーバー:クラウドサーバー
実装
エッジサーバー側
エッジサーバー上に,ファイルをアップロードするスクリプト(up.sh)を用意する。
・エッジサーバー側・・・curlコマンドを用いて,POSTメソッドによりファイルをアップロードする。
#!/bin/sh curl -X POST -F upfile=@<file_name> <server_url>
<例>エッジサーバー上のファイル(upload_file.csv)を,クラウドサーバー(webserver.loca)へアップロードする。
・アップロードするファイルの名前:upload_file.csv,
・クラウドサーバー上でアップロードされたファイルを受けるスクリプト:upload.php
#!/bin/sh # up.sh FILE=./upload_file.csv SERVER=https://<server name>/upload.php curl -X POST -F upfile=@$FILE $SERVER
ここで,upfile=@$FILEの,”@”マークは必ず必要です。
クラウドサーバー側
クラウドサーバーでは,エッジサーバーからアップロードされてきたファイルを受信するスクリプトを用意します。
ファイルを受信するスクリプト:upload.php
受信するファイル:upfile (curlで指定したupfileと同じ名前)
受信したファイルを保存するディレクトリ:「saved」ディレクトリを作成しておく。
・クラウドサーバー上で,エッジサーバーからアップロードされたファイルを保存するスクリプト(upload.php)。
「is_uploaded_file」 ファイルの受信を確認。
「move_uploaded_file」受信したファイルを保存先ディレクトリ(saved)へ移動。
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>File receiver</title></head> <body><p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "saved/" . $_FILES["upfile"]["name"])) { echo $_FILES["upfile"]["name"] . "is uploaded."; } else { echo "Error: File is not uploaded."; } } else { echo "Error: File is not uploaded."; } ?></p> </body></html>
実行
エッジサーバー側で,一定時間毎にアップロードスクリプト(up.sh)を実行する。ここでは,crontabに実行時間を指定する。
<例>エッジサーバー上で,「15分ごとに」ファイルのアップロードを実行する。
<crontab -e,次の一行を追加> */15 * * * * /usr/local/bin/up.sh
※ ”$ crontab -l”で,コマンドの登録ができたか確認できる。
まとめ
エッジサーバーからクラウドサーバーへ,curlを使ってファイルをアップロードする方法を示しました。エッジサーバーからクラウドサーバーへデータをアップロードするには,様々な方法があります。例えば,SSH,FTP,TFTP,MQTTなど。それらは,通信方式(プロトコル)の実装やサーバーを起動させる必要があるため手間がかかります。HTTPポートを使うと,クラウドサーバー上では標準的に開放されているポートのため,経路のファイヤウォールやフィルタ設定などを気にせず通信できます。実際使用する際には,(アップロードする)ファイルの確認を厳密に行ったり,ファイルを送信側でエンコードして送り,受信側でデコードするなどして暗号化する必要があります。
コメント