Örnek: Python için Azure kitaplıklarını kullanarak Azure Depolama erişme

Bu makalede Python uygulama kodundaki Azure istemci kitaplıklarını kullanarak azure blob depolama kapsayıcısına dosya yüklemeyi öğreneceksiniz. Makalede, Örnek: Azure Depolama oluşturma bölümünde gösterilen kaynakları oluşturduğunuz varsayılır.

Bu makaledeki tüm komutlar, not edilmediği sürece Linux/macOS bash ve Windows komut kabuklarında aynı şekilde çalışır.

1: Yerel geliştirme ortamınızı ayarlama

Henüz yapmadıysanız, bu kodu çalıştırabileceğiniz bir ortam ayarlayın. Aşağıda bazı seçenekleri görebilirsiniz:

  • Python sanal ortamını yapılandırma. Sanal ortamı yerel olarak veya Azure Cloud Shell'de oluşturabilir ve kodu orada çalıştırabilirsiniz. Kullanmaya başlamak için sanal ortamı etkinleştirdiğinizden emin olun.

  • Conda ortamı kullanın.

  • Visual Studio Code veya GitHub Codespaces'ta Geliştirme Kapsayıcısı kullanın.

2: Kitaplık paketlerini yükleme

requirements.txt dosyanızda, kullanacağınız istemci kitaplığı paketi için satırlar ekleyin ve dosyayı kaydedin.

azure-storage-blob
azure-identity

Ardından, terminal veya komut isteminizde gereksinimleri yükleyin.

pip install -r requirements.txt

3: Karşıya yüklenecek bir dosya oluşturma

sample-source.txt adlı bir kaynak dosyası oluşturun. Bu dosya adı, kodun beklediği addır.

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4: Uygulama kodundan blob depolamayı kullanma

Aşağıdaki iki bölümde Örnek aracılığıyla oluşturulan blob kapsayıcısına erişmenin iki yolu gösterilmektedir: Azure Depolama oluşturma.

İlk yöntem (kimlik doğrulaması ile), hizmet sorumlularını kullanarak yerel geliştirme sırasında Azure hizmetlerine Python uygulamalarının kimliğini doğrulama bölümünde açıklandığı gibi uygulamanın DefaultAzureCredential kimliğini doğrular. Bu yöntemle, önce önerilen uygulama olan uygulama kimliğine uygun izinleri atamanız gerekir.

İkinci yöntem (bağlantı dizesi ile) depolama hesabına doğrudan erişmek için bir bağlantı dizesi kullanır. Bu yöntem daha basit görünse de iki önemli dezavantajı vardır:

  • bir bağlantı dizesi, bu hesaptaki tek tek kaynaklar yerine Depolama hesabıyla bağlantı aracısının kimliğini doğal olarak doğrular. Sonuç olarak, bir bağlantı dizesi gerekenden daha geniş bir yetkilendirme verir.

  • bağlantı dizesi düz metin olarak erişim bilgileri içerir ve bu nedenle düzgün bir şekilde yapılandırılmamış veya güvenli hale getirilmemişse olası güvenlik açıklarını gösterir. Böyle bir bağlantı dizesi kullanıma sunulursa, Depolama hesabındaki çok çeşitli kaynaklara erişmek için kullanılabilir.

Bu nedenlerden dolayı, üretim kodunda kimlik doğrulama yöntemini kullanmanızı öneririz.

4a: Kimlik doğrulaması ile blob depolama kullanma

  1. Aşağıdaki kodla use_blob_auth.py adlı bir dosya oluşturun. Açıklamalar adımları açıklar.

    import os
    import uuid
    
    from azure.identity import DefaultAzureCredential
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    credential = DefaultAzureCredential()
    
    # Retrieve the storage blob service URL, which is of the form
    # https://<your-storage-account-name>.blob.core.windows.net/
    storage_url = os.environ["AZURE_STORAGE_BLOB_URL"]
    
    # Create the client object using the storage URL and the credential
    blob_client = BlobClient(
        storage_url,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
        credential=credential,
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    

    Başvuru bağlantıları:

  2. adlı AZURE_STORAGE_BLOB_URLbir ortam değişkeni oluşturun:

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    "pythonazurestorage12345" yerine depolama hesabınızın adını yazın.

    Ortam AZURE_STORAGE_BLOB_URL değişkeni yalnızca bu örnek tarafından kullanılır. Azure kitaplıkları tarafından kullanılmaz.

  3. Uygulama için yeni bir hizmet sorumlusu oluşturmak için az ad sp create-for-rbac komutunu kullanın. komutu, uygulama için uygulama kaydını aynı anda oluşturur. Hizmet sorumlusuna seçtiğiniz adı verin.

    az ad sp create-for-rbac --name {service-principal-name}
    

    Bu komutun çıkışı aşağıdaki gibi görünür. Bu değerleri not alın veya sonraki adımda bu değerlere ihtiyacınız olacağı ve parola (istemci gizli dizisi) değerini yeniden görüntüleyemeyeceğiniz için bu pencereyi açık tutun. Ancak, gerekirse hizmet sorumlusunu veya mevcut parolaları geçersiz hale getirmeden daha sonra yeni bir parola ekleyebilirsiniz.

    {
      "appId": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

    Azure CLI komutları Azure Cloud Shell'de veya Azure CLI yüklü bir iş istasyonunda çalıştırılabilir.

  4. Uygulama hizmet sorumlusu için ortam değişkenleri oluşturun:

    Önceki komutun çıkışındaki değerlerle aşağıdaki ortam değişkenlerini oluşturun. Bu değişkenler uygulama hizmet sorumlusunu kullanmayı söyler DefaultAzureCredential .

    • AZURE_CLIENT_ID Uygulama kimliği değerini →.
    • AZURE_TENANT_ID kiracı kimliği değerini →.
    • AZURE_CLIENT_SECRET → Uygulama için oluşturulan parola/kimlik bilgisi.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Kodu çalıştırma girişimi (kasıtlı olarak başarısız olur):

    python use_blob_auth.py
    
  6. "Bu isteğin bu izni kullanarak bu işlemi gerçekleştirme yetkisi yok" hatasını gözlemleyin. Kullandığınız yerel hizmet sorumlusu henüz blob kapsayıcısına erişim iznine sahip olmadığından hata beklenir.

  7. az role assignment create Azure CLI komutunu kullanarak blob kapsayıcısı üzerinde hizmet sorumlusuna katkıda bulunan izinleri verin:

    az role assignment create --assignee <AZURE_CLIENT_ID> \
        --role "Storage Blob Data Contributor" \
        --scope "/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01"
    

    --assignee bağımsız değişkeni hizmet sorumlusunu tanımlar. AZURE_CLIENT_ID> yer tutucusunu hizmet sorumlunuzun uygulama kimliğiyle değiştirin<.

    Bağımsız değişken, --scope bu rol atamasının nereye uygulanacağı tanımlar. Bu örnekte, "blob-container-01" adlı kapsayıcının hizmet sorumlusuna "Depolama Blob Veri Katkıda Bulunanı" rolünü verirsiniz.

    • ve pythonazurestorage12345 değerini depolama hesabınızı ve depolama hesabınızın tam adını içeren kaynak grubuyla değiştirinPythonAzureExample-Storage-rg. Ayrıca gerekirse blob kapsayıcısının adını ayarlayın. Yanlış ad kullanıyorsanız, "İstenen işlem iç içe kaynakta gerçekleştirilemiyor. 'pythonazurestorage12345' üst kaynağı bulunamadı."

    • <AZURE_SUBSCRIPTION_ID> yer tutucusunu Azure abonelik kimliğiniz ile değiştirin. (az account show komutunu çalıştırabilir ve çıkıştaki id özelliğinden abonelik kimliğinizi alabilirsiniz.)

    İpucu

    Rol atama komutu bash kabuğu kullanılırken "Bağlantı bağdaştırıcısı bulunamadı" hatası döndürüyorsa, yol çevirisini önlemek için ayarı export MSYS_NO_PATHCONV=1 deneyin. Daha fazla bilgi için bu soruna bakın.

  8. İzinlerin yayılması için bir veya iki dakika bekleyin, ardından şimdi çalıştığını doğrulamak için kodu yeniden çalıştırın. İzinler hatasını yeniden görürseniz, biraz daha bekleyin ve kodu yeniden deneyin.

Rol atamaları hakkında daha fazla bilgi için bkz . Azure CLI kullanarak rol izinleri atama.

4b: blob depolamayı bağlantı dizesi ile kullanma

  1. Aşağıdaki kodla use_blob_conn_string.py adlı bir Python dosyası oluşturun. Açıklamalar adımları açıklar.

    import os
    import uuid
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    # Retrieve the connection string from an environment variable. Note that a
    # connection string grants all permissions to the caller, making it less
    # secure than obtaining a BlobClient object using credentials.
    conn_string = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    
    # Create the client object for the resource identified by the connection
    # string, indicating also the blob container and the name of the specific
    # blob we want.
    blob_client = BlobClient.from_connection_string(
        conn_string,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    
  2. değeri depolama hesabının tam bağlantı dizesi olan adlı AZURE_STORAGE_CONNECTION_STRINGbir ortam değişkeni oluşturun. (Bu ortam değişkeni çeşitli Azure CLI açıklamaları tarafından da kullanılır.) az storage account show-connection-string komutunu çalıştırarak depolama hesabınız için bağlantı dizesi alabilirsiniz.

    az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
    

    ve pythonazurestorage12345 değerini depolama hesabınızı ve depolama hesabınızın tam adını içeren kaynak grubuyla değiştirinPythonAzureExample-Storage-rg.

    Ortam değişkenini ayarladığınızda, tırnak işaretleri de dahil olmak üzere çıktıdaki özelliğin tüm değerini connectionString kullanın.

  3. Kodu çalıştırın:

    python use_blob_conn_string.py
    

Bu yöntem basit olsa da, bir bağlantı dizesi bir depolama hesabındaki tüm işlemleri yetkiler. Üretim koduyla, önceki bölümde açıklandığı gibi belirli izinleri kullanmak daha iyidir.

5. Blob oluşturmayı doğrulama

İki yöntemin kodunu çalıştırdıktan sonra Azure portalına gidin, blob kapsayıcısına gidin ve sample-source.txt dosyasıyla aynı içerikle.txt sample-blob-{random}adlı yeni bir blob bulunduğunu doğrulayın:

Azure portal page for the blob container, showing the uploaded file

adlı AZURE_STORAGE_CONNECTION_STRINGbir ortam değişkeni oluşturduysanız az storage blob list komutunu kullanarak blob'un mevcut olduğunu doğrulamak için Azure CLI'yı da kullanabilirsiniz:

az storage blob list --container-name blob-container-01

Blob depolamayı kimlik doğrulamasıyla kullanma yönergelerini izlediyseniz, parametresini --connection-string depolama hesabınızın bağlantı dizesi önceki komuta ekleyebilirsiniz. bağlantı dizesi nasıl edineceğinizi öğrenmek için 4b: blob depolamayı bağlantı dizesi ile kullanma yönergelerine bakın. Tırnak işaretleri dahil olmak üzere tüm bağlantı dizesi kullanın.

6: Kaynakları temizleme

Bu örnekte kullanılan kaynak grubunu ve depolama kaynaklarını tutmanız gerekmiyorsa az group delete komutunu çalıştırın. Kaynak grupları aboneliğinizde devam eden ücret ödemez, ancak kaynak grubundaki depolama hesapları gibi kaynaklar ücrete tabi olabilir. Etkin olarak kullanmadığınız tüm grupları temizlemek iyi bir uygulamadır. --no-wait bağımsız değişkeni, işlemin bitmesini beklemek yerine komutun hemen döndürülmesini sağlar.

az group delete -n PythonAzureExample-Storage-rg  --no-wait

Bir kaynak grubunu koddan silmek için yöntemini de kullanabilirsiniz ResourceManagementClient.resource_groups.begin_delete . Örnek: Kaynak grubu oluşturma içindeki kod kullanımı gösterir.

Blob depolamayı kimlik doğrulamasıyla kullanma yönergelerini izlediyseniz, oluşturduğunuz uygulama hizmet sorumlusunu silmek iyi bir fikirdir. az ad app delete komutunu kullanabilirsiniz. <AZURE_CLIENT_ID> yer tutucusunu hizmet sorumlunuzun uygulama kimliğiyle değiştirin.

az ad app delete --id <AZURE_CLIENT_ID>

Ayrıca bkz.