
Python调用Google Bard API 完整指南
MinIO可通过其网关功能为微软Azure Blob存储添加S3兼容性,这使得在不更改客户端代码的情况下,应用能够使用Azure作为其存储后端。MinIO通过实现一个与S3兼容的API网关,将请求转发到Azure Blob存储。此方法不仅降低了迁移成本,还提供了一种灵活的对象存储解决方案。本文探讨了如何使用MinIO和S3Proxy来实现Azure Blob与S3的兼容性,并提供了详细的步骤和配置指南。
MinIO网关通过提供与亚马逊S3兼容的API,将其功能扩展到微软Azure Blob存储,使得用户能够在Azure上享受S3的便利。
Copydocker run -p 9000:9000 --name azure-s3
-e "MINIO_ACCESS_KEY=azureaccountname"
-e "MINIO_SECRET_KEY=azureaccountkey"
minio/minio gateway azure
Copyexport MINIO_ACCESS_KEY=azureaccountname
export MINIO_SECRET_KEY=azureaccountkey
minio gateway azure
MinIO Gateway自带一个嵌入式的网络对象浏览器,通过将您的Web浏览器指向 http://127.0.0.1:9000,您可以检查服务器是否成功启动。
mc
验证mc
提供了诸如ls,cat,cp,mirror,diff等UNIX命令的替代方案,支持文件系统和Amazon S3兼容的云存储服务。
mc
Copymc config host add myazure http://gateway-ip:9000 azureaccountname azureaccountkey
Copymc ls myazure
[2017-02-22 01:50:43 PST] 0B ferenginar/
[2017-02-26 21:43:51 PST] 0B my-container/
[2017-02-26 22:10:11 PST] 0B test-container1/
Minio是一种基于Apache License v2.0协议的对象存储服务,完全兼容亚马逊的S3云储存服务。它非常适合存储非结构化数据,如图片、视频、日志文件、备份数据等。
Minio已经实现了多个Gateway,包括Amazon S3、Google Cloud Storage、Azure Storage等。用户可以通过这些Gateway,将S3兼容的API请求转发到其他类型的对象存储中,如阿里云OSS。
一个Gateway需要实现GatewayLayer接口,如下所示:
// ObjectLayer implements primitives for object API layer.
type ObjectLayer interface {
// Storage operations.
Shutdown() error
StorageInfo() StorageInfo
// Bucket operations.
MakeBucketWithLocation(bucket string, location string) error
GetBucketInfo(bucket string) (bucketInfo BucketInfo, err error)
ListBuckets() (buckets []BucketInfo, err error)
DeleteBucket(bucket string) error
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error)
// Object operations.
GetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error)
GetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error)
PutObject(bucket, object string, data *HashReader, metadata map[string]string) (objInfo ObjectInfo, err error)
CopyObject(srcBucket, srcObject, destBucket, destObject string, metadata map[string]string) (objInfo ObjectInfo, err error)
DeleteObject(bucket, object string) error
// Multipart operations.
ListMultipartUploads(bucket, prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartsInfo, err error)
NewMultipartUpload(bucket, object string, metadata map[string]string) (uploadID string, err error)
CopyObjectPart(srcBucket, srcObject, destBucket, destObject string, uploadID string, partID int, startOffset int64, length int64) (info PartInfo, err error)
PutObjectPart(bucket, object, uploadID string, partID int, data *HashReader) (info PartInfo, err error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListPartsInfo, err error)
AbortMultipartUpload(bucket, object, uploadID string) error
CompleteMultipartUpload(bucket, object, uploadID string, uploadedParts []completePart) (objInfo ObjectInfo, err error)
// Healing operations.
HealBucket(bucket string) error
ListBucketsHeal() (buckets []BucketInfo, err error)
HealObject(bucket, object string) (int, int, error)
ListObjectsHeal(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, error)
ListUploadsHeal(bucket, prefix, marker, uploadIDMarker,
delimiter string, maxUploads int) (ListMultipartsInfo, error)
}
// GatewayLayer - Interface to implement gateway mode.
type GatewayLayer interface {
ObjectLayer
AnonGetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error)
AnonGetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error)
AnonPutObject(bucket string, object string, size int64, data io.Reader, metadata map[string]string, sha256sum string) (ObjectInfo, error)
SetBucketPolicies(string, policy.BucketAccessPolicy) error
GetBucketPolicies(string) (policy.BucketAccessPolicy, error)
DeleteBucketPolicies(string) error
AnonListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error)
AnonListObjectsV2(bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error)
ListObjectsV2(bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error)
AnonGetBucketInfo(bucket string) (bucketInfo BucketInfo, err error)
}
对于不支持的操作,可以使用留桩代码返回 NotImplemented
错误,官方提供了一个 gatewayUnsupported
供参考。
了解接口后,只需将代码适配到接口中即可。阿里云OSS的API风格与AWS S3相似,适配过程相对简单。
编辑(2017-10-23): Pull Request 请看 minio/minio#5103
编辑(2017-12-19): Minio 上游已合并 PR,可直接使用。
最后,要注意Minio结构较为复杂,添加Gateway需修改多个文件。为此,也提交了一个PR: minio/minio#5111
docker run -p 9000:9000 --name azure-s3
-e "MINIO_ACCESS_KEY=azureaccountname"
-e "MINIO_SECRET_KEY=azureaccountkey"
minio/minio gateway azure
请确保用您的Azure账户名称替换azureaccountname
,并用Azure账户密钥替换azureaccountkey
。
http://127.0.0.1:9000
,如果浏览器成功显示MinIO界面,则说明服务器已成功启动。mc
以连接Azure上的MinIO网关?mc
客户端:
mc config host add myazure http://gateway-ip:9000 azureaccountname azureaccountkey
请用您的实际网关IP替换gateway-ip
,用您的Azure账户名称和密钥替换azureaccountname
和azureaccountkey
。
NotImplemented
错误。