SDKを使って、Python3で簡単なファイル共有ツールを実装してみたいと思います。Storageはざっくり言うとオブジェクトストレージ。ここで使っているブロックBLOBは、容量の観点で見れば普通のオンラインストレージ(ファイル)よりも安上がりです。まあS3みたいなやつ。したファイルを保管しておきたいとか、参照の性能を要求しないバックアップに使うとか、他のアプリケーションのバックエンドに使いたい場合に便利です。Driveなどのいわゆるオンラインストレージと比較してAPIもシンプルで使いやすい反面、Office/Windows連携や検索機能などオフィス用途の機能や画像管理、ユーザ招待型のファイル共有機能などの付加価値的な機能はありません。Azureにはファイルストレージのサービスもあるので、SMBで接続したい場合などにはそちらを使えばいいのですが、とにかくシンプルに容量があればいい、という場合にはブロックBLOBのほうが使いやすいです。ここでは、ストレージとして使うために基本的と思われるアップロードとダウンロードを試します。謹製のGUIクライアントも提供されていますが、スクリプトから叩けると便利ですよね。いうことでMSから提供されているPython向けSDKで実装します。3系のみで検証しています。長くなってしまったので分けますが、もうちょっと賢い実装は別記事で。一覧表示アップロードダウンロード削除テストはじめにAzureのストレージサービスを使うには、ストレージアカウントなるものが必要です。ストレージアカウント毎にキー(Base64的な文字列)が発行され、今回使うブロックBLOBや、その他ファイル、ページなどのリソースにアクセスする際の認証に必要となります。Portalから作成できます。設定項目はありますが、デフォルトで大丈夫です。アカウントにもいくつか種類がありますが、デフォルトの汎用v2にしておけば特に困ることはないと思います。キーは「アクセスキー」の画面で管理できます。後ほど使うのでどこかに保存しておいて下さい。Storageスキーマを感覚的に図にするとこんな感じ。各アカウントに複数のコンテナを作ることができ、コンテナの中にBLOBを格納します。https://<strage_account>.blob.core.windows.net/<container_name>/<blob_name>1https://<strage_account>.blob.core.windows.net/<container_name>/<blob_name>コンテナの中はフラットになっており、サブディレクトリなどのツリー構造はありません。SERVICE」-「コンテナー」の画面から作成できます。API経由でも作ることができますが、今回は特定のコンテナを使うので何か作っておきます。上に書いたURIもエンドポイントとして表示されていますね。BLOBを公開すれば普通のhttpでもアクセスできるようになりますが、ここではオンラインストレージとして使いたいので非公開のプライベート(デフォルト)にしておきます。非公開の場合は、BLOBへのアクセスがアカウント毎にキーで制御されますので、最低限アカウント名とキーがあればデータの読み書きが可能です。SDKMSからSDKが提供されているので、Python向けのものを使います。C#など他の言語もサポートされており、概念的には同じで、使い方もよく似ています。API(http/https)を持っていますが、SDKはそれをラップするもののようです。SDKはいつも通りpipで簡単にインストールできます。azure-storage-blobいくつか依存モジュールがあるので、環境によってはちょっと時間がかかるかもしれません。ファイル同期ツール今回作成するのは、ローカルのファイルシステム上の特定のディレクトリにあるファイルと、Azure上のコンテナを同期するツールです。ストレージアカウント名とキーさえ知っていればどこからでも使えるものができるはずです。Portalからコンテナの情報を見たり、BLOBをダウンロード・アップロードすることができるのでツールが多少バグっても大丈夫。注意が必要な点として、上記のようにBLOBはフラットな構造になっている(コンテナを入れ子にできない)ので、配置はちょっと工夫する必要があります。今回は最も単純に、ローカルのディレクトリ直下にあるファイルのみを対象にすることにします。サブディレクトリ対応は次の記事で。APIなので普通にhttp/httpsを使える環境ならば大丈夫ですが、ここでは認証つきプロキシ環境も想定することにします。今回のスクリプトです。_blob_clientクラスを定義しています。原則的に例外はクラスの中で捕捉せず、問題があれば止まるようにします。(azure.storage.blobモジュールBlockBlobServiceクラス)はこんな感じ。以下により詳細な使い方を記載しておきます。Serviceへの接続コンストラクタに必要な設定を辞書(dict)でまとめて渡します。辞書にする必要はないのですが、まあ基本的なパラメータが明確になると思いますので。Azure上のコンテナ("container")と同期対象のローカルディレクトリ("home_path")のパスを指定します。"C:\\path\\to\\dir"}基本となるのはBLOBストレージを扱うためのBlockBlobServiceクラスです。必要な項目を指定してBlockBlobServiceクラスのインスタンスを作成します。上にも書きましたが、アカウント名とキーを正しく指定すれば接続可能です。内部的に使用するプロトコルはprotocolで指定しますが、デフォルトでhttpsになっています。account_key=conf["account_key"])このBlockBlobServiceオブジェクトの各メソッドを呼び出してコンテナやBLOBを操作します。認証つきプロキシを通す場合には、BLOBの操作を行う前にset_proxy()メソッドを使っておきます。conf["proxy_port"],user=conf["proxy_user"],password=conf["proxy_pass"])上記のクラスはストレージ内の任意のコンテナにアクセスできるので必須ではありませんが、今回は専用にコンテナを用意するので、コンストラクタで保存しておきます。アクセスできるかチェックします。list_containers()メソッドがコンテナオブジェクトのリストを返してくるので、指定された名前のコンテナがあるかどうか確認します。conf["container"]一覧表示_blob_client.fetch_remote()メソッドでBLOB一覧の取得を実装しています。list_blobs()メソッドはコンテナ名を指定すると、BLOB情報に相当するオブジェクトを指すリスト(正確にはジェネレータ)を返してきますので、BLOB名(blob.name)のみを取り出しています。self.client.list_blobs(self.__container)]アップロード_blob_client.upload()メソッドでBLOBのアップロードを実装しています。create_blob_from_path()メソッドにコンテナ名とBLOB名、ローカルファイルへのパスを指定してアップロードします。file_path=local_path)123self.client.create_blob_from_path(container_name=self.__container,blob_name=item,file_path=local_path)今回は対称のディレクトリ直下のすべてのファイルをアップロードします。ディレクトリがあった場合は単純に無視される実装です。BLOB名はファイルと同じにしています。アップロードされていないファイルのみをアップロードする実装はまた次回。ダウンロード_blob_client.download()メソッドでBLOBのダウンロードを実装しています。get_blob_to_path()メソッドにコンテナ名とBLOB名、ローカルファイルへのパスを指定して同期的にダウンロードします。ローカルファイルが既に存在する場合は上書きされます。file_path=file_path)123self.client.get_blob_to_path(container_name=self.__container,blob_name=blob,file_path=file_path)今回は対象のコンテナにある全てのBLOBがダウンロードされる実装です。ローカルにないファイルのみをダウンロードする実装はまた次回。削除_blob_client.clear()メソッドでBLOBの削除を実装しています。delete_blob()メソッドにコンテナ名とBLOB名を指定することで同期的に削除します。今回は対象のコンテナにある全てのコンテナを削除する実装です。blob_name=blob)12self.client.delete_blob(container_name=self.__container,blob_name=blob)テストさて、今回作成したスクリプトをテストしてみたいと思います。_blob_clientクラスをインスタンス化して、各メソッドを呼ぶと、ちゃんとAzureのブロックBLOBストレージを操作できていることがわかりますね。ドキュメント.txt次回に続きます。(セットアップ~VM電源操作)仮想マシン環境と言えば色々ありますが、個人的にはVirtualBoxがPC環境でも使いやすいと思っています。安定性や品質、機能面では他の仮想...記事を読むdatetimeモジュールによる時刻の扱いどのプログラミング言語/スクリプトでも、時刻と文字列の変換は頻出の処理ですね。~二代目の帰朝~別記事の続きです。データの登録と検索について記載します。...記事を読むPythonとElasticsearchの夕べElasticsearchの魅力の一つは豊富な機能。その分、使いこなすのが大変なので、少しでも実例ベースで勉強したいところです。...記事を読むpycryptoでAES暗号化を試す認証機能はWebサービスを作るときに重要ですが、パスワードの保管って厄介ですよね。Cookieやらスクリプトに平文を直書きするのは抵抗があり...記事を読むCrowi/Growi編集用のツールを作成するCrowiを使っていると文書のバックアップが取りたくなることがあります。GitlabなどのGithubクローンではWiki機能をgitで...記事を読むPythonとNimでXZ圧縮を利用するファイル圧縮の形式は世にいろいろありますが、昨今はzipがもっとも一般的でしょうか。zipは圧縮・展開にかかる時間もほどほど、圧縮率もほ...記事を読むInfluxDBとGrafanaで作るサーバ監視環境Grafanaはデータの視覚化ツールとして人気ですね。今回はInfluxDBをデータソースとして性能監視環境を構築した際のメモです。...記事を読むLinuxからWindows共有フォルダをマウントするLinuxからWindows共有フォルダ、というかSMBサーバにアクセスできると便利ですよね。最近はUbuntuなどのよく使われているデ...記事を読むElasticsearchをセットアップするElasticsearchは全文検索エンジン。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。