web-backend/getBlobsByContainer/__init__.py (50 lines of code) (raw):
import os
import json
import datetime
import azure.functions as func
from azure.storage.blob import BlobServiceClient, generate_blob_sas, BlobSasPermissions
import logging
# Get environment variables
from configuration import Configuration
config = Configuration()
STORAGE_ACCOUNT_NAME = config.get_value("STORAGE_ACCOUNT_NAME")
USE_SAS_TOKEN = config.get_value("USE_SAS_TOKEN", "true") == "true"
HOURS = int(config.get_value("SAS_TOKEN_EXPIRY_HOURS", "1"))
# Create BlobServiceClient using Managed Identity
blob_service_client = BlobServiceClient(
f"https://{STORAGE_ACCOUNT_NAME}.blob.core.windows.net", credential=config.credential
)
def generate_sas_token(container_name, blob_name):
delegation_key = blob_service_client.get_user_delegation_key(
key_start_time=datetime.datetime.utcnow(),
key_expiry_time=datetime.datetime.utcnow() + datetime.timedelta(hours=HOURS)
)
"""Generate a SAS token with read & write access for a blob."""
sas_token = generate_blob_sas(
account_name=STORAGE_ACCOUNT_NAME,
container_name=container_name,
blob_name=blob_name,
user_delegation_key=delegation_key, # Managed Identity handles authentication
permission=BlobSasPermissions(read=True, write=True), # Read & Write
expiry=datetime.datetime.utcnow() + datetime.timedelta(hours=HOURS) # 1-hour expiry
)
blob_client = blob_service_client.get_blob_client(container_name, blob_name)
if USE_SAS_TOKEN == "true" or USE_SAS_TOKEN == True:
# Generate a SAS URL for the blob
return f"{blob_client.url}?{sas_token}"
else:
# Generate a URL without SAS token for Managed Identity access
return blob_client.url
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info("Python HTTP trigger function processed a request for getBlobsByContainer.")
try:
container_names = ["bronze", "silver", "gold"]
blobs_by_container = {}
for container in container_names:
container_client = blob_service_client.get_container_client(container)
blobs_with_sas = [
{
"name": blob.name,
"url": generate_sas_token(container, blob.name) # Get SAS URL for each blob
}
for blob in container_client.list_blobs()
]
blobs_by_container[container] = blobs_with_sas
return func.HttpResponse(json.dumps(blobs_by_container), mimetype="application/json")
except Exception as e:
return func.HttpResponse(f"Error: {str(e)}", status_code=500)