Powered by AppSignal & Oban Pro

Blob Storage with AzureSDK

livebooks/blob_storage.livemd

Blob Storage with AzureSDK

Mix.install([
  # {:azure_sdk, path: Path.expand("..", __DIR__)},
  {:azure_sdk, "~> 0.4.1"},
])

Setup

Shared Key against Azurite. Start the emulator with docker compose up -d first.

credential =
  AzureSDK.Identity.SharedKeyCredential.new(
    "devstoreaccount1",
    "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
  )

client =
  AzureSDK.Storage.Client.new(
    account: "devstoreaccount1",
    credential: credential,
    endpoint: "http://127.0.0.1:10000/devstoreaccount1"
  )

container = "blob-livebook"

case AzureSDK.Storage.Container.exists?(client, container) do
  true -> :ok
  false ->
    {:ok, _} =
      AzureSDK.Storage.Container.create(client, container, metadata: %{"demo" => "true"})

  {:error, error} ->
    raise "Azurite Blob is not reachable: #{error.message}"
end

true = AzureSDK.Storage.Container.exists?(client, container)

Upload, list, download, delete

{:ok, _} =
  AzureSDK.Storage.Blob.upload(client, container, "notes.txt", "AzureSDK blob demo",
    metadata: %{"owner" => "livebook"}
  )

{:ok, blobs} = AzureSDK.Storage.Container.list_blobs(client, container)
{:ok, %{content: content}} = AzureSDK.Storage.Blob.download(client, container, "notes.txt")
{:ok, meta} = AzureSDK.Storage.Blob.metadata(client, container, "notes.txt")
{:ok, :deleted} = AzureSDK.Storage.Blob.delete(client, container, "notes.txt")

{content, length(blobs), meta}

Clean up

{:ok, :deleted} = AzureSDK.Storage.Container.delete(client, container)
:ok