次の方法で共有


Pythonを使用したAzure Files向けの開発

Azure Filesを使用してデータを格納するPython アプリケーションを開発する方法について説明します。 Azure Filesは、クラウド内のマネージド ファイル共有サービスです。 業界標準のサーバー メッセージ ブロック (SMB) プロトコルとネットワーク ファイル システム (NFS) プロトコルを介してアクセスできるフル マネージドのファイル共有を提供します。 Azure Filesには、ファイル共有へのプログラムによるアクセスのための REST API も用意されています。

この記事では、PythonでAzure Filesを使用して開発するためのさまざまな方法と、アプリのニーズに最も適したアプローチを選択する方法について説明します。 また、Azure Files リソースと対話する基本的なコンソール アプリを作成する方法についても説明します。

Azure Filesを使用Pythonアプリ開発について

Azure Filesには、Python開発者がデータにアクセスし、Azure Filesでリソースを管理するためのいくつかの方法が用意されています。 次の表に、アプローチの一覧を示し、その動作を要約し、各アプローチを使用するタイミングに関するガイダンスを示します。

方法 動作方法 いつ使用するか
標準ファイル I/O ライブラリ SMB または NFS を使用してマウントされた Azure ファイル共有を介して、OS レベルの API 呼び出しを使用します。 SMB/NFS を使用してファイル共有をマウントする場合は、プログラミング言語またはフレームワークにファイル I/O ライブラリ (os、Pythonの io など) を使用できます。 標準ファイル I/O を使用する既存のコードを含む基幹業務アプリがあり、アプリがAzureファイル共有で動作するようにコードを書き換える必要はありません。
FileREST API HTTPS エンドポイントを直接呼び出して、Azure Filesに格納されているデータと対話します。 ファイル共有リソースをプログラムで制御できます。 Azure SDKには、FileREST API 上に構築された File Shares クライアント ライブラリ (azure-storage-file-share) が用意されており、使い慣れたPythonプログラミング言語パラダイムを通じて FileREST API 操作を操作できます。 お客様向けに付加価値の高いクラウド サービスとアプリを構築しており、Python ファイル I/O ライブラリでは使用できない高度な機能を使用する必要があります。
ストレージ リソース プロバイダー REST API Azure Resource Manager (ARM) を使用して、ストレージ アカウントとファイル共有を管理します。 さまざまなリソース管理操作のために REST API エンドポイントを呼び出します。 アプリまたはサービスは、ストレージ アカウントやファイル共有の作成、削除、更新などのリソース管理タスクを実行する必要があります。

これらのアプローチの一般的な情報については、「 Azure Filesを参照してください。

この記事では、次の方法を使用してAzure Files リソースを操作することに重点を置いています。

  • Python ファイル I/O ライブラリを使用したAzure Filesの処理: SMB または NFS を使用してファイル共有をマウントし、Python ファイル I/O ライブラリを使用して共有内のファイルとディレクトリを操作します。
  • Azure FilesをPython用のファイル共有クライアントライブラリを使って操作する: Python用のAzure Storageファイル共有クライアントライブラリを使って、ファイル共有内のファイルとディレクトリを管理します。 このクライアント ライブラリは、FileREST API 上に構築されています。
  • Azure Storage管理ライブラリを使用してAzure Filesリソースを管理します: Azure Storage管理ライブラリを使用して、ストレージ アカウント内のファイル共有やその他のリソースを管理します。 管理ライブラリは、Azure Storage リソース プロバイダー REST API 上に構築されます。

[前提条件]

プロジェクトの設定

このセクションでは、Azure Filesを操作するプロジェクトを準備する手順について説明します。

プロジェクト ディレクトリから、 pip install コマンドを使用して、アプリのニーズに基づいてパッケージをインストールします。 次の例では、Azure ファイル共有クライアント ライブラリ、ストレージ管理クライアント ライブラリ、および Azure ID ライブラリをインストールする方法を示します。 Azure サービスへのパスワードレス接続には、azure-identity パッケージが必要です。

pip install azure-identity
pip install azure-storage-file-share
pip install azure-mgmt-resource
pip install azure-mgmt-storage

コード ファイルを開き、必要な import ステートメントを追加します。

Python os および io ライブラリを使用する場合は、.py ファイルに次のコードを追加します。

import os
import io

Azure Storage ファイル共有クライアント ライブラリを使用する場合は、.py ファイルに次を追加します。

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareClient, ShareDirectoryClient, ShareFileClient

Azure Storage管理ライブラリを使用する場合は、.py ファイルに次のコードを追加します。

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.storage import StorageManagementClient

Python ファイル I/O ライブラリを使用してAzure Filesを操作する

標準ファイル I/O ライブラリは、Azure Files リソースにアクセスして操作する最も一般的な方法です。 SMB または NFS を使用してファイル共有をマウントすると、オペレーティング システムによってローカル ファイル システムの API 要求がリダイレクトされます。 この方法では、 osioなどの標準のファイル I/O ライブラリを使用して、共有内のファイルやディレクトリを操作できます。

アプリPython必要な場合は、ファイル I/O ライブラリを使用することを検討してください。

  • App compatibility: Python ファイル I/O ライブラリを既に使用している既存のコードを使用する基幹業務アプリに最適です。 アプリがAzureファイル共有を操作するためにコードを書き換える必要はありません。
  • Ease of use: Python ファイル I/O ライブラリは、開発者によってよく知られており、使いやすいライブラリです。 Azure Filesの重要な価値提案は、SMB と NFS を介してネイティブ ファイル システム API を公開することです。

このセクションでは、Python ファイル I/O ライブラリを使用して、Azure Files リソースを操作する方法について説明します。

詳細と例については、次のリソースを参照してください。

  • ファイル I/O 用のPython ライブラリ: os および io

ファイル共有をマウントする

ファイル I/O ライブラリPython使用するには、まずファイル共有をマウントする必要があります。 SMB または NFS を使用してファイル共有をマウントする方法のガイダンスについては、次のリソースを参照してください。

この記事では、次のパスを使用して、Windowsにマウントされた SMB ファイル共有を参照します。

file_share_path = "Z:\\file-share"

例: ファイル共有に接続し、Pythonファイル I/O ライブラリを使用してディレクトリを列挙する

次のコード例は、ファイル共有に接続し、共有内のディレクトリを一覧表示する方法を示しています。

import os

def enumerate_directories(path):
    try:
        # Get all directories in the specified path
        dirs = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
        
        # Print each directory name
        for dir_name in dirs:
            print(f"{dir_name}")
            
        print(f"{len(dirs)} directories found.")
    except (PermissionError, FileNotFoundError, OSError) as ex:
        print(f"Error: {ex}")

#Example usage
file_share_path = "Z:\\file-share"
enumerate_directories(file_share_path)

例: Python ファイル I/O ライブラリを使用してファイル共有内のファイルに書き込む

次のコード例は、ファイルにテキストを書き込んで追加する方法を示しています。

import os

def write_to_file(file_share_path, file_name):
    # First line of text with platform-appropriate line ending
    text_to_write = "First line" + os.linesep
    
    # Combine the file share path and filename
    file_path = os.path.join(file_share_path, file_name)
    
    # Write initial text to file (overwrites if file exists)
    with open(file_path, 'w') as file:
        file.write(text_to_write)
    
    # Text to append
    text_to_append = ["Second line", "Third line"]
    
    # Append lines to the file
    with open(file_path, 'a') as file:
        file.write(os.linesep.join(text_to_append) + os.linesep)

# Example usage
file_share_path = "Z:\\file-share"
write_to_file(file_share_path, "test.txt")

例: Python ファイル I/O ライブラリを使用してファイル ACL を列挙する

次のコード例は、ファイルの基本的なアクセス制御リスト (ACL) を列挙する方法を示しています。

import os
import stat

def enumerate_file_acls(file_path):
    try:
        # Get file stats
        file_stat = os.stat(file_path)
        
        # Get permissions in octal format
        permissions_octal = oct(stat.S_IMODE(file_stat.st_mode))
        
        print(f"File: {file_path}")
        print(f"Permissions (octal): {permissions_octal}")
        
        # Interpret permissions in a human-readable format
        permissions = ""
        permissions += "r" if file_stat.st_mode & stat.S_IRUSR else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWUSR else "-"
        permissions += "x" if file_stat.st_mode & stat.S_IXUSR else "-"
        permissions += "r" if file_stat.st_mode & stat.S_IRGRP else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWGRP else "-" 
        permissions += "x" if file_stat.st_mode & stat.S_IXGRP else "-"
        permissions += "r" if file_stat.st_mode & stat.S_IROTH else "-"
        permissions += "w" if file_stat.st_mode & stat.S_IWOTH else "-"
        permissions += "x" if file_stat.st_mode & stat.S_IXOTH else "-"
        
        print(f"Permissions (symbolic): {permissions}")
        
        print(f"Owner ID: {file_stat.st_uid}")
        print(f"Group ID: {file_stat.st_gid}")
        print("Note: For detailed Windows ACLs, you may need a specialized library.")
        
    except FileNotFoundError:
        print(f"Error: File '{file_path}' not found.")
    except PermissionError:
        print(f"Error: Permission denied for '{file_path}'.")
    except Exception as e:
        print(f"Error: {e}")

# Example usage
file_share_path = "Z:\\file-share"
file_name = "test.txt"
file_path = os.path.join(file_share_path, file_name)

enumerate_file_acls(file_path)

Python用のファイル共有クライアント ライブラリを使用してAzure Files データを操作する

FileREST API は、Azure Filesへのプログラムによるアクセスを提供します。 これにより、HTTPS エンドポイントを呼び出して、ファイル共有、ディレクトリ、ファイルに対する操作を実行できます。 FileREST API は、ネイティブ プロトコルでは使用できない可能性がある高いスケーラビリティと高度な機能のために設計されています。 Azure SDKは、FileREST API 上に構築された、Python用のファイル共有クライアント ライブラリなどのクライアント ライブラリを提供します。

アプリケーションで次のものが必要な場合は、FileREST API とファイル共有クライアント ライブラリの使用を検討してください。

  • 高度な機能: ネイティブ プロトコルでは使用できない操作と機能にアクセスします。
  • Custom クラウド統合: Azure Filesと直接やり取りする、バックアップ、ウイルス対策、データ管理などのカスタム付加価値サービスを構築します。
  • パフォーマンスの最適化: データ プレーン操作を使用する大規模なシナリオでは、パフォーマンスの利点を活用できます。

FileREST API はリソースの階層としてAzure Filesモデル化されており、directory または file レベルで実行される操作に推奨されます。 ファイル サービスまたはファイル共有レベルで実行される操作には、ストレージ リソース プロバイダー REST API を使用することをお勧めします。

このセクションでは、ファイル共有クライアント ライブラリを使用して、Azure Files リソースを操作する方法について説明します。

詳細と例については、次のリソースを参照してください。

アクセスを承認し、クライアントを作成する

アプリをAzure Filesに接続するには、ShareClient オブジェクトを作成します。 このオブジェクトは、Azure Files リソースを操作するための開始点です。 次のコード例は、さまざまな承認メカニズムを使用して ShareClient オブジェクトを作成する方法を示しています。

Microsoft Entra IDで承認するには、セキュリティ プリンシパルを使用する必要があります。 必要なセキュリティ プリンシパルの種類は、アプリの実行場所によって異なります。 この表をガイドとして使用します。

アプリの実行場所 セキュリティ プリンシパル ガイダンス
ローカル コンピューター (開発とテスト) サービス プリンシパル アプリを登録する方法、Microsoft Entra グループを設定する方法、ロールを割り当てる方法、環境変数を構成する方法については、「開発者サービス プリンシパルを使用してアクセスを認証する」を参照してください>
ローカル コンピューター (開発とテスト) ユーザー ID Microsoft Entra グループを設定し、ロールを割り当て、Azureにサインインする方法については、「開発者資格情報を使用してアクセスを認証する
Azureでホストされる マネージド ID マネージド ID を有効にしてロールを割り当てる方法については、「マネージド ID を使用してAzureホストされているアプリからのアクセスを認証する
Azureの外部でホストされている (オンプレミス アプリなど) サービス プリンシパル アプリの登録、ロールの割り当て、環境変数の構成方法については、「アプリケーション サービス プリンシパルを使用してオンプレミス アプリからのアクセスを承認する」を参照してください。

この記事のコード例を使用するには、Azure RBAC 組み込みロール Storage File Data Privileged Contributor をセキュリティ プリンシパルに割り当てます。 このロールは、設定されているファイル/ディレクトリ レベルの NTFS アクセス許可に関係なく、構成されているすべてのストレージ アカウントの共有内のすべてのデータに対する完全な読み取り、書き込み、ACL の変更、および削除アクセスを提供します。 詳細については、「ACCESS Azure ファイル共有を REST 経由でAzure Files OAuth でMicrosoft Entra IDを使用するを参照してください。

DefaultAzureCredential を使用してアクセスを承認する

アクセスを承認してAzure Filesに接続する簡単で安全な方法は、DefaultAzureCredential インスタンスを作成して OAuth トークンを取得することです。 その後、その資格情報を使用して、 ShareClient オブジェクトを作成できます。

次の例では、ShareClient を使用して承認されたDefaultAzureCredential オブジェクトを作成し、共有内のディレクトリを操作するShareDirectoryClient オブジェクトを作成します。

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareClient

account_name = "<account-name>"
share_name = "<share-name>"

# Create the share client using DefaultAzureCredential
share_client = ShareClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=share_name,
    credential=DefaultAzureCredential(),
    # When using a token credential, you MUST specify a token_intent
    token_intent='backup'
)

# Get a reference to a directory in the share
directory_client = share_client.get_directory_client("sample-directory")

ユーザーの認証に使用する資格情報の種類が正確にわかっている場合は、Python の Azure Identity クライアント ライブラリの他のクラスを使用して OAuth トークンを取得できます。 これらのクラスは 、TokenCredential クラスから派生します。

これらの各承認メカニズムの詳細については、「 ファイル データへのアクセスを承認する方法を選択する」を参照してください。

例: ファイル共有クライアント ライブラリを使用してファイルをコピーする

次の方法を使用して、ファイル共有内またはファイル共有間でファイルをコピーできます。

BlobClient オブジェクトから次のメソッドを使用して、ファイルをコピー先 BLOB にコピーできます。

次のコード例は、ファイルを別のファイル共有内のファイルにコピーする方法を示しています。

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareFileClient

# Define storage account parameters
account_name = "<account-name>"
src_share_name = "src-file-share"
dest_share_name = "dest-file-share"
src_file_path = "src/path/to/file"
dest_file_path = "dest/path/to/file"

# Create token credential
token_credential = DefaultAzureCredential()

# Create source file client
src_file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=src_share_name,
    file_path=src_file_path,
    credential=token_credential,
    token_intent='backup'
)

# Create destination file client
dest_file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=dest_share_name,
    file_path=dest_file_path,
    credential=token_credential,
    token_intent='backup'
)

# Copy the file from the source share to the destination share
copy_operation = dest_file_client.start_copy_from_url(src_file_client.url)

例: ファイル共有クライアント ライブラリを使用してファイルをリースする

リースは、リース ID を介してAzureによって管理されるファイルに対するロックを作成します。 リースは、分散システム内の複数のクライアント間でファイルへのアクセスを調整するメカニズムを提供します。 ファイルのリースは、排他的な書き込みと削除のアクセスを提供します。 リースの状態とアクションの詳細については、「 リース ファイル」を参照してください。

次のコード例は、リース クライアントを作成し、ファイルで無限期間のリースを取得し、リースを解放する方法を示しています。

from azure.identity import DefaultAzureCredential
from azure.storage.fileshare import ShareFileClient, ShareLeaseClient

# Define storage account parameters
account_name = "<account-name>"
share_name = "sample-file-share"
file_path = "path/to/file"

# Create a DefaultAzureCredential for authentication
token_credential = DefaultAzureCredential()

# Create a ShareFileClient
file_client = ShareFileClient(
    account_url=f"https://{account_name}.file.core.windows.net",
    share_name=share_name,
    file_path=file_path,
    credential=token_credential,
    token_intent='backup'
)

# Get a lease client for the file
lease_client = ShareLeaseClient(file_client)

# Acquire an infinite duration lease on the file
lease_info = lease_client.acquire()

# Do something with the file while it's leased
# ...

# Release the lease
lease_client.release()

SMB と FileREST API の両方を使用する場合、FileREST API はファイル ロックの管理に リース を使用し、SMB はオペレーティング システムによって管理されるファイル システム ロックを使用することに注意してください。 SMB と FileREST API の間のファイル ロック操作の管理の詳細については、「 ファイル ロックの管理」を参照してください。

例: ファイル共有クライアント ライブラリを使用して共有スナップショットを作成および一覧表示する

共有スナップショットは、ある時点でのファイル共有の読み取り専用コピーです。 ファイル共有のスナップショットを作成し、スナップショットを使用して、スナップショットの作成時に共有内のデータにアクセスできます。 ファイル共有内のすべてのスナップショットを一覧表示したり、共有スナップショットを削除したりすることもできます。

次のコード例は、共有スナップショットの作成、ファイル共有内のスナップショットの一覧表示、共有スナップショット内のルート ディレクトリの走査を行う方法を示しています。

from azure.storage.fileshare import ShareServiceClient, ShareDirectoryClient

def list_root_directory_snapshot(root_dir: ShareDirectoryClient):
    for item in root_dir.list_directories_and_files():
        if item["is_directory"]:
            print(f"Directory in snapshot: {item['name']}")
        else:
            print(f"File in snapshot: {item['name']}")

# Connection string with account key (required for share snapshots)
connection_string = "<connection-string>"

# Create service and share clients
share_service_client = ShareServiceClient.from_connection_string(connection_string)
share_name = "sample-file-share"
share_client = share_service_client.get_share_client(share_name)

# Create a snapshot
snapshot_info = share_client.create_snapshot()
print(f"Snapshot created: {snapshot_info['snapshot']}")

# List snapshots in a share
for share_item in share_service_client.list_shares(include_snapshots=True):
    if share_item["snapshot"]:
        print(f"Share: {share_item['name']} (Snapshot: {share_item['snapshot']})")

# List directories and files in a share snapshot
snapshot_timestamp = snapshot_info["snapshot"]
share_snapshot = share_service_client.get_share_client(share_name, snapshot=snapshot_timestamp)
root_dir = share_snapshot.get_directory_client("")

list_root_directory_snapshot(root_dir)

DefaultAzureCredentialの使用時に取得した OAuth トークンは、ファイル共有レベルでのデータ プレーン操作には許可されません。 共有スナップショットを操作するには、アカウント キーを使用してクライアント オブジェクトを承認する必要があります。 このコード例で作成した ShareClient オブジェクトは、アカウント キーを含む接続文字列を使用します。

アカウント キーまたは接続文字列を格納すると、セキュリティ上のリスクが伴います。 Microsoft Entra認証が使用できない場合にのみ使用してください。 ストレージへのアクセスを安全に承認する方法の詳細については、「 Azure Storage のデータへのアクセスを認証する」を参照してください。

Azure Storage管理ライブラリを使用してAzure Filesリソースを管理する

Azure Storage管理ライブラリは、Azure Storage リソース プロバイダー REST API 上に構築されています。 Azure Storage リソース プロバイダーは、Azure Resource Manager に基づくサービスであり、宣言型 (テンプレート) メソッドと命令型 (直接 API 呼び出し) メソッドの両方をサポートします。 Azure Storage リソース プロバイダー REST API は、ファイル共有を含むAzure Storage リソースへのプログラムによるアクセスを提供します。 Azure SDKは、Azure Storage リソース プロバイダー REST API 上に構築された管理ライブラリを提供します。

管理ライブラリは、 ファイル サービス または ファイル共有 レベルで実行される操作に推奨されます。 このセクションでは、Azure Storage管理ライブラリを使用してAzure Filesリソースを管理する方法について説明します。

例: Azure Storage管理ライブラリを使用してファイル共有を作成する

次のコード例は、最上位ArmClient オブジェクトを作成し、ストレージ リソース プロバイダーをサブスクリプションに登録し、Azure Storage管理ライブラリを使用してファイル共有を作成する方法を示しています。

from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient, SubscriptionClient
from azure.mgmt.storage import StorageManagementClient
from azure.mgmt.storage.models import FileShare

# Create the credential for authentication
credential = DefaultAzureCredential()

# Define variables
subscription_id = "<subscription-id>"
resource_group_name = "<resource-group-name>"
storage_account_name = "<storage-account-name>"
share_name = "sample-file-share"

# Create clients
resource_client = ResourceManagementClient(credential, subscription_id)
subscription_client = SubscriptionClient(credential)
storage_client = StorageManagementClient(credential, subscription_id)

# Register Microsoft.Storage resource provider, if not already registered
provider = resource_client.providers.get('Microsoft.Storage')
if provider.registration_state == "NotRegistered":
    resource_client.providers.register('Microsoft.Storage')

# Create a file share
file_share = storage_client.file_shares.create(
    resource_group_name=resource_group_name,
    account_name=storage_account_name,
    share_name=share_name,
    file_share=FileShare(
        share_quota=1  # Share size in GiB
        # Add other file share properties here
    )
)

FileShare クラスを使用して、ファイル共有のプロパティを構成できます。 前の例では、 share_quota プロパティを設定する方法を示します。 詳細については、 StorageManagementClient クラス リファレンスを参照してください。

登録操作を実行するには、次のAzure RBAC アクションのアクセス許可が必要です: Microsoft。ストレージ/登録/アクション。 このアクセス許可は、寄稿者ロールと所有者標準ロールに含まれています。

例: Azure Storage管理ライブラリを使用してファイル共有とスナップショットを一覧表示する

次のコード例は、ストレージ アカウント内のファイル共有とスナップショットを一覧表示する方法を示しています。

from azure.identity import DefaultAzureCredential
from azure.mgmt.storage import StorageManagementClient

# Create the credential for authentication
credential = DefaultAzureCredential()

# Define variables
subscription_id = "<subscription-id>"
resource_group_name = "<resource-group-name>"
storage_account_name = "<storage-account-name>"
expand = "snapshots"  # Include snapshots in the response

# Create storage management client
storage_client = StorageManagementClient(credential, subscription_id)

# List all file shares with their snapshots
file_shares = storage_client.file_shares.list(
    resource_group_name=resource_group_name,
    account_name=storage_account_name,
    expand=expand
)

# Iterate over the file shares and print them along with any snapshots
for share in file_shares:
    print(f"Resource name: {share.name}")
    if share.snapshot_time:
        print(f"Snapshot: {share.snapshot_time}")

Azure Filesを使用した開発の詳細については、次のリソースを参照してください。