Azure CLI로 블록 Blob 관리

Blob Storage는 블록 Blob, 추가 Blob 및 페이지 Blob을 지원합니다. 블록 Blob은 많은 양의 데이터를 효율적으로 업로드하기 위해 최적화됩니다. 블록 Blob은 이미지, 문서 및 임의의 읽기 및 쓰기 작업이 수행되지 않는 기타 유형의 데이터를 저장하는 데 이상적입니다. 이 문서에서는 블록 Blob으로 작업하는 방법을 설명합니다.

필수 조건

Azure Storage에 액세스하려면 Azure 구독이 있어야 합니다. 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Azure Storage에 대한 모든 액세스는 스토리지 계정을 통해 수행됩니다. 이 빠른 시작에서는 Azure Portal, Azure PowerShell 또는 Azure CLI를 사용하여 스토리지 계정을 만듭니다. 스토리지 계정을 만드는 데 도움이 필요한 경우 스토리지 계정 만들기를 참조하세요.

Azure CLI에 대한 환경 준비

  • 이 문서에는 Azure CLI 버전 2.0.46 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

Blob 스토리지에 대한 액세스 권한 부여

Microsoft Entra 자격 증명이나 스토리지 계정 액세스 키를 사용하여 Azure CLI에서 Blob Storage에 대한 액세스 권한을 부여할 수 있습니다. Microsoft Entra 자격 증명을 사용하는 것이 권장되며 이 문서의 예에서는 Microsoft Entra ID만 사용합니다.

Blob 스토리지에 대한 데이터 작업에 사용하는 Azure CLI 명령은 지정된 작업에 권한을 부여하는 방법을 지정할 수 있는 --auth-mode 매개 변수를 지원합니다. Microsoft Entra 자격 증명으로 권한 부여하려면 --auth-mode 매개 변수를 login으로 설정합니다. Blob 스토리지 데이터 작업만 --auth-mode 매개 변수를 지원합니다. 리소스 그룹 또는 스토리지 계정 만들기와 같은 관리 작업은 권한 부여를 위해 자동으로 Microsoft Entra 자격 증명을 사용합니다. 자세한 내용은 Azure CLI를 사용하여 Blob 데이터에 대한 액세스 권한을 부여하는 방법 선택을 참조하세요.

login 명령을 실행하여 브라우저를 열고 Azure 구독에 연결합니다.


az login

컨테이너 만들기

모든 Blob 데이터는 컨테이너 내에 저장되므로 데이터를 업로드하려면 먼저 하나 이상의 컨테이너 리소스가 필요합니다. 필요한 경우 다음 예를 사용하여 스토리지 컨테이너를 만듭니다. 자세한 내용은 Azure CLI를 사용하여 Blob 컨테이너 관리를 참조하세요.


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

# Create a container object
az storage container create \
    --name $containerName \
    --account-name $storageAccount
    --auth-mode login

이 문서에 포함된 예제를 사용할 때 대괄호 안의 자리 표시자 값을 고유의 값으로 바꿔야 합니다. Azure CLI를 사용하여 Azure에 로그인하는 방법에 대한 자세한 내용은 Azure CLI로 로그인을 참조하세요.

Blob 업로드

Azure CLI는 요구 사항에 따라 하나의 리소스 또는 여러 리소스에서 작업을 수행하는 명령을 제공합니다.

블록 Blob에 파일을 업로드하려면 필수 매개 변수 값을 az storage blob upload 명령에 전달합니다. --file 매개 변수로 원본 경로와 파일 이름을 제공하고 --container-name 매개 변수로 대상 컨테이너 이름을 제공합니다. 또한 --account-name 매개 변수를 제공해야 합니다. 이 명령은 새 Blob을 만들거나 원래 Blob이 이미 있는 경우 덮어씁니다.

az storage blob upload-batch 명령을 사용하여 스토리지 컨테이너에 여러 Blob을 재귀적으로 업로드할 수 있습니다. Unix 파일 이름 패턴 일치를 사용하여 --pattern 매개 변수로 업로드할 파일 범위를 지정할 수 있습니다. 지원되는 패턴은 *, ?, [seq][!seq]입니다. 자세한 내용은 Unix 파일 이름 패턴 일치에 대한 Python 설명서를 참조하세요.

다음 예에서 첫 번째 작업은 az storage blob upload 명령을 사용하여 명명된 단일 파일을 업로드합니다. 원본 파일 및 대상 스토리지 컨테이너는 --file--container-name 매개 변수로 지정됩니다.

두 번째 작업은 az storage blob upload-batch 명령을 사용하여 여러 파일을 업로드하는 방법을 보여 줍니다. --if-modified-since 매개 변수는 지난 7일 동안 수정된 파일만 업로드되도록 합니다. 이 매개 변수에서 제공하는 값은 UTC 형식으로 제공되어야 합니다.


#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
lastModified=`date -d "7 days ago" '+%Y-%m-%dT%H:%MZ'`

path="C:\\temp\\"
filename="demo-file.txt"
imageFiles="*.png"
file="$path$filename"

#Upload a single named file
az storage blob upload \
    --file $file \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login

#Upload multiple image files recursively
az storage blob upload-batch \
    --destination $containerName \
    --source $path \
    --pattern *.png \
    --account-name $storageAccount \
    --auth-mode login \
    --if-modified-since $lastModified

Blob 나열

기본적으로 az storage blob list 명령은 컨테이너 내에 저장된 모든 Blob을 나열합니다. 다양한 방법을 사용하여 검색 범위를 좁힐 수 있습니다. 스토리지 계정에 포함될 수 있는 컨테이너 또는 Blob의 수에는 제한이 없습니다. 수천 개의 Blob이 검색되는 것을 방지하려면 반환되는 데이터의 양을 제한하는 것이 좋습니다.

--prefix 매개 변수를 사용하여 알려진 단일 파일 또는 이름이 정의된 문자열로 시작하는 파일 범위를 선택합니다.

기본적으로 나열 작업에서는 Blob만 반환됩니다. 일부 시나리오에서는 일시 삭제된 Blob, 스냅샷 및 버전과 같은 추가 유형의 개체를 반환하기 위해 --include 매개 변수의 값을 전달할 수 있습니다. 이러한 값을 결합하여 여러 개체 형식을 반환할 수 있습니다.

--num-results 매개 변수를 사용하여 컨테이너에서 반환되는 필터링되지 않은 Blob의 수를 제한할 수 있습니다. 모든 Azure 리소스에는 5,000개의 서비스 제한이 적용됩니다. 이 제한은 관리 가능한 양의 데이터를 검색하고 성능에 영향을 미치지 않도록 합니다. 반환된 Blob 수가 --num-results 값 또는 서비스 제한을 초과하면 연속 토큰이 반환됩니다. 이 토큰을 사용하면 여러 요청을 사용하여 원하는 수의 Blob을 검색할 수 있습니다. 자세한 내용은 Blob 리소스 열거를 참조하세요.

다음 예에서는 Blob 목록을 제공하는 데 사용되는 여러 접근 방식을 보여줍니다. 첫 번째 접근 방식은 특정 컨테이너 리소스 내의 단일 Blob을 나열합니다. 두 번째 방법은 --prefix 매개 변수를 사용하여 louis 접두사가 있는 모든 컨테이너의 모든 Blob을 나열합니다. 검색은 --num-results 매개 변수를 사용하는 5개의 컨테이너로 제한됩니다. 세 번째 접근 방식은 --num-results--marker 매개 변수를 사용하여 컨테이너 내의 모든 Blob 검색을 제한합니다.

자세한 내용은 az storage blob list 참조를 확인하세요.


#!/bin/bash
storageAccount="<storage-account>"
blobName="demo-file.txt"
containerName="demo-container"
blobPrefix="img-louis"
numResults=5

#Approach 1: List all blobs in a named container
az storage blob list \
    --container $containerName \
    --account-name $storageAccount \
    --prefix $blobName
    --auth-mode login

#Approach 2: Use the --prefix parameter to list blobs in all containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results $numResults \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
    az storage blob list \
        --prefix $blobPrefix \
        --container $tmpName \
        --account-name $storageAccount \
        --auth-mode login
done

Blob 다운로드

사용 사례에 따라 az storage blob download 또는 az storage blob download-batch 명령을 사용하여 Blob을 다운로드합니다. 개별 Blob을 다운로드하려면 az storage blob download 명령을 직접 호출하고 --container-name, --file--name 매개 변수에 대한 값을 전달합니다. Blob은 기본적으로 셸 디렉터리에 다운로드되지만 대체 위치를 지정할 수 있습니다. 지정한 경로가 없으면 작업이 실패하고 오류가 발생합니다.

스토리지 컨테이너에서 여러 Blob을 재귀적으로 다운로드하려면 az storage blob download-batch 명령을 사용합니다. 이 명령은 --pattern 매개 변수로 Unix 파일 이름 패턴 일치를 지원합니다. 지원되는 패턴은 *, ?, [seq][!seq]입니다. 자세한 내용은 Unix 파일 이름 패턴 일치에 대한 Python 설명서를 참조하세요.

다음 샘플 코드는 단일 및 다중 다운로드 접근 방식의 예를 제공합니다. 또한 와일드카드를 사용하여 특정 파일에 대한 모든 컨테이너를 검색하는 단순화된 접근 방식을 제공합니다. 일부 환경에는 수천 개의 리소스가 있을 수 있으므로 --num-results 매개 변수를 사용하는 것이 좋습니다.

자세한 내용은 az storage blob downloadaz storage blob download batch 참조를 확인하세요.

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

destinationPath="C:\\temp\\downloads\\"
destinationFilename="downloadedBlob.txt"
file="$destinationPath$destinationFilename"
sourceBlobName="demo-file.txt"

#Download a single named blob

az storage blob download \
    --container $containerName \
    --file $file \
    --name $sourceBlobName \
    --account-name $storageAccount \
    --auth-mode login

#Download multiple blobs using a pattern value

az storage blob download-batch \
    --destination $destinationPath \
    --source $containerName \
    --pattern images/*.png \
    --account-name $storageAccount \
    --auth-mode login

#Use a loop to download matching blobs in a list of containers

containerList=$( \
    az storage container list \
        --query "[].name" \
        --num-results 5 \
        --account-name $storageAccount \
        --auth-mode login \
        --output tsv 
)
for row in $containerList
do
    tmpName=$(echo $row | sed -e 's/\r//g')
    echo $tmpName
   
    az storage blob download-batch \
        --destination $destinationPath \
        --source $tmpName \
        --pattern *louis*.* \
        --account-name $storageAccount \
        --auth-mode login
done

Blob 속성 및 메타데이터 관리

Blob은 시스템 속성과 사용자 정의 메타데이터를 모두 노출합니다. 시스템 속성은 각 Blob Storage 리소스에 있습니다. 일부 속성은 읽기 전용이고 다른 속성은 읽거나 설정할 수 있습니다. 내부적으로 일부 시스템 속성은 특정 표준 HTTP 헤더에 매핑됩니다.

사용자 정의 메타데이터는 Blob Storage 리소스에 대해 지정하는 하나 이상의 이름-값 쌍으로 구성됩니다. 메타데이터를 사용하여 리소스와 함께 추가 값을 저장할 수 있습니다. 메타데이터 값은 고유의 목적을 위한 것이며 리소스가 작동하는 방식에 영향을 주지 않습니다.

Blob 속성 읽기

Blob 속성 또는 메타데이터를 읽으려면 먼저 서비스에서 Blob을 검색해야 합니다. az storage blob show 명령을 사용하여 Blob의 속성과 메타데이터를 검색하지만 내용은 검색하지 않습니다. 다음 예에서는 Blob을 검색하고 해당 속성을 나열합니다.

자세한 내용은 az storage blob show 참조를 확인하세요.

#!/bin/bash
#Set variables
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob show \
    --container  demo-container \
    --name demo-file.txt \
    --account-name $storageAccount \
    --auth-mode login

Blob 메타데이터 읽기 및 쓰기

Blob 메타데이터는 Blob과 연결된 이름/값 쌍의 선택적 집합입니다. 이전 예에서 볼 수 있듯이 처음에는 Blob과 연결된 메타데이터가 없지만 필요할 때 추가할 수 있습니다. 읽으려면 az storage blob metadata show 명령을 사용합니다. Blob 메타데이터를 업데이트하려면 az storage blob metadata update를 사용하고 키-값 쌍의 배열을 제공합니다. 자세한 내용은 az storage blob metadata 참조를 확인하세요.

자세한 내용은 az storage blob metadata 참조를 확인하세요.

아래 예는 먼저 Blob의 메타데이터를 업데이트하고 커밋한 다음, 검색합니다.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="blue-moon.mp3"

metadata=("Written=1934" "Recorded=1958")
metadata+=("Lyricist=Lorenz Hart")
metadata+=("Composer=Richard Rogers")
metadata+=("Artist=Tony Bennett")

#Update metadata
az storage blob metadata update \
    --container-name $containerName \
    --name $blobName \
    --metadata "${metadata[@]}" \
    --account-name $storageAccount \
    --auth-mode login

#Retrieve updated blob metadata
az storage blob metadata show \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

Blob에 대한 복사 작업

다양한 유형의 Blob을 복사할 수 있는 많은 시나리오가 있습니다. 이 문서의 예는 블록 Blob으로 제한됩니다. Azure CLI는 요구 사항에 따라 하나의 리소스 또는 여러 리소스에서 작업을 수행하는 명령을 제공합니다.

특정 Blob을 복사하려면 az storage blob copy start 명령을 사용하고 원본 및 대상 컨테이너와 Blob에 대한 값을 지정합니다. URI(Uniform Resource Identifier), 공유 또는 SAS(공유 액세스 서명)을 원본으로 제공하는 것도 가능합니다.

Blob이 복사될 조건을 지정할 수도 있습니다. 이러한 조건은 원본 또는 대상 Blob에 대해 설정할 수 있습니다. 마지막 수정 날짜, 태그 데이터 또는 ETag 값을 참조할 수 있습니다. 예를 들어 최근에 수정되지 않은 Blob을 별도의 컨테이너로 복사하도록 선택할 수 있습니다. 자세한 내용은 Blob 서비스 작업의 조건부 헤더 지정을 참조하세요.

az storage blob copy start-batch 명령을 사용하여 동일한 스토리지 계정 내의 스토리지 컨테이너 간에 여러 Blob을 재귀적으로 복사할 수 있습니다. 이 명령에는 --source-container--destination-container 매개 변수 값이 필요하며 원본과 대상 간에 모든 파일을 복사할 수 있습니다. 다른 CLI 일괄 처리 명령과 마찬가지로 이 명령은 --pattern 매개 변수로 Unix 파일 이름 패턴 일치를 지원합니다. 지원되는 패턴은 *, ?, [seq][!seq]입니다. 자세한 내용은 Unix 파일 이름 패턴 일치에 대한 Python 설명서를 참조하세요.

참고 항목

특히 스토리지 계정 간에 Blob을 복사할 때 AzCopy를 사용하여 편의성과 성능을 고려합니다. AzCopy는 스토리지 계정에서 또는 스토리지 계정으로 Blob 또는 파일을 복사하는 데 사용할 수 있는 명령줄 유틸리티입니다. AzCopy 시작하기 방법에 대해 자세히 알아보세요.

자세한 내용은 az storage blob copy 참조를 확인하세요.

다음 샘플 코드는 단일 및 다중 복사 작업의 예를 제공합니다. 일부 환경에는 수천 개의 리소스가 있을 수 있으므로 --num-results 매개 변수를 사용하는 것이 좋습니다. 첫 번째 예는 사진 컨테이너에서 위치 컨테이너로 secret-town-road.png Blob을 복사합니다. 두 컨테이너는 동일한 스토리지 계정 내에 있습니다. 결과를 통해 복사 작업의 성공 여부를 확인합니다.

#!/bin/bash
storageAccount="<storage-account>"
sourceContainer="photos"
blobName="secret-town-road.jpg"
destContainer="locations"

az storage blob copy start \
    --destination-container $destContainer \
    --destination-blob $blobName \
    --source-container $sourceContainer \
    --source-blob $blobName \
    --account-name $storageAccount \
    --auth-mode login

Blob 스냅샷

기본 Blob과 연결된 임대는 스냅샷에 영향을 주지 않습니다. 스냅샷에 대한 임대를 얻을 수 없습니다. Blob 스냅샷에 대해 자세히 알아보세요. 자세한 내용은 az storage blob snapshot 참조를 확인하세요.

다음 샘플 코드는 스토리지 컨테이너에서 Blob을 검색하고 스냅샷을 만듭니다.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"
blobName="demo-file.txt"

az storage blob snapshot \
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --account-name $storageAccount \
    --auth-mode login

Blob 계층 설정

Blob의 계층을 변경할 때는 해당 Blob 및 해당 데이터를 모두 대상 계층으로 이동합니다. az storage blob set-tier 명령을 사용하여 , 보관 사이에서 계층을 변경할 수 있습니다.

요구 사항에 따라 Blob 복사 작업을 활용하여 한 계층에서 다른 계층으로 Blob을 복사할 수도 있습니다. Blob 복사 작업은 원본 Blob이 원래 계층에 남아 있는 동안 원하는 계층에 새 Blob을 만듭니다.

또는 에서 보관으로의 계층 변경은 거의 즉시 이루어집니다. Blob이 Archive 계층으로 이동되면 오프라인으로 간주되어 읽거나 수정할 수 없습니다. 보관된 Blob의 데이터를 읽거나 수정하려면 먼저 온라인 계층으로 리하이드레이션해야 합니다. 보관 계층에서 Blob 복원에 대해 자세히 알아보세요.

자세한 내용은 az storage blob set-tier 참조를 확인하세요.

다음 샘플 코드는 archive 컨테이너 내의 명명된 단일 Blob에 대해 계층을 으로 설정합니다.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

az storage blob set-tier 
    --container-name $containerName \
    --name Blue-Moon.mp3 \
    --tier Hot \
    --account-name $storageAccount \
    --auth-mode login

Blob 태그를 사용하는 작업

Blob 인덱스 태그를 사용하면 데이터 관리 및 검색이 더 쉬워집니다. Blob 인덱스 태그는 Blob에 적용할 수 있는 사용자 정의 키-값 인덱스 특성입니다. 구성한 후에는 개별 컨테이너 내에서 또는 모든 컨테이너에서 개체를 분류하고 찾을 수 있습니다. Blob 리소스는 컨테이너 조직을 변경할 필요 없이 인덱스 태그를 업데이트하여 동적으로 분류할 수 있습니다. 이 방법은 변화하는 데이터 요구 사항에 유연하게 대처할 수 있는 방법을 제공합니다. 메타데이터와 인덱스 태그를 동시에 사용할 수 있습니다. 인덱스 태그에 대한 자세한 내용은 Blob 인덱스 태그를 사용하여 Azure Blob 데이터 관리 및 찾기를 참조하세요.

아래에 제공된 코드 샘플은 패턴 일치를 사용하여 알려진 구조의 XML 파일에서 텍스트를 가져옵니다. 이 예제는 기본 Bash 기능을 사용하여 Blob 태그를 추가하는 단순화된 방법을 설명하는 데 사용됩니다. 프로덕션 워크로드에 데이터를 사용할 때는 항상 실제 데이터 구문 분석 도구를 사용하는 것이 좋습니다.

다음 예에서는 Blob 인덱스 태그를 일련의 Blob에 추가하는 방법을 보여줍니다. 이 예에서는 XML 파일에서 데이터를 읽고 이를 사용하여 여러 Blob에서 인덱스 태그를 만듭니다. 샘플 코드를 사용하려면 C:\temp 디렉터리에 로컬 blob-list.xml 파일을 만듭니다. XML 데이터는 아래에 제공됩니다.

자세한 내용은 az storage blob set-tier 참조를 확인하세요.

<Venue Name="House of Prime Rib" Type="Restaurant">
  <Files>
    <File path="transactions/12027121.csv" />
    <File path="campaigns/radio-campaign.docx" />
    <File path="photos/bannerphoto.png" />
    <File path="archive/completed/2020review.pdf" />
    <File path="logs/2020/01/01/logfile.txt" />
  </Files>
</Venue>

샘플 코드는 XML 파일 내에서 행을 반복합니다. Venue 요소를 찾고 NameType 값에 대한 변수를 만듭니다. 그런 다음 나머지 줄을 반복하고 File 노드에서 참조하는 각 Blob에 대한 태그를 만듭니다.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

while read line
do
  
#Set Tag values 
if echo "$line" | grep -q "<Venue";then
    name=`echo "$line" | cut -d'"' -f 2`
    type=`echo "$line" | cut -d'"' -f 4`
    tags=("name=$name")
    tags+=("type=$type")
fi

#Add tags to blobs
if echo "$line" | grep -q "<File ";then
    blobName=`echo "$line" | cut -d'"' -f 2`
    
    echo az storage blob tag set \
        --container-name $containerName \
        --name $blobName \
        --account-name $storageAccount \
        --auth-mode login \
        --tags "{$tags[@]}"
fi

done < /mnt/c/temp/bloblist.xml

Blob 삭제

az storage blob deleteaz storage blob delete-batch 명령을 사용하여 단일 Blob 또는 일련의 Blob을 삭제할 수 있습니다. 여러 Blob을 삭제할 때 아래 예와 같이 조건부 연산, 루프 또는 기타 자동화를 사용할 수 있습니다.

Warning

다음 예제를 실행하면 Blob이 영구적으로 삭제될 수 있습니다. 컨테이너와 Blob가 실수로 삭제되지 않도록 컨테이너 일시 삭제를 사용하도록 설정하는 것이 좋습니다. 자세한 내용은 컨테이너에 대한 일시 삭제를 참조하세요.

다음 샘플 코드는 개별 및 일괄 삭제 작업의 예를 제공합니다. 첫 번째 예에서는 이름이 지정된 단일 Blob을 삭제합니다. 두 번째 예는 Bash에서 논리 연산을 사용하여 여러 Blob을 삭제하는 방법을 보여 줍니다. 세 번째 예에서는 delete-batch 명령을 사용하여 bennett-2를 제외하고 bennett-x 형식의 모든 Blob을 삭제합니다.

자세한 내용은 az storage blob deleteaz storage blob delete-batch 참조를 확인하세요.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobName="demo-file.txt"
blobPrefix="sinatra-"

#Delete a single, named blob
az storage blob delete \
    --container-name $containerName \
    --name $blobName \
    --account-name $storageAccount \
    --auth-mode login

#Iterate a blob list, deleting blobs whose names end with even numbers

## Get list of containers
blobList=$(az storage blob list \
    --query "[].name" \
    --prefix $blobPrefix \
    --container-name $containerName \
    --account-name $storageAccount \
    --auth-mode login \
    --output tsv)

## Delete all blobs with the format *bennett-x* except *bennett-2.*
for row in $blobList
do
    #Get the blob's number
    tmpBlob=$(echo $row | sed -e 's/\r//g') 
    tmpName=$(echo ${row%.*} | sed -e 's/\r//g')

    if [ `expr ${tmpName: ${#blobPrefix}} % 2` == 0 ]
    then
        
        echo "Deleting $tmpBlob"
        az storage blob delete \
            --container-name $containerName \
            --name $tmpBlob \
            --account-name $storageAccount \
            --auth-mode login

  fi
done

#Delete multiple blobs using delete-batch
az storage blob delete-batch \
    --source $containerName \
    --pattern bennett-[!2].* \
    --account-name $storageAccount \
    --auth-mode login

경우에 따라 삭제된 Blob을 검색할 수 있습니다. 스토리지 계정의 일시 삭제 데이터 보호 옵션이 사용하도록 설정된 경우 --include d 매개 변수 및 값은 계정의 보존 기간 내에 삭제된 Blob을 반환합니다. 일시 삭제에 대한 자세한 내용은 Blob 일시 삭제 문서를 참조하세요.

다음 예제를 사용하여 컨테이너의 연결된 보존 기간 내에 삭제된 Blob 목록을 검색합니다. 첫 번째 예제에서는 최근에 삭제된 모든 Blob 목록과 삭제된 날짜를 표시합니다. 두 번째 예제에서는 특정 접두사와 일치하는 삭제된 모든 Blob을 나열합니다.

#!/bin/bash
storageAccount="<storage-account>"
containerName="demo-container"

blobPrefix="sinatra-"

#Retrieve a list of all deleted blobs
az storage blob list \
    --container-name $containerName \
    --include d \
    --output table \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[?deleted].{name:name,deleted:properties.deletedTime}"

#Retrieve a list of all deleted blobs matching a specific prefix
az storage blob list \
    --container-name $containerName \
    --prefix $blobPrefix \
    --output table \
    --include d \
    --account-name $storageAccount \
    --auth-mode login \
    --query "[].{name:name,deleted:deleted}"

삭제된 Blob 복원

Blob 나열 섹션에서 언급했듯이 스토리지 계정에서 일시 삭제 데이터 보호 옵션을 구성할 수 있습니다. 사용하도록 설정하면 관련 보존 기간 내에 삭제된 컨테이너를 복원할 수 있습니다. 버전 관리를 사용하여 각 복구 및 복원에 대해 Blob의 이전 버전을 유지 관리할 수도 있습니다.

Blob 버전 관리와 Blob 일시 삭제가 모두 활성화된 경우 Blob을 수정, 덮어쓰기, 삭제 또는 복원하면 새 버전이 자동으로 만들어집니다. 삭제된 Blob을 복원하는 데 사용하는 방법은 스토리지 계정에서 버전 관리가 활성화되어 있는지 여부에 따라 달라집니다.

다음 코드 샘플은 일시 삭제된 모든 Blob을 복원하거나 버전 관리가 사용하도록 설정된 경우 최신 버전의 Blob을 복원합니다. 먼저 az storage account blob-service-properties show 명령으로 버전 관리가 사용되는지 여부를 결정합니다.

버전 관리가 사용하도록 설정된 경우 az storage blob list 명령은 고유하게 명명된 모든 Blob 버전 목록을 검색합니다. 다음으로, 목록의 Blob 버전을 검색하고 날짜별로 정렬합니다. isCurrentVersion 특성 값이 있는 버전을 찾을 수 없는 경우 az storage blob copy start 명령을 사용하여 Blob 최신 버전의 활성 복사본을 만듭니다.

버전 관리가 사용하지 않도록 설정된 경우 az storage blob undelete 명령은 컨테이너에서 일시 삭제된 각 Blob을 복원하는 데 사용됩니다.

이 예를 따르기 전에 스토리지 계정 중 하나 이상에서 일시 삭제를 사용하도록 설정해야 합니다. 일시 삭제 데이터 보호 옵션에 대한 자세한 내용은 Blob에 대한 일시 삭제 문서 또는 az storage blob undelete 참조를 확인하세요.

#!/bin/bash
storageAccount="<storage-account>"
groupName="myResourceGroup"
containerName="demo-container"

blobSvcProps=$(
    az storage account blob-service-properties show \
        --account-name $storageAccount \
        --resource-group $groupName)

softDelete=$(echo "${blobSvcProps}" | jq -r '.deleteRetentionPolicy.enabled')
versioning=$(echo "${blobSvcProps}" | jq -r '.isVersioningEnabled')

# If soft delete is enabled
if $softDelete
then
    
    # If versioning is enabled
    if $versioning
    then

        # Get all blobs and versions using -Unique to avoid processing duplicates/versions
        blobList=$(
            az storage blob list \
                --account-name $storageAccount \
                --container-name $containerName \
                --include dv \--query "[?versionId != null].{name:name}" \
                --auth-mode login -o tsv | uniq)
        
        # Iterate the collection
        for blob in $blobList
        do
            # Get all versions of the blob, newest to oldest
            blobVers=$(
                az storage blob list \
                    --account-name $storageAccount \
                    --container-name $containerName \
                    --include dv \
                    --prefix $blob \
                    --auth-mode login -o json | jq 'sort_by(.versionId) | reverse | .[]')
            # Select the first (newest) object
            delBlob=$(echo "$blobVers" | jq -sr '.[0]')
            
            # Verify that the newest version is NOT the latest (that the version is "deleted")
            if [[ $(echo "$delBlob" | jq '.isCurrentVersion') != true ]]; 
            then
                # Get the blob's versionId property, build the URI to the blob
                versionID=$(echo "$delBlob" | jq -r '.versionId')
                uri="https://$storageAccount.blob.core.windows.net/$containerName/$blob?versionId=$versionID"
                
                # Copy the latest version 
                az storage blob copy start \
                    --account-name $storageAccount \
                    --destination-blob $blob \
                    --destination-container $containerName \
                    --source-uri $uri \
                    --auth-mode login
       
                delBlob=""
            fi
        done

    else

        #Retrieve all deleted blobs
        blobList=$( \
            az storage blob list \
                --container-name $containerName \
                --include d \
                --output tsv \
                --account-name $storageAccount \
                --auth-mode login \
                --query "[?deleted].[name]" \
        )

        #Iterate list of deleted blobs and restore
        for row in $blobList
        do
            tmpName=$(echo $row | sed -e 's/\r//g')
            echo "Restoring $tmpName"
            az storage blob undelete \
                --container-name $containerName \
                --name $tmpName \
                --account-name $storageAccount \
                --auth-mode login
        done

    fi

else
    
    #Soft delete is not enabled
    echo "Sorry, the delete retention policy is not enabled."

fi

다음 단계