次の方法で共有


Python を使用して Azure Files 用に開発する

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

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

対象

管理モデル 課金モデル メディア階層 冗長性 SMB NFS
Microsoft.Storage プロビジョニング済み v2 HDD (標準) ローカル (LRS) はい いいえ
Microsoft.Storage プロビジョニング済み v2 HDD (標準) ゾーン (ZRS) はい いいえ
Microsoft.Storage プロビジョニング済み v2 HDD (標準) ジオ (GRS) はい いいえ
Microsoft.Storage プロビジョニング済み v2 HDD (標準) ジオゾーン (GZRS) はい いいえ
Microsoft.Storage プロビジョニング済み v1 SSD (プレミアム) ローカル (LRS) はい いいえ
Microsoft.Storage プロビジョニング済み v1 SSD (プレミアム) ゾーン (ZRS) はい いいえ
Microsoft.Storage 従量課金制 HDD (標準) ローカル (LRS) はい いいえ
Microsoft.Storage 従量課金制 HDD (標準) ゾーン (ZRS) はい いいえ
Microsoft.Storage 従量課金制 HDD (標準) ジオ (GRS) はい いいえ
Microsoft.Storage 従量課金制 HDD (標準) ジオゾーン (GZRS) はい いいえ

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

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

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

これらの方法の一般的な情報については、「 Azure Files を使用したアプリケーション開発の概要」を参照してください。

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

[前提条件]

プロジェクトの設定

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

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

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

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

Python osio ライブラリを使用する場合は、.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 を操作する

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

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

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

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

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

  • ファイル I/O 用の Python ライブラリ: osio

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

Python ファイル I/O ライブラリを使用するには、まずファイル共有をマウントする必要があります。 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 とファイル共有クライアント ライブラリの使用を検討してください。

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

FileREST API は、Azure Files をリソースの階層としてモデル化し、 ディレクトリ または ファイル レベルで実行される操作に推奨されます。 ファイル サービスまたはファイル共有レベルで実行される操作には、ストレージ リソース プロバイダー 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 の変更、および削除アクセスを提供します。 詳細については、「 Rest 経由の Azure Files OAuth で Microsoft Entra ID を使用して Azure ファイル共有にアクセスする」を参照してください。

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 Key Vault にアカウント キーを安全に格納する方法の詳細については、「 Azure Key Vault マネージド ストレージ アカウント キーについて」を参照してください。

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.Storage/register/action) のアクセス許可が必要です。 このアクセス許可は、寄稿者ロールと所有者標準ロールに含まれています。

例: 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 を使用した開発の詳細については、次のリソースを参照してください。