Contoh: Mengakses Azure Storage menggunakan pustaka Azure untuk Python

Dalam artikel ini, Anda mempelajari cara menggunakan pustaka klien Azure dalam kode aplikasi Python untuk mengunggah file ke kontainer penyimpanan Azure Blob. Artikel ini mengasumsikan Anda telah membuat sumber daya yang ditampilkan di Contoh: Membuat Azure Storage.

Semua perintah dalam artikel ini bekerja secara sama di bash Linux/macOS dan shell perintah Windows kecuali ada catatan.

1: Siapkan lingkungan pengembangan lokal Anda

Jika Anda belum melakukannya, siapkan lingkungan tempat Anda dapat menjalankan kode ini. Berikut ini adalah beberapa opsi:

2: Pasang paket pustaka

Dalam file requirements.txt Anda, tambahkan baris untuk paket pustaka klien yang akan Anda gunakan dan simpan file.

azure-storage-blob
azure-identity

Kemudian, di terminal atau prompt perintah Anda, instal persyaratannya.

pip install -r requirements.txt

3: Buat file yang akan diunggah

Buat file sumber bernama sample-source.txt. Nama file ini adalah apa yang diharapkan kode.

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

4: Gunakan penyimpanan blob dari kode aplikasi

Dua bagian berikut menunjukkan dua cara untuk mengakses kontainer blob yang dibuat melalui Contoh: Membuat Azure Storage.

Metode pertama (dengan autentikasi) mengautentikasi aplikasi dengan DefaultAzureCredential seperti yang dijelaskan dalam Mengautentikasi aplikasi Python ke layanan Azure selama pengembangan lokal menggunakan perwakilan layanan. Dengan metode ini, Anda harus terlebih dahulu menetapkan izin yang sesuai ke identitas aplikasi, yang merupakan praktik yang direkomendasikan.

Metode kedua (dengan string koneksi) menggunakan string koneksi untuk mengakses akun penyimpanan secara langsung. Meskipun metode ini tampaknya lebih sederhana, metode ini memiliki dua kekurangan yang signifikan:

  • String koneksi secara inheren mengautentikasi agen penghubung dengan akun Storage daripada dengan sumber daya individu dalam akun tersebut. Akibatnya, string koneksi memberikan otorisasi yang lebih luas daripada yang mungkin diperlukan.

  • string koneksi berisi info akses dalam teks biasa dan oleh karena itu menyajikan potensi kerentanan jika tidak dibangun atau diamankan dengan benar. Jika string koneksi seperti itu terekspos, string koneksi dapat digunakan untuk mengakses berbagai sumber daya dalam akun Penyimpanan.

Untuk alasan ini, sebaiknya gunakan metode autentikasi dalam kode produksi.

4a: Gunakan penyimpanan blob dengan autentikasi

  1. Buat file bernama use_blob_auth.py dengan kode berikut. Komentar menjelaskan langkah-langkahnya.

    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}")
    

    Link referensi:

  2. Buat variabel lingkungan bernama AZURE_STORAGE_BLOB_URL:

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

    Ganti "pythonazurestorage12345" dengan nama akun penyimpanan Anda.

    Variabel AZURE_STORAGE_BLOB_URL lingkungan hanya digunakan oleh contoh ini. Ini tidak digunakan oleh pustaka Azure.

  3. Gunakan perintah az ad sp create-for-rbac untuk membuat perwakilan layanan baru untuk aplikasi. Perintah membuat pendaftaran aplikasi untuk aplikasi secara bersamaan. Beri nama perwakilan layanan yang Anda pilih.

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

    Output perintah ini akan terlihat seperti berikut ini. Catat nilai-nilai ini atau biarkan jendela ini terbuka karena Anda akan memerlukan nilai-nilai ini di langkah berikutnya dan tidak akan dapat melihat nilai kata sandi (rahasia klien) lagi. Namun, Anda dapat menambahkan kata sandi baru nanti tanpa membatalkan perwakilan layanan atau kata sandi yang ada jika diperlukan.

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

    Perintah Azure CLI dapat dijalankan di Azure Cloud Shell atau pada stasiun kerja dengan Azure CLI terpasang.

  4. Buat variabel lingkungan untuk perwakilan layanan aplikasi:

    Buat variabel lingkungan berikut dengan nilai dari output perintah sebelumnya. Variabel ini memberi tahu DefaultAzureCredential untuk menggunakan perwakilan layanan aplikasi.

    • AZURE_CLIENT_ID → Nilai ID aplikasi.
    • AZURE_TENANT_ID → Nilai ID penyewa.
    • AZURE_CLIENT_SECRET → Kata sandi/mandat yang dihasilkan untuk aplikasi.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Coba jalankan kode (yang gagal dengan sengaja):

    python use_blob_auth.py
    
  6. Amati kesalahan "Permintaan ini tidak berwenang untuk melakukan operasi ini menggunakan izin ini." Kesalahan diharapkan karena perwakilan layanan lokal yang Anda gunakan belum memiliki izin untuk mengakses kontainer blob.

  7. Berikan izin kontributor pada kontainer blob ke perwakilan layanan menggunakan perintah az role assignment create Azure CLI:

    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"
    

    Argumen --assignee mengidentifikasi perwakilan layanan. Ganti <tempat penampung AZURE_CLIENT_ID> dengan ID aplikasi perwakilan layanan Anda.

    Argumen --scope mengidentifikasi lokasi penetapan peran ini berlaku. Dalam contoh ini, Anda memberikan peran "Kontributor Data Blob Penyimpanan" kepada perwakilan layanan untuk kontainer bernama "blob-container-01".

    • Ganti PythonAzureExample-Storage-rg dan pythonazurestorage12345 dengan grup sumber daya yang berisi akun penyimpanan Anda dan nama yang tepat dari akun penyimpanan Anda. Selain itu, sesuaikan nama kontainer blob, jika perlu. Jika menggunakan nama yang salah, Anda melihat kesalahan, "Tidak dapat melakukan operasi yang diminta pada sumber daya bersarang. Sumber daya induk 'pythonazurestorage12345' tidak ditemukan."

    • Ganti tempat <penampung AZURE_SUBSCRIPTION_ID> dengan ID langganan Azure Anda. (Anda dapat menjalankan perintah az account show dan mendapatkan ID langganan Anda dari id properti di output.)

    Tip

    Jika perintah penetapan peran mengembalikan kesalahan "Tidak ada adaptor koneksi yang ditemukan" saat menggunakan shell bash, coba atur export MSYS_NO_PATHCONV=1 untuk menghindari terjemahan jalur. Untuk informasi selengkapnya, lihat masalah ini.

  8. Tunggu satu atau dua menit agar izin menyebar, lalu jalankan kode lagi untuk memverifikasi bahwa kode tersebut sekarang berfungsi. Jika Anda melihat kesalahan izin lagi, tunggu sedikit lebih lama, lalu coba kode lagi.

Untuk informasi selengkapnya tentang penetapan peran, lihat Cara menetapkan izin peran menggunakan Azure CLI.

4b: Gunakan penyimpanan blob dengan string koneksi

  1. Buat file Python bernama use_blob_conn_string.py dengan kode berikut. Komentar menjelaskan langkah-langkahnya.

    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. Buat variabel lingkungan bernama AZURE_STORAGE_CONNECTION_STRING, nilai yang merupakan string koneksi penuh untuk akun penyimpanan. (Variabel lingkungan ini juga digunakan oleh berbagai komentar Azure CLI.) Anda bisa mendapatkan string koneksi untuk akun penyimpanan Anda dengan menjalankan perintah az storage account show-connection-string.

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

    Ganti PythonAzureExample-Storage-rg dan pythonazurestorage12345 dengan grup sumber daya yang berisi akun penyimpanan Anda dan nama yang tepat dari akun penyimpanan Anda.

    Saat Anda mengatur variabel lingkungan, gunakan seluruh nilai connectionString properti dalam output termasuk tanda kutip.

  3. Jalankan kode:

    python use_blob_conn_string.py
    

Sekali lagi, meskipun metode ini sederhana, string koneksi mengotorisasi semua operasi dalam akun penyimpanan. Dengan kode produksi, lebih baik menggunakan izin tertentu seperti yang dijelaskan di bagian sebelumnya.

5. Verifikasi pembuatan blob

Setelah menjalankan kode salah satu metode, buka portal Azure, navigasikan ke kontainer blob untuk memverifikasi bahwa blob baru ada bernama sample-blob-{random}.txt dengan konten yang sama dengan file sample-source.txt:

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

Jika Anda membuat variabel lingkungan bernama AZURE_STORAGE_CONNECTION_STRING, Anda juga dapat menggunakan Azure CLI untuk memverifikasi bahwa blob ada menggunakan perintah az storage blob list :

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

Jika Anda mengikuti instruksi untuk menggunakan penyimpanan blob dengan autentikasi, Anda dapat menambahkan --connection-string parameter ke perintah sebelumnya dengan string koneksi untuk akun penyimpanan Anda. Untuk mempelajari cara mendapatkan string koneksi, lihat instruksi dalam 4b: Menggunakan penyimpanan blob dengan string koneksi. Gunakan seluruh string koneksi termasuk tanda kutip.

6: Membersihkan sumber daya

Jalankan perintah az group delete jika Anda tidak perlu menyimpan grup sumber daya dan sumber daya penyimpanan yang digunakan dalam contoh ini. Grup sumber daya tidak dikenakan biaya berkelanjutan dalam langganan Anda, tetapi sumber daya, seperti akun penyimpanan, dalam grup sumber daya mungkin dikenakan biaya. Ini adalah praktik yang baik untuk membersihkan grup apa pun yang tidak Anda gunakan secara aktif. Argumen --no-wait memungkinkan perintah untuk segera kembali alih-alih menunggu operasi selesai.

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

Anda juga dapat menggunakan metode ResourceManagementClient.resource_groups.begin_delete untuk menghapus grup sumber daya dari kode. Kode dalam Contoh: Membuat grup sumber daya menunjukkan penggunaan.

Jika Anda mengikuti instruksi untuk menggunakan penyimpanan blob dengan autentikasi, ada baiknya menghapus perwakilan layanan aplikasi yang Anda buat. Anda dapat menggunakan perintah az ad app delete . <Ganti tempat penampung AZURE_CLIENT_ID> dengan ID aplikasi perwakilan layanan Anda.

az ad app delete --id <AZURE_CLIENT_ID>

Lihat juga