Azure Blob Storage에서 Blob 또는 블록 콘텐츠 업로드 실패
이 문서에서는 클라우드 애플리케이션과 함께 Microsoft Azure Blob Storage를 사용하여 Blob을 업로드하거나 콘텐츠를 차단할 때 발생할 수 있는 오류를 해결하는 방법을 설명합니다.
필수 조건
- 다음 스토리지 서비스 중 하나의 스토리지 계정:
- Azure Storage SDK
- Azure Storage Explorer
- PowerShell
증상
다음 오류 메시지 중 하나가 표시됩니다.
오류 코드 | 오류 메시지 |
---|---|
BlockCountExceedsLimit |
"커밋되지 않은 블록 수는 최대 100,000개 블록을 초과할 수 없습니다." |
InvalidBlobOrBlock |
"지정된 Blob 또는 블록 콘텐츠가 잘못되었습니다." |
InvalidBlock 또는 InvalidBlockList |
"지정된 블록 목록이 잘못되었습니다." |
원인 1: 블록 배치 호출에 지정된 블록 길이가 잘못되었습니다.
Put Block URI 요청에 지정된 블록 길이는 다음 이유 중 하나 이상에 대해 유효하지 않습니다.
애플리케이션 또는 클라이언트가 지원되지 않는 블록 크기를 지정했습니다.
블록의 크기가 허용되는 최대 블록 크기보다 큽다. 다른 버전의 Blob Service REST API에 대한 블록 크기 제한을 찾으려면 "블록 배치" 참조 문서의 설명 섹션을 참조하세요.
둘 이상의 애플리케이션을 사용하여 데이터 블록을 업로드하려고 할 때 블록 길이가 일관되지 않은 커밋되지 않은 블록이 있었습니다. 이 상황은 다른 애플리케이션이 데이터를 업로드하는 데 다른 길이를 사용하거나 이전 업로드가 실패했기 때문에 발생합니다.
이전 업로드 작업이 취소되었으므로 Blob에 커밋되지 않은 블록이 너무 많습니다. Blob과 연결할 수 있는 커밋되지 않은 블록의 최대 수는 100,000개입니다.
이러한 솔루션 중 하나를 구현하여 커밋되지 않은 블록을 제거합니다.
해결 방법 1: 가비지 수집이 커밋되지 않은 데이터를 선택할 때까지 기다립니다.
커밋되지 않은 블록 목록이 가비지 수집에 의해 정리될 때까지 7일 동안 기다립니다.
해결 방법 2: 더미 Blob을 사용하여 데이터 전송
Azure Storage SDK를 사용하여 더미 Blob을 사용하여 데이터를 전송합니다. 이렇게 하려면 다음 단계를 수행하세요.
Blob 이름이 동일하고 동일한 컨테이너에 있는 더미 Blob을 만듭니다. 이 Blob의 길이는 0일 수 있습니다.
차단 해제된 전송을 사용하여 Blob을 전송합니다.
솔루션 3: Azure Storage SDK를 사용하여 커밋되지 않은 블록 목록 커밋
Azure Storage SDK를 사용하여 커밋되지 않은 블록 목록을 커밋하고 Blob을 정리합니다. 이렇게 하려면 다음 단계를 수행하세요.
URI 매개 변수가 설정된 블록 목록 가져오기 URI 요청을 만들어 커밋되지 않은 블록 목록을 검색합니다
uncommitted
.blocklisttype
블록 목록 배치 URI 요청을 사용하여 차단 목록을 커밋합니다.
Blob을 삭제합니다.
다음 PowerShell 함수는 커밋되지 않은 블록 목록을 검색한 다음 삭제하는 방법의 예입니다. 함수에는 다음 매개 변수가 필요합니다.
매개 변수 이름 | 설명 |
---|---|
-StorageAccountName |
스토리지 계정 이름입니다. |
-SharedAccessSignature |
URI 매개 변수 <ss=b;srt=sco;sp=rwldc> 를 사용하는 SAS(공유 액세스 서명) 토큰입니다. 이러한 매개 변수는 계정 SAS URI 생성에 설명되어 있습니다. |
-ContainerName |
스토리지 컨테이너의 이름입니다. |
-BlobName |
Blob의 이름입니다. |
[CmdletBinding()] Param(
[Parameter(Mandatory=$true, Position=1)] [string] $StorageAccountName,
[Parameter(Mandatory=$True, Position=1)] [string] $SharedAccessSignature,
[Parameter(Mandatory=$True, Position=1)] [string] $ContainerName,
[Parameter(Mandatory=$True, Position=1)] [string] $BlobName
)
# Build the URI strings in the REST API for GET and DELETE.
$uriDelete = (
"https://$StorageAccountName.blob.core.windows.net/",
"$ContainerName",
"/",
"$BlobName",
"$SharedAccessSignature"
) -Join ""
$uriGet = (
"$uriDelete",
"&comp=blocklist",
"&blocklisttype=uncommitted"
) -Join ""
Write-Host "The Delete URI is $uriDelete."
Write-Host "The Get URI is $uriGet."
# Make a REST API call to get the uncommitted block list.
$listFileURI = Invoke-WebRequest -Uri $uriGet -Method Get
$FileSystemName = $listFileURI.Content
$String = $FileSystemName -replace '' , ''
$String |
Select-Xml –XPath "/BlockList/UncommittedBlocks/Block" |
Select-Object -Expand Node
$Count = $String.Count
# Delete the blob and the uncommitted block.
if ($Count.Count -gt 0) {
$listFileURI1 = Invoke-WebRequest -Uri $uriDelete -Method Delete
$FileSystemName1 = $listFileURI1.StatusCode
Write-Host "The deletion was successful. The API returned status code $FileSystemName1."
}
Write-Host "Check whether the uncommitted blocks are still present."
Try {
$listFileURI2 = Invoke-WebRequest -Uri $uriGet -Method Get
} Catch {
# $err = $_.Exception
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
Write-Host (
"In this error message, we can verify that the",
"uncommitted blocks and their respective blob have been deleted.",
"The name and size of the uncommitted blocks that have been deleted are shown."
)
원인 2: BLOB에 대해 PUT 작업이 동시에 발생합니다.
타이밍 또는 동시성 문제가 발생합니다. 이렇게 하면 단일 Blob에 대해 여러 PUT(Put Block) 작업이 거의 동시에 발생합니다. 블록 목록 배치 작업은 Blob을 구성하는 블록 ID 목록을 지정하여 Blob을 작성합니다. Blob의 일부로 쓰려면 이전 블록 배치 작업에서 블록이 서버에 성공적으로 기록되어야 합니다.
참고 항목
이 오류는 업로드를 시작한 후 커밋하기 전에 동시 업로드 커밋 중에 발생할 수 있습니다. 이 경우 업로드가 실패합니다. 애플리케이션은 오류가 발생할 때 업로드를 다시 시도하거나 필요한 시나리오에 따라 다른 복구 작업을 시도할 수 있습니다.
해결 방법: 임대 사용
낙관적 동시성을 사용하는 대신 Azure Storage SDK 또는 Azure Storage Explorer와 같은 GUI 기반 도구를 사용하여 비관적 동시성(임대)을 구현합니다. 낙관적 및 비관적 동시성에 대한 자세한 내용은 Blob Storage에서 동시성 관리를 참조하세요.
동시성 문제로 인해 오류가 발생하는 경우 원인 1의 솔루션 중 하나를 수행하여 커밋되지 않은 블록을 정리해야 할 수도 있습니다.
도움을 요청하십시오.
질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.