Share via


PowerShell을 사용하여 Blob 컨테이너 관리

Azure Blob Storage를 사용하면 많은 양의 비정형 개체 데이터를 저장할 수 있습니다. Blob Storage를 사용하여 미디어, 콘텐츠 또는 애플리케이션 데이터를 수집하거나 사용자에게 노출할 수 있습니다. 모든 Blob 데이터는 컨테이너 내에 저장되므로 데이터 업로드를 시작하기 전에 스토리지 컨테이너를 만들어야 합니다. Blob Storage에 대해 자세히 알아보려면 Azure Blob Storage 소개를 읽어보세요.

이 방법 문서에서는 개별 및 다중 스토리지 컨테이너 개체로 작업하는 방법을 설명합니다.

필수 구성 요소

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

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

이 문서의 예제를 사용하려면 먼저 Azure 구독에 대한 권한을 얻어야 합니다. 권한 부여는 Microsoft Entra 계정으로 권한 부여하거나 공유 키를 사용하여 발생할 수 있습니다. 이 문서의 예제에서는 컨텍스트 개체와 함께 Microsoft Entra 인증을 사용합니다. 컨텍스트 개체는 Microsoft Entra 자격 증명을 캡슐화하고 후속 데이터 작업에 전달하므로 재인증할 필요가 없습니다.

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

# Connect to your Azure subscription
 Connect-AzAccount

연결이 설정되면 New-AzStorageContext cmdlet을 호출하여 스토리지 계정 컨텍스트를 만듭니다. Microsoft Entra 자격 증명을 사용하여 데이터 작업이 수행되도록 -UseConnectedAccount 매개 변수를 포함합니다.

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

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

컨테이너 만들기

PowerShell로 컨테이너를 만들려면 New-AzStorageContainer cmdlet을 호출합니다. 스토리지 계정 내에서 만들 수 있는 Blob 또는 컨테이너 수에는 제한이 없습니다. 컨테이너는 다른 컨테이너 내에 중첩될 수 없습니다.

다음 예에서는 New-AzStorageContainer cmdlet을 사용하여 Blob 컨테이너를 만드는 세 가지 옵션을 보여 줍니다. 첫 번째 접근 방식은 단일 컨테이너를 만드는 반면 나머지 두 가지 접근 방식은 PowerShell 작업을 활용하여 컨테이너 만들기를 자동화합니다.

이 예제를 사용하려면 변수에 대한 값을 제공하고 Azure 구독에 대한 연결을 만들었는지 확인합니다. 대괄호의 자리 표시자 값을 사용자 고유의 값으로 바꿔야 합니다.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop"

# Approach 1: Create a container
 New-AzStorageContainer -Name $containerName -Context $ctx

# Approach 2: Create containers with a PowerShell loop
 for ($i = 1; $i -le 3; $i++) { 
     New-AzStorageContainer -Name (-join($prefixName, $i)) -Context $ctx
    } 

# Approach 3: Create containers using the PowerShell Split method
 "$($prefixName)4 $($prefixName)5 $($prefixName)6".split() | New-AzStorageContainer -Context $ctx

결과는 스토리지 계정의 이름을 제공하고 새 컨테이너 만들기를 확인합니다.

Storage Account Name: demostorageaccount

Name                   PublicAccess   LastModified
----                   ------------   ------------
individual-container   Off            11/2/2021 4:09:05 AM +00:00
loop-container1        Off            11/2/2021 4:09:05 AM +00:00
loop-container2        Off            11/2/2021 4:09:05 AM +00:00
loop-container3        Off            11/2/2021 4:09:05 AM +00:00           
loop-container4        Off            11/2/2021 4:09:05 AM +00:00           
loop-container5        Off            11/2/2021 4:09:05 AM +00:00           
loop-container6        Off            11/2/2021 4:09:05 AM +00:00          

컨테이너 나열

Get-AzStorageContainer cmdlet을 사용하여 스토리지 컨테이너를 검색합니다. 단일 컨테이너를 검색하려면 -Name 매개 변수를 포함합니다. 지정된 문자열로 시작하는 컨테이너 목록을 반환하려면 -Prefix 매개 변수의 값을 지정합니다.

다음 예에서는 개별 컨테이너와 컨테이너 리소스 목록을 모두 검색합니다.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Approach 1: Retrieve an individual container
 Get-AzStorageContainer -Name $containerName -Context $ctx
 Write-Host

# Approach 2: Retrieve a list of containers
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx

결과는 Blob 엔드포인트의 URI를 제공하고 이름 및 접두사로 검색된 컨테이너를 나열합니다.

   Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
individual-container                      11/2/2021 5:52:08 PM +00:00                                

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00                               

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00
loop-container3                           11/2/2021 12:22:00 AM +00:00   True       01D7E7129FDBD7D4
loop-container4                           11/2/2021 12:22:00 AM +00:00   True       01D7E8A5EF01C787 

컨테이너 속성 및 메타데이터 읽기

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

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

컨테이너 속성

다음 예제에서는 demo 접두사가 있는 모든 컨테이너를 검색하고 속성을 나열하여 컨테이너를 반복합니다.

# Create variable
 $prefix = "loop"

# Get containers
 $containers = Get-AzStorageContainer -Prefix $prefix -Context $ctx

# Iterate containers, display properties
 Foreach ($container in $containers) 
 {
    $containerProperties = $container.BlobContainerClient.GetProperties()
    Write-Host $container.Name "properties:"
    $containerProperties.Value
 }

결과는 접두어가 loop인 모든 컨테이너를 표시하고 해당 속성을 나열합니다.

loop-container1 properties:

LastModified                      : 12/7/2021 7:47:17 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA602806DA
Metadata                          : {}
HasImmutableStorageWithVersioning : False

loop-container2 properties:
LastModified                      : 12/7/2021 7:47:18 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA605996AE
Metadata                          : {}
HasImmutableStorageWithVersioning : False

컨테이너 메타데이터 읽기 및 쓰기

스토리지 계정에 수천 개의 개체가 있는 사용자는 메타데이터를 기반으로 특정 컨테이너를 빠르게 찾을 수 있습니다. 메타데이터에 액세스하려면 BlobContainerClient 개체를 사용합니다. 이 개체를 사용하면 컨테이너와 해당 blob에 액세스하고 조작할 수 있습니다. 메타데이터를 업데이트하려면 SetMetadata() 메서드를 호출해야 합니다. 이 메서드는 일반 IDictionary 개체에 저장된 키-값 쌍만 수락합니다. 자세한 내용은 BlobContainerClient 클래스를 참조하세요.

아래 예제에서는 먼저 컨테이너의 메타데이터를 업데이트한 다음 컨테이너의 메타데이터를 검색합니다. 이 예제에서는 메모리에서 샘플 컨테이너를 플러시하고 다시 검색하여 메모리의 개체에서 메타데이터를 읽지 않도록 합니다.

# Create variable
  $containerName = "individual-container"

# Retrieve container
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx

# Create IDictionary, add key-value metadata pairs to IDictionary
 $metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
 $metadata.Add("CustomerName","Anthony Bennedetto")
 $metadata.Add("CustomerDOB","08/03/1926")
 $metadata.Add("CustomerBirthplace","Long Island City")

# Update metadata
  $container.BlobContainerClient.SetMetadata($metadata, $null)

# Flush container from memory, retrieve updated container
 $container = $null
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx
 
# Display metadata
 $properties = $container.BlobContainerClient.GetProperties()
 Write-Host $container.Name "metadata:" 
 Write-Host $properties.Value.Metadata

결과는 컨테이너에 대한 전체 메타데이터를 표시합니다.

individual-container metadata:

[CustomerName, Anthony Bennedetto] [CustomerDOB, 08/03/1926] [CustomerBirthplace, Long Island City]

컨테이너에 대한 공유 액세스 서명 가져오기

SAS(공유 액세스 서명)는 Azure 리소스에 대한 위임된 액세스를 제공합니다. SAS를 사용하면 클라이언트가 데이터에 액세스하는 방법을 세부적으로 제어할 수 있습니다. 예를 들어 클라이언트가 사용할 수 있는 리소스를 지정할 수 있습니다. 클라이언트가 수행할 수 있는 작업 유형을 제한하고 작업을 수행할 수 있는 시간을 지정할 수도 있습니다.

SAS는 일반적으로 권한이 없는 클라이언트에게 임시 및 보안 액세스를 제공하는 데 일반적으로 사용됩니다. 이 시나리오의 예로는 사용자가 스토리지 계정에 대한 자신의 데이터를 읽고 쓸 수 있는 서비스가 있습니다.

Azure Storage는 사용자 위임, 서비스 및 계정 SAS의 세 가지 유형의 공유 액세스 서명을 지원합니다. 공유 액세스 서명에 대한 자세한 내용은 컨테이너 또는 Blob에 대한 서비스 SAS 만들기 문서를 참조하세요.

주의

유효한 SAS를 소유한 클라이언트는 해당 SAS에서 허용한 스토리지 계정의 데이터에 액세스할 수 있습니다. 악의적이거나 의도하지 않은 사용으로부터 SAS를 보호하는 것이 중요합니다. SAS 배포는 신중해야 하고, 손상된 SAS를 철회하는 계획을 세워야 합니다.

다음 예제는 New-AzStorageContainerSASToken cmdlet을 사용하여 특정 컨테이너에 대한 서비스 SAS를 구성하는 프로세스를 보여 줍니다. 이 예제에서는 시작 및 만료 시간과 프로토콜을 사용하여 SAS를 구성합니다. 또한 -Permission 매개 변수를 사용하여 SAS에서 읽기, 쓰기목록 권한을 지정합니다. 서비스 SAS 만들기 문서에서 전체 권한 표를 참조할 수 있습니다.

# Create variables
 $accountName   = "<storage-account>"
 $containerName = "individual-container"
 $startTime     = Get-Date
 $expiryTime    = $startTime.AddDays(7)
 $permissions   = "rwl"
 $protocol      = "HttpsOnly"

# Create a context object using Azure AD credentials, retrieve container
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount
 
# Approach 1: Generate SAS token for a specific container
 $sas = New-AzStorageContainerSASToken `
 -Context $ctx `
 -Name $containerName `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol

# Approach 2: Generate SAS tokens for a container list using pipeline
  Get-AzStorageContainer -Container $filterName -Context $ctx | New-AzStorageContainerSASToken `
 -Context $ctx `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol | Write-Output

참고 항목

Blob Storage에서 반환된 SAS 토큰에는 URL 쿼리 문자열의 구분 기호 문자(‘?’)가 포함되지 않습니다. 리소스 URL에 SAS 토큰을 추가하는 경우 구분 기호 문자도 추가해야 합니다.

컨테이너 삭제

사용 사례에 따라 Remove-AzStorageContainer cmdlet을 사용하여 컨테이너 또는 컨테이너 목록을 삭제할 수 있습니다. 컨테이너 목록을 삭제할 때 아래 예제와 같이 조건부 작업, 루프 또는 PowerShell 파이프라인을 활용할 수 있습니다.

# Create variables
 $accountName    = "<storage-account>"
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Delete a single named container
 Remove-AzStorageContainer -Name $containerName -Context $ctx

# Iterate a loop, deleting containers
 for ($i = 1; $i -le 2; $i++) { 
     Remove-AzStorageContainer -Name (-join($containerPrefix, $i)) -Context $ctx
    } 

# Retrieve container list, delete using a pipeline
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx | Remove-AzStorageContainer

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

다음 예제를 사용하여 스토리지 계정의 연결된 보존 기간 내에 삭제된 컨테이너 목록을 검색합니다.

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

일시 삭제된 컨테이너 복원

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

다음 예제에서는 Restore-AzStorageContainer cmdlet을 사용하여 일시 삭제된 컨테이너를 복원하는 방법을 설명합니다. 이 예제를 따르기 전에 일시 삭제를 사용하도록 설정하고 스토리지 계정 중 하나 이상에서 구성해야 합니다.

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

# Create variables
 $accountName = "<storage-account>"
 $prefixName  = "loop-"

# Create a context object using Azure AD credentials
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Retrieve all containers, filter deleted containers, restore deleted containers
 Get-AzStorageContainer -Prefix $prefixName -IncludeDeleted `
    -Context $ctx | ? { $_.IsDeleted } | Restore-AzStorageContainer

결과에는 복원된 demo 접두사가 있는 모든 컨테이너가 표시됩니다.

    Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
loop-container3                                                                                       
loop-container4               

참고 항목