Azure S3 (Object Storage) Support Development - cloud-barista/cb-spider GitHub Wiki
Azure S3 (Object Storage) Support Development
1. ๊ฐ์
CB-Spider์ S3 Manager์ Azure Blob Storage ์ง์์ ์ถ๊ฐํ์๋ค.
๊ธฐ์กด AWS, GCP, IBM ๋ฑ์ S3 ํธํ API(minio-go)๋ฅผ ์ฌ์ฉํ์ง๋ง, Azure๋ S3 ํธํ API๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก Azure Go SDK(azblob)๋ฅผ ์ด์ฉํ Native ๊ตฌํ ๋ฐฉ์์ ์ฑํํ์๋ค.
์ค๊ณ ์์น
- GCP Native SDK ์ฒ๋ฆฌ ํจํด(Versioning/CORS/Force ๋ถ๊ธฐ)์ ํ์ฅํ์ฌ ์ ๊ธฐ๋ฅ Azure Native ๋ถ๊ธฐ
- ๊ธฐ์กด minio-go ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ,
connInfo.ProviderName == "AZURE" ๋ถ๊ธฐ๋ก Azure ์ ์ฉ ํจ์ ํธ์ถ
- Azure ์ ์ฉ ๋ก์ง์ ๋ณ๋ ํ์ผ(
S3Manager_azure.go)์ ๋ถ๋ฆฌ
- CB-Spider๊ฐ ์ ๊ณตํ๋ 3๊ฐ์ง API ๊ท๊ฒฉ(CB Standard JSON, AWS-compatible XML with Basic Auth, AWS-compatible XML with SigV4) ๋ชจ๋ ๋์ผํ๊ฒ ์ง์
2. Azure โ S3 ๊ฐ๋
๋งคํ
| S3 ๊ฐ๋
|
Azure ๊ตฌํ |
๋น๊ณ |
| Bucket |
Container |
์ด๋ฆ ๊ท์น: ์๋ฌธ์, 3-63์, ํ์ดํ ํ์ฉ |
| Object |
Blob |
Block Blob ๊ธฐ๋ฐ |
| Multipart Upload |
Block Blob (StageBlock/CommitBlockList) |
Upload ID๋ xid๋ก ์์ฒด ์์ฑ |
| Presigned URL |
SAS (Shared Access Signature) Token URL |
sas.BlobSignatureValues ๊ธฐ๋ฐ |
| Versioning |
Storage Account ๋ ๋ฒจ (ARM API) |
๊ฐ๋ณ Bucket ๋จ์ ์ค์ ๋ถ๊ฐ |
| CORS |
Storage Account ๋ ๋ฒจ (Service Properties) |
๊ฐ๋ณ Bucket ๋จ์ ์ค์ ๋ถ๊ฐ |
| Delete Marker |
๋ฏธ์ง์ |
Azure๋ Soft Delete ์ฌ์ฉ |
| AccessKey / SecretKey |
StorageAccountName / StorageAccountKey |
|
3. ์ธ์ฆ ์ ๋ณด ๋งคํ
Data Plane (Blob ์กฐ์)
| S3ConnectionInfo ํ๋ |
Azure Credential ์์ค |
๊ฐ ์์ |
AccessKey |
S3AccessKey ๋๋ StorageAccountName |
mystorageaccount |
SecretKey |
S3SecretKey ๋๋ StorageAccountKey |
base64encodedkey== |
Endpoint |
์๋ ์์ฑ |
mystorageaccount.blob.core.windows.net |
UseSSL |
ํญ์ true |
HTTPS ๊ฐ์ |
Region |
Connection Config์์ ์ ๋ฌ |
ํ์ ์๋ |
Management Plane (Versioning ๋ฑ ARM API)
ARM ์์
(Versioning Enable/Suspend/Get)์๋ Service Principal ์ธ์ฆ์ด ํ์ํ๋ฉฐ, ๋์ผ Connection Config์ Credential์์ ๊ฐ์ ธ์จ๋ค:
| ํ๋ |
Credential Key |
SubscriptionId |
SubscriptionId |
TenantId |
TenantId |
ClientId |
ClientId |
ClientSecret |
ClientSecret |
StorageAccountName |
S3AccessKey ๋๋ StorageAccountName |
4. ๋ณ๊ฒฝ ํ์ผ ๋ชฉ๋ก
| ํ์ผ |
๋ณ๊ฒฝ ์ ํ |
์ค๋ช
|
api-runtime/common-runtime/S3Manager_azure.go |
์ ๊ท |
Azure ์ ์ฉ S3 ๊ธฐ๋ฅ ๊ตฌํ (37๊ฐ ํจ์, ~1,350์ค) |
api-runtime/common-runtime/S3Manager.go |
์์ |
32๊ฐ ํจ์์ AZURE ๋ถ๊ธฐ ์ถ๊ฐ + GetS3ConnectionInfo์ AZURE case ์ถ๊ฐ |
go.mod |
์์ |
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 ์์กด์ฑ ์ถ๊ฐ |
go.sum |
์์ |
์๋ ๊ฐฑ์ |
5. ๊ตฌํ ํจ์ ๋ชฉ๋ก (S3Manager_azure.go)
Client Helper
| ํจ์ |
์ค๋ช
|
newAzureBlobClient |
SharedKeyCredential ๊ธฐ๋ฐ Azure Blob ํด๋ผ์ด์ธํธ ์์ฑ |
getAzureManagementInfo |
Connection Config์์ ARM์ฉ SP ์ธ์ฆ ์ ๋ณด ์ถ์ถ |
getAzureResourceGroup |
Storage Account๊ฐ ์ํ Resource Group ์๋ ํ์ |
azureBlockID |
Multipart์ฉ Base64 Block ID ์์ฑ (uploadID prefix + part number) |
stripAzureETagQuotes |
Azure ETag์์ ๋ฐ์ดํ ์ ๊ฑฐ |
Bucket (Container) ์์
| ํจ์ |
์ค๋ช
|
createAzureBucket |
Container ์์ฑ |
listAzureBuckets |
Container ๋ชฉ๋ก ์กฐํ โ []*minio.BucketInfo |
listAzureBucketsWithIID |
Container ๋ชฉ๋ก + IID ์ ๋ณด ์กฐํ |
getAzureBucket |
๋จ์ผ Container ์ ๋ณด ์กฐํ |
deleteAzureBucket |
Container ์ญ์ |
Object (Blob) ์์
| ํจ์ |
์ค๋ช
|
listAzureObjects |
Container ๋ด Blob ๋ชฉ๋ก ์กฐํ (prefix ํํฐ) |
azureBlobItemToObjectInfo |
Azure BlobItem โ minio.ObjectInfo ๋ณํ |
getAzureObjectInfo |
Blob ์์ฑ ์กฐํ (ํฌ๊ธฐ, ETag, ContentType, VersionID) |
getAzureObjectInfoWithVersion |
ํน์ ๋ฒ์ Blob ์์ฑ ์กฐํ |
deleteAzureObject |
Blob ์ญ์ |
deleteAzureObjectVersion |
ํน์ ๋ฒ์ Blob ์ญ์ |
deleteMultipleAzureObjects |
๋ค์ Blob ์์ฐจ ์ญ์ |
deleteMultipleAzureObjectVersions |
๋ค์ ๋ฒ์ Blob ์์ฐจ ์ญ์ |
Stream ์์
| ํจ์ |
์ค๋ช
|
getAzureObjectStream |
Blob ๋ค์ด๋ก๋ โ io.ReadCloser |
getAzureObjectStreamWithVersion |
ํน์ ๋ฒ์ Blob ๋ค์ด๋ก๋ |
putAzureObject |
Blob ์
๋ก๋ (UploadStream) |
getAzureBucketTotalSize |
Container ์ ์ฒด ํฌ๊ธฐ ๊ณ์ฐ |
Multipart (Block Blob) ์์
| ํจ์ |
์ค๋ช
|
initiateAzureMultipartUpload |
Upload ID ์์ฑ (xid ๊ธฐ๋ฐ, Azure๋ ๋ช
์์ initiation ๋ถํ์) |
uploadAzurePart |
Block ์คํ
์ด์ง (StageBlock) |
completeAzureMultipartUpload |
Block List ์ปค๋ฐ (CommitBlockList) |
abortAzureMultipartUpload |
No-op (Azure๋ 7์ผ ํ ์๋ ์ ๋ฆฌ) |
listAzureParts |
Uncommitted Block ๋ชฉ๋ก ์กฐํ (GetBlockList) |
Versioning (ARM Management Plane)
| ํจ์ |
์ค๋ช
|
enableAzureVersioning |
Storage Account ๋ ๋ฒจ Versioning ํ์ฑํ |
suspendAzureVersioning |
Storage Account ๋ ๋ฒจ Versioning ๋นํ์ฑํ |
getAzureVersioning |
Versioning ์ํ ์กฐํ |
listAzureObjectVersions |
Container ๋ด Blob ๋ฒ์ ๋ชฉ๋ก ์กฐํ |
CORS (Service Properties)
| ํจ์ |
์ค๋ช
|
setAzureBucketCORS |
CORS ๊ท์น ์ค์ (Storage Account ๋ ๋ฒจ) |
getAzureBucketCORS |
CORS ๊ท์น ์กฐํ โ *cors.Config |
deleteAzureBucketCORS |
CORS ๊ท์น ์ญ์ (๋น ๊ท์น ์ค์ ) |
Presigned URL (SAS)
| ํจ์ |
์ค๋ช
|
getAzurePresignedURL |
GET(Read) ๋๋ PUT(Write/Create) SAS URL ์์ฑ |
Force ์์
| ํจ์ |
์ค๋ช
|
forceEmptyAzureBucket |
๋ชจ๋ Blob(๋ฒ์ ํฌํจ) ๊ฐ์ ์ญ์ |
forceEmptyAndDeleteAzureBucket |
๊ฐ์ ๋น์ฐ๊ธฐ + Container ์ญ์ + DB ๋ฉํ๋ฐ์ดํฐ ์ ๋ฆฌ |
6. ์ฌ์ฉ๋ Azure SDK ๋ชจ๋
| ๋ชจ๋ |
๋ฒ์ |
์ฉ๋ |
azure-sdk-for-go/sdk/storage/azblob |
v1.5.0 |
Blob Storage ๋ฐ์ดํฐ ํ๋ ์ธ (์ ๊ท ์ถ๊ฐ) |
azure-sdk-for-go/sdk/resourcemanager/storage/armstorage |
v1.8.0 |
Storage Account ARM ๊ด๋ฆฌ (๊ธฐ์กด) |
azure-sdk-for-go/sdk/azcore |
v1.18.0 |
Core SDK, to.Ptr(), streaming.NopCloser (๊ธฐ์กด) |
azure-sdk-for-go/sdk/azidentity |
v1.10.1 |
Service Principal ์ธ์ฆ (๊ธฐ์กด) |
7. CSP๋ณ S3 ๊ธฐ๋ฅ ์ง์ ํํฉ ๋น๊ตํ
| ๊ธฐ๋ฅ |
AWS |
GCP |
Azure |
IBM |
Alibaba |
Tencent |
OpenStack |
NHN |
NCP |
KT |
| Bucket CRUD |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Object CRUD |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Object Stream |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Multipart Upload |
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
| ListMultipartUploads |
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
| Presigned URL |
โ
|
โ
|
โ
(SAS) |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Versioning |
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
โ |
โ |
โ |
โ
|
| CORS |
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
โ
|
โ |
โ |
โ
|
| Delete Marker |
โ
|
โ
|
โ |
โ
|
โ
|
โ
|
โ |
โ |
โ |
โ
|
| Delete Multiple |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Force Empty |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
| Force Empty+Delete |
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ
|
โ = ๋ฏธ์ง์ (ํด๋น CSP ๊ตฌ์กฐ์ ์ ์ฝ)
8. Azure์์ ์ ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ (๋น์ง์ ์ฌํญ)
8.1 Delete Markers (DeleteS3ObjectDeleteMarker)
- ์ฌ์ : Azure Blob Storage๋ S3 ์คํ์ผ Delete Marker๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- Azure ๋ฐฉ์: Soft Delete๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ญ์ ๋ blob์ ์ค์ ๋ ๋ณด์กด ๊ธฐ๊ฐ(retention period) ์ดํ ์๋ ์ ๊ฑฐ๋๋ค.
- ์ฒ๋ฆฌ:
"delete markers are not supported by Azure Blob Storage" ์๋ฌ ๋ฐํ (HTTP 501)
8.2 Multipart Upload (์ ์ฒด)
- ์ฌ์ : Azure Block Blob์ uncommitted blocks๋ฅผ 7์ผ ํ ์๋ ์ ๋ฆฌํ๋ฉฐ, ์งํ ์ค์ธ multipart upload ๋ชฉ๋ก์ ์กฐํํ๋ API(
ListMultipartUploads)๊ฐ ์๋ค. ๋ชฉ๋ก ์กฐํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉด ์
๋ก๋ ์ํ ๊ด๋ฆฌ๊ฐ ๋ถ์์ ํ๋ฏ๋ก Multipart Upload ์ ์ฒด๋ฅผ ๋ฏธ์ง์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- ์ํฅ ํจ์:
InitiateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload, ListParts, ListMultipartUploads
- ์ฒ๋ฆฌ:
"multipart upload is not supported by ..." ์๋ฌ ๋ฐํ (HTTP 501)
- ๋์: ๋จ์ผ ์
๋ก๋(
PUT /bucket/object)๋ฅผ ์ฌ์ฉํ๋ค.
8.3 Versioning (EnableVersioning, SuspendVersioning, GetVersioning, ListObjectVersions, DeleteObjectVersion)
- ์ฌ์ : Azure Blob Storage์ Versioning์ Storage Account ์ ์ฒด์ ์ ์ฉ๋๋ฉฐ, ๊ฐ๋ณ Container(Bucket) ๋จ์๋ก ์ ์ดํ ์ ์๋ค. S3 API๋ Bucket ๋จ์ Versioning์ ์ ์ ๋ก ํ๋ฏ๋ก ํธํ๋์ง ์๋๋ค.
- ์ฒ๋ฆฌ:
"bucket versioning is not supported by ..." ์๋ฌ ๋ฐํ (HTTP 501)
8.4 CORS (SetBucketCORS, GetBucketCORS, DeleteBucketCORS)
- ์ฌ์ : Azure์ CORS ์ค์ ์ Storage Account ์ ์ฒด์ ์ ์ฉ๋๋ฉฐ, ๊ฐ๋ณ Container(Bucket) ๋จ์๋ก ๊ฒฉ๋ฆฌํ ์ ์๋ค. S3 API๋ Bucket ๋จ์ CORS๋ฅผ ์ ์ ๋ก ํ๋ฏ๋ก ํธํ๋์ง ์๋๋ค.
- ์ฒ๋ฆฌ:
"CORS configuration is not supported by ..." ์๋ฌ ๋ฐํ (HTTP 501)
9. Presigned URL (SAS Token) ๊ตฌํ
Azure์ SAS(Shared Access Signature)๋ฅผ ์ด์ฉํ์ฌ S3 Presigned URL๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค:
| HTTP Method |
SAS Permission |
์ค๋ช
|
GET |
Read |
Blob ๋ค์ด๋ก๋ |
PUT |
Write + Create |
Blob ์
๋ก๋ |
์์ฑ๋ URL ํ์:
https://{storageAccount}.blob.core.windows.net/{container}/{blob}?{sasToken}
11. ์ฌ์ ์๊ตฌ์ฌํญ
Azure Credential ์ค์
CB-Spider์์ Azure S3๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ Credential์ด ํ์ํ๋ค:
{
"CredentialName": "azure-s3-credential",
"ProviderName": "AZURE",
"KeyValueInfoList": [
{"Key": "SubscriptionId", "Value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},
{"Key": "TenantId", "Value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},
{"Key": "ClientId", "Value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},
{"Key": "ClientSecret", "Value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},
{"Key": "StorageAccountName", "Value": "mystorageaccount"},
{"Key": "StorageAccountKey", "Value": "base64encodedkey=="}
]
}
StorageAccountName/StorageAccountKey ๋์ S3AccessKey/S3SecretKey ํค ์ด๋ฆ๋ ์ฌ์ฉ ๊ฐ๋ฅ
ํ์ Azure ๊ถํ
| ์์
์ ํ |
ํ์ ๊ถํ |
| Blob ๋ฐ์ดํฐ ์กฐ์ (CRUD, Stream, Multipart) |
Storage Account Key (SharedKey ์ธ์ฆ) |
| Versioning Enable/Suspend/Get |
Service Principal + Storage Account Contributor ์ด์ |
| Resource Group ํ์ |
Service Principal + Reader ์ด์ (๊ตฌ๋
๋ฒ์) |