다음을 통해 공유


PowerShell을 사용하여 블록 Blob 관리

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

필수 구성 요소

  • Azure 구독 Azure 평가판을 참조하세요.

  • Azure PowerShell 모듈 Az는 Azure와 상호 작용하는 데 추천되는 PowerShell 모듈입니다. Az PowerShell 모듈을 시작하려면 Azure PowerShell 설치를 참조하세요.

자격 증명을 캡슐화할 컨텍스트 개체 구성

Azure Storage에 대한 모든 요청은 권한이 있어야 합니다. Microsoft Entra 계정을 사용하거나 계정 액세스 키를 사용하여 PowerShell에서 수행한 요청을 권한 부여할 수 있습니다. 이 문서의 예에서는 컨텍스트 개체와 함께 Microsoft Entra 권한 부여를 사용합니다. 컨텍스트 개체는 Microsoft Entra 자격 증명을 캡슐화하고 후속 데이터 작업 중에 전달합니다.

Microsoft Entra 계정으로 Azure 계정에 로그인하려면 PowerShell을 열고 Connect-AzAccount cmdlet을 호출합니다.

#Connect to your Azure subscription
Connect-AzAccount

연결이 설정되면 Azure 컨텍스트를 만듭니다. Microsoft Entra ID로 인증하면 기본 구독에 대한 Azure 컨텍스트가 자동으로 만들어집니다. 경우에 따라 인증 후 다른 구독의 리소스에 액세스해야 할 수 있습니다. 활성 세션 컨텍스트를 수정하여 현재 Azure 세션과 연결된 구독을 변경할 수 있습니다.

기본 구독을 사용하려면 New-AzStorageContext cmdlet을 호출하여 컨텍스트를 만듭니다. Microsoft Entra 자격 증명을 사용하여 데이터 작업이 수행되도록 -UseConnectedAccount 매개 변수를 포함합니다.

#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount

구독을 변경하려면 Get-AzSubscription cmdlet을 사용하여 컨텍스트 개체를 검색한 다음, Set-AzContext를 사용하여 현재 컨텍스트를 변경합니다. 자세한 내용은 활성 구독 변경을 참조하세요.

컨테이너 만들기

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

#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx

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

Blob 업로드

블록 Blob에 파일을 업로드하려면 필수 매개 변수 값을 Set-AzStorageBlobContent cmdlet에 전달합니다. -File 매개 변수로 경로 및 파일 이름을 제공하고 -Container 매개 변수로 컨테이너 이름을 제공합니다. 또한 -Context 매개 변수를 사용하여 컨텍스트 객체에 대한 참조를 제공해야 합니다.

이 명령은 Blob이 없는 경우 Blob을 만들거나, 있는 경우 덮어쓸지 묻는 메시지를 표시합니다. -Force 매개 변수를 cmdlet에 전달하면 확인 없이 파일을 덮어쓸 수 있습니다.

다음 예에서는 이름이 지정된 단일 파일을 업로드하기 위해 -File 매개 변수 값을 지정합니다. 또한 PowerShell 파이프라인 연산자 및 Get-ChildItem cmdlet을 사용하여 여러 파일을 업로드하는 방법을 보여줍니다. Get-ChildItem cmdlet은 -Path 매개 변수를 사용하여 C:\Temp\*.png를 지정합니다. 별표(*) 와일드카드를 포함하면 파일 확장자가 .png인 모든 파일을 지정합니다. -Recurse 매개 변수는 Temp 디렉터리와 그 하위 디렉터리를 검색합니다.

#Set variables
$path          = "C:\temp\" 
$containerName = "mycontainer"
$filename      = "demo-file.txt"
$imageFiles    = $path + "*.png"
$file          = $path + $filename

#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx

#Upload multiple image files recursively
 Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx

결과에는 스토리지 계정 이름, 스토리지 컨테이너 이름이 표시되고 업로드된 파일 목록이 제공됩니다.

   AccountName: demostorageaccount, ContainerName: demo-container

Name              BlobType   Length  ContentType                LastModified          AccessTier  IsDeleted
----              --------   ------  -----------                ------------          ----------  ---------
demo-file.txt     BlockBlob  222     application/octet-stream   2021-12-14 01:38:03Z  Cool        False     
hello-world.png   BlockBlob  14709   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world2.png  BlockBlob  12472   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world3.png  BlockBlob  13537   application/octet-stream   2021-12-14 01:38:03Z  Cool        False

Blob 나열

Get-AzStorageBlob cmdlet은 컨테이너 내에 저장된 Blob을 나열하는 데 사용됩니다. 다양한 접근 방식을 사용하여 검색 범위를 정의할 수 있습니다. -Container-Name 매개 변수를 사용하여 알려진 컨테이너 내의 특정 Blob을 나열합니다. 특정 컨테이너 내 모든 Blob의 필터링되지 않은 목록을 생성하려면 -Name 값 없이 -Container 매개 변수만 사용합니다.

스토리지 계정에 포함될 수 있는 컨테이너 또는 Blob의 수에는 제한이 없습니다. 수천 개의 Blob이 검색되는 것을 방지하려면 반환되는 데이터의 양을 제한하는 것이 좋습니다. 여러 Blob을 검색할 때 -Prefix 매개 변수를 사용하여 이름이 특정 문자열로 시작하는 Blob을 지정할 수 있습니다. 와일드카드와 함께 -Name 매개 변수를 사용하여 파일 이름이나 유형을 지정할 수도 있습니다.

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

다음 예에서는 Blob 목록을 제공하는 데 사용되는 여러 접근 방식을 보여줍니다. 첫 번째 접근 방식은 특정 컨테이너 리소스 내의 단일 Blob을 나열합니다. 두 번째 접근 방식은 와일드카드를 사용하여 접두어가 Louis인 모든 .jpg 파일을 나열합니다. 검색은 -MaxCount 매개 변수를 사용하는 5개의 컨테이너로 제한됩니다. 세 번째 접근 방식은 -MaxCount-ContinuationToken 매개 변수를 사용하여 컨테이너 내의 모든 Blob 검색을 제한합니다.

#Set variables
$namedContainer  = "named-container"
$demoContainer   = "mycontainer"
$containerPrefix = "demo"

$maxCount = 1000
$total     = 0
$token     = $Null

#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx

#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg" 

#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
     #Retrieve blobs using the MaxCount parameter
     $blobs = Get-AzStorageBlob -Container $demoContainer `
         -MaxCount $maxCount `
         -ContinuationToken $token `
         -Context $ctx
     $blobCount = 1
     
     #Loop through the batch
     Foreach ($blob in $blobs)
     {
         #To-do: Perform some work on individual blobs here

         #Display progress bar
         $percent = $($blobCount/$maxCount*100)
         Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
         $blobCount++
     }

     #Update $total
     $total += $blobs.Count
      
     #Exit if all blobs processed
     If($blobs.Length -le 0) { Break; }
      
     #Set continuation token to retrieve the next batch
     $token = $blobs[$blobs.Count -1].ContinuationToken
 }
 While ($null -ne $token)
 Write-Host "`n`n   AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
 Write-Host "Processed $total blobs in $namedContainer."

처음 두 가지 접근 방식은 스토리지 계정 및 컨테이너 이름과 검색된 Blob 목록을 표시합니다. 세 번째 접근 방식은 명명된 컨테이너 내의 Blob의 총 수를 표시합니다. Blob은 일괄 처리로 검색되고 카운트 중 진행률을 보여줍니다.

   AccountName: demostorageaccount, ContainerName: named-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
index.txt            BlockBlob   222       text/plain     2021-12-15 22:00:10Z  Cool          False
miles-davis.txt      BlockBlob   23454     text/plain     2021-12-15 22:17:59Z  Cool          False
cab-calloway.txt     BlockBlob   18419     text/plain     2021-12-15 22:17:59Z  Cool          False
benny-goodman.txt    BlockBlob   17726     text/plain     2021-12-15 22:17:59Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
louis-armstrong.jpg  BlockBlob   211482    image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-jordan.jpg     BlockBlob   55766     image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-prima.jpg      BlockBlob   290651    image/jpeg     2021-12-14 01:38:03Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Processed 5257 blobs in demo-container.

Blob 다운로드

사용 사례에 따라 Get-AzStorageBlobContent cmdlet을 사용하여 단일 또는 여러 Blob을 다운로드할 수 있습니다. 대부분의 작업과 함께 두 가지 방법 모두 컨텍스트 개체가 필요합니다.

명명된 단일 Blob을 다운로드하려면 cmdlet을 직접 호출하고 -Blob-Container 매개 변수에 대한 값을 제공하면 됩니다. Blob은 기본적으로 작동 중인 PowerShell 디렉터리에 다운로드되지만 대체 위치를 지정할 수 있습니다. 대상 위치를 변경하려면 -Destination 매개 변수를 사용하여 유효한 기존 경로를 전달해야 합니다. 작업은 대상을 만들 수 없기 때문에 지정된 경로가 존재하지 않으면 오류와 함께 실패합니다.

Get-AzStorageBlob cmdlet과 PowerShell 파이프라인 연산자를 결합하여 여러 Blob을 다운로드할 수 있습니다. 먼저 Get-AzStorageBlob cmdlet을 사용하여 Blob 목록을 만듭니다. 그런 다음, 파이프라인 연산자와 Get-AzStorageBlobContent cmdlet을 사용하여 컨테이너에서 Blob을 검색합니다.

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

#Set variables
$containerName = "mycontainer"
$path          = "C:\temp\downloads\"
$blobName      = "demo-file.txt"
$fileList      = "*.png"
$pipelineList  = "louis*"
$maxCount      = 10

#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx

#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent

#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
     -Context $ctx | Get-AzStorageBlob `
     -Blob "louis*" | Get-AzStorageBlobContent

결과는 스토리지 계정 및 컨테이너 이름을 표시하고 다운로드한 파일 목록을 제공합니다.

   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
demo-file.txt        BlockBlob  222     application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world.png      BlockBlob  14709   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world2.png     BlockBlob  12472   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world3.png     BlockBlob  13537   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: public-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-armstrong.jpg  BlockBlob  211482  image/jpeg               2021-12-14 18:56:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: read-only-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-jordan.jpg     BlockBlob  55766   image/jpeg               2021-12-14 18:56:21Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: hidden-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-prima.jpg      BlockBlob  290651  image/jpeg               2021-12-14 18:56:45Z  Unknown     False

Blob 속성 및 메타데이터 관리

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

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

Blob 속성 읽기

Blob 속성 또는 메타데이터를 읽으려면 먼저 서비스에서 Blob을 검색해야 합니다. Get-AzStorageBlob cmdlet을 사용하여 Blob의 속성과 메타데이터를 검색하지만 해당 콘텐츠는 검색하지 않습니다. 그런 다음, BlobClient.GetProperties 메서드를 사용하여 Blob의 속성을 가져옵니다. 그러면 필요에 따라 속성 또는 메타데이터를 읽거나 설정할 수 있습니다.

다음 예에서는 Blob을 검색하고 해당 속성을 나열합니다.

$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value

결과는 다음 예제와 같이 Blob의 속성 목록을 표시합니다.

LastModified                         : 11/16/2021 3:42:07 PM +00:00
CreatedOn                            : 11/16/2021 3:42:07 PM +00:00
Metadata                             : {}
BlobType                             : Block
LeaseDuration                        : Infinite
LeaseState                           : Available
LeaseStatus                          : Unlocked
ContentLength                        : 2163298
ContentType                          : audio/mpeg
ETag                                 : 0x8D9C0AA9E0CBA78
IsServerEncrypted                    : True
AccessTier                           : Cool
IsLatestVersion                      : False
TagCount                             : 0
ExpiresOn                            : 1/1/0001 12:00:00 AM +00:00
LastAccessed                         : 1/1/0001 12:00:00 AM +00:00
HasLegalHold                         : False

Blob 메타데이터 읽기 및 쓰기

Blob 메타데이터는 Blob과 연결된 이름/값 쌍의 선택적 집합입니다. 이전 예에서 볼 수 있듯이 처음에는 Blob과 연결된 메타데이터가 없지만 필요할 때 추가할 수 있습니다. Blob 메타데이터를 업데이트하려면 BlobClient.UpdateMetadata 메서드를 사용합니다. 이 메서드는 일반 IDictionary 개체에 저장된 키-값 쌍만 수락합니다. 자세한 내용은 BlobClient 클래스 정의를 참조하세요.

아래 예는 먼저 Blob의 메타데이터를 업데이트하고 커밋한 다음, 검색합니다. 샘플 Blob은 메모리 내 개체에서 메타데이터를 읽지 않도록 메모리에서 플러시됩니다.

#Set variable
$container = "mycontainer"
$blobName  = "blue-moon.mp3"

#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx

#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")

#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)

#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
 
#Display metadata
Echo $properties.Value.Metadata

결과는 다음 예제와 같이 Blob의 새로 업데이트된 메타데이터를 반환합니다.

Key          Value         
---          -----         
YearWritten  1934          
YearRecorded 1958          
Composer     Richard Rogers
Lyricist     Lorenz Hart   
Artist       Tony Bennett

Blob에 대한 복사 작업

다양한 유형의 Blob을 복사할 수 있는 많은 시나리오가 있습니다. 이 문서의 예는 블록 Blob으로 제한됩니다.

원본 Blob을 대상 Blob에 복사

동일한 스토리지 계정 내에서 간단한 복사 작업을 수행하려면 Copy-AzStorageBlob cmdlet을 사용합니다. 작업이 동일한 스토리지 계정 내에서 Blob을 복사하기 때문에 이는 동기 작업입니다. 계정 간 작업은 비동기입니다.

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

아래 예는 photos 컨테이너에서 archive 컨테이너 내의 photos 폴더로 bannerphoto.png Blob을 복사합니다. 두 컨테이너는 동일한 스토리지 계정 내에 있습니다. 결과를 통해 복사 작업의 성공 여부를 확인합니다.

$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
     -SrcBlob $blobname -DestContainer "archive" `
     -DestBlob $("photos/$blobname") -Context $ctx

AccountName: demostorageaccount, ContainerName: archive

Name                BlobType   Length  ContentType  LastModified          AccessTier  IsDeleted  VersionId
----                --------   ------  -----------  ------------          ----------  ---------  ---------
photos/bannerphoto  BlockBlob  12472   image/png    2021-11-27 23:11:43Z  Cool        False

-Force 매개 변수를 사용하여 대상에서 동일한 이름으로 기존 Blob을 덮어쓸 수 있습니다. 이 작업은 대상 Blob을 효과적으로 대체합니다. 또한 커밋되지 않은 블록을 제거하고 대상 Blob의 메타데이터를 덮어씁니다.

스냅샷을 다른 이름의 대상 Blob에 복사합니다.

복사된 대상 Blob는 쓰기 가능한 Blob이고 스냅샷이 아닙니다.

복사 작업의 원본 Blob은 블록 Blob 또는 추가 Blob, 페이지 Blob 또는 스냅샷일 수 있습니다. 대상 Blob가 이미 있으면 원본 Blob와 동일한 Blob 유형이어야 합니다. 기존 대상 Blob을 덮어씁니다.

복사 작업이 진행 중일 때는 대상 Blob를 수정할 수 없습니다. 대상 Blob은 처리되지 않은 복사 작업을 하나만 포함할 수 있습니다. 즉, Blob은 보류 중인 여러 복사 작업의 대상일 수 없습니다.

동일한 스토리지 계정 내에서 Blob을 복사하는 것은 동기 작업입니다. 계정 간 복사 작업은 비동기입니다.

전체 원본 Blob 또는 파일이 항상 복사됩니다. 바이트 범위 또는 블록 세트 복사는 지원되지 않습니다.

Blob을 복사하면 해당 시스템 속성이 동일 값으로 대상 Blob에 복사됩니다.

비동기 복사 작업을 중단하는 방법도 보여줍니다.

Blob 스냅샷

스냅샷은 특정 시점에 생성된 Blob의 읽기 전용 버전입니다. Blob 스냅샷은 DateTime 값이 URI에 추가된다는 점을 제외하고는 기본 Blob과 동일합니다. 이 값은 스냅샷이 수행된 시간을 나타내며 기본 Blob과 스냅샷을 구분할 수 있는 유일한 방법입니다.

기본 Blob과 연결된 임대는 스냅샷에 영향을 주지 않습니다. 스냅샷에 대한 임대를 얻을 수 없습니다. Blob 스냅샷에 대해 자세히 알아보세요.

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

$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()

Blob 계층 설정

Blob의 계층을 변경할 때는 해당 Blob 및 해당 데이터를 모두 대상 계층으로 이동합니다. 변경하려면 Get-AzStorageBlob cmdlet을 사용하여 Blob을 검색하고 BlobClient.SetAccessTier 메서드를 호출합니다. 이 접근 방식은 , , 보관 사이에서 계층을 변경하는 데 사용할 수 있습니다.

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

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

$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
    $blob.BlobClient.SetAccessTier("Hot")
}

Blob 태그를 사용하는 작업

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

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

<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>

샘플 코드는 해시 테이블을 만들고 여기에 $tags 변수를 할당합니다. 그 다음, Get-ContentGet-Data cmdlet을 사용하여 XML 구조를 기반으로 개체를 만듭니다. 그런 다음, 태그 값으로 사용할 키-값 쌍을 해시 테이블에 추가합니다. 마지막으로 XML 개체를 통해 반복하고 각 File 노드에 대한 태그를 만듭니다.

#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags     = @{}

#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
 
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
    #break the path: container name, blob
    $path = $_.Path -split "/",2
   
    #set apply the blob tags
    Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
 }

Blob 삭제

Remove-AzStorageBlob cmdlet을 사용하여 단일 Blob 또는 일련의 Blob을 삭제할 수 있습니다. 여러 Blob을 삭제할 때 아래 예제와 같이 조건부 작업, 루프 또는 PowerShell 파이프라인을 활용할 수 있습니다.

Warning

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

#Create variables
$containerName  = "mycontainer"
$blobName       = "demo-file.txt"
$prefixName     = "file"

#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx

#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) { 
    Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
} 

#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob

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

다음 예를 사용하여 컨테이너의 연결된 보존 기간 내에 삭제된 Blob 목록을 검색합니다. 결과에는 최근에 삭제된 Blob 목록이 표시됩니다.

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

삭제된 Blob 복원

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

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

다음 코드 샘플은 일시 삭제된 모든 Blob을 복원하거나 버전 관리가 사용하도록 설정된 경우 최신 버전의 Blob을 복원합니다. 먼저 Get-AzStorageBlobServiceProperty cmdlet에서 버전 관리가 사용되는지 여부를 확인합니다.

버전 관리가 사용하도록 설정된 경우 Get-AzStorageBlob cmdlet은 고유하게 명명된 모든 Blob 버전 목록을 검색합니다. 다음으로, 목록의 Blob 버전을 검색하고 날짜별로 정렬합니다. LatestVersion 특성 값이 있는 버전을 찾을 수 없는 경우 Copy-AzBlob cmdlet을 사용하여 최신 버전의 활성 복사본을 만듭니다.

버전 관리가 비활성화된 경우 BlobBaseClient.Undelete 메서드는 컨테이너에서 일시 삭제된 각 Blob을 복원하는 데 사용됩니다.

이 예를 따르기 전에 스토리지 계정 중 하나 이상에서 일시 삭제 또는 버전 관리를 사용하도록 설정해야 합니다.

Important

다음 예제에서는 Blob 그룹을 열거하고 처리하기 전에 메모리에 저장합니다. 버전 관리를 사용하도록 설정하면 Blob도 정렬됩니다. $maxCount 변수와 함께 -ContinuationToken 매개 변수를 사용하면 리소스를 절약하기 위해 그룹 내의 Blob 수가 제한됩니다. 컨테이너에 수백만 개의 Blob이 있는 경우 비용이 매우 많이 듭니다. $maxCount 변수 값을 조정할 수 있지만 컨테이너에 수백만 개의 Blob이 있는 경우 스크립트는 Blob을 느리게 처리합니다.

일시 삭제 데이터 보호 옵션에 대한 자세한 내용은 Blob 일시 삭제 문서를 참조하세요.

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

다음 단계