Appearance
概述
AWS 的S3接口协议具有广泛的开源工具支持,FOS兼容AWS S3主要常用接口,对于基于S3接口协议开发的各类应用及服务,可以轻松迁移到FOS。 接口的具体兼容情况,在下文中做了详细叙述。 FOS的S3协议接口提供了对象存储的基本功能,为了更好的使用FOS丰富的产品功能,更推荐使用FOS接口。
服务域名
使用如下服务域名通过AWS S3协议访问FOS:
访问Endpoint | 协议 |
---|---|
fos.flymeyun.com | HTTPS |
通过AWS S3协议访问FOS和直接访问FOS类似,也支持path-style和 bucket virtual hosting两种方式,以GetObject举例,两种风格请求语法如下:
风格 | 请求语法 |
---|---|
bucket virtual hosting | GET /object HTTP/1.1 |
Host: bucket.fos.flymeyun.com | |
Path-style | GET /bucket/object HTTP/1.1 |
Host: fos.flymeyun.com |
兼容签名认证
兼容最新的AWS Signature Version 4,签名方法见Authenticating Requests (AWS Signature Version 4)。
签名Header示例
以下是使用S3签名认证方法访问BOS的示例,使用Authorization请求Header提供身份验证信息,具体内容如下:
Authorization: AWS4-HMAC-SHA256
Credential=82fa964ae**********0dfeea44c0683/20230216/US/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=98afff082015a6490a50567b2fa9a0e64f0ae81105a3a62da86bc50806c293fb
注意事项
- AWS4-HMAC-SHA256:用于计算签名的算法,该字符串指定AWS签名版本即AWS4和签名算法HMAC-SHA256。
- Credential:包括用于计算签名的Access Key、日期和服务,格式:<access-key>/<date>/US/s3/aws4_request, 其中<date>使用日期格式为YYYYMMDD
详细说明请参考sigv4-auth-using-authorization-header。
- 签名计算目前仅支持 Transfer Payload in a Single Chunk 和 Transfer Payload in Multiple Chunks。
完整请求示例:
GET / HTTP/1.1
Host: fos.flymeyun.com
Accept-Encoding: identity
User-Agent: Boto3/1.26.72 Python/3.9.6 Darwin/22.1.0 Botocore/1.29.72 Resource
X-Amz-Date: 20230216T025415Z
X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Authorization: AWS4-HMAC-SHA256 Credential=82fa964ae**********0dfeea44c0683/20230216/US/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=98afff082015a6490a50567b2fa9a0e64f0ae81105a3a62da86bc50806c293fb
amz-sdk-invocation-id: d2f1690c-ea14-4298-8bf5-052f797d4b4d
amz-sdk-request: attempt=1
HTTP/1.1 200 OK
Date: Thu, 16 Feb 2023 02:54:16 GMT
Content-Type: application/xml
Content-Length: 9061
Connection: keep-alive
X-Amz-Id-2: vl7FafIEg8tsAO58XjrWu/PAaxp5HdsDsBHYVzKdQM/Dz0M6Xk1zqL5ckWgBdMcwhQC3fHuZqNA3S1FrzeM/PA==
X-Amz-Request-Id: 05fb9355-e743-4900-be4d-e1be627d1ce2
兼容公共头
公共请求头
AWS S3 请求头 | 描述 |
---|---|
Authorization | 兼容以AWS4-HMAC-SHA256开头V4版本认证 |
Content-Length | 兼容 |
Content-Type | 兼容 |
Content-MD5 | 兼容 |
Date | 兼容 |
Expect | 兼容 |
Host | 兼容 |
x-amz-content-sha256 | 兼容 |
x-amz-date | 兼容 |
x-amz-security-token | 兼容 |
公共响应头
AWS S3 响应头 | 描述 |
---|---|
Content-Length | 兼容 |
Content-Type | 兼容 |
Connection | 兼容 |
Date | 兼容 |
ETag | 兼容 |
x-amz-delete-marker | 未兼容 |
x-amz-request-id | 设置为与原生响应头x-ic-request-id相同 |
x-amz-id-2 | 设置为与原生响应头x-ic-debug-id相同 |
x-amz-version-id | 未兼容 |
兼容接口
Service API
AWS S3接口 | 描述 |
---|---|
GET Service/List Buckets | 兼容 |
Bucket API
AWS S3接口 | 描述 |
---|---|
DELETE Bucket | 兼容 |
GET Bucket/List Objects | 兼容GET Bucket (List Objects) Version 1 |
GET Bucket acl | 兼容 |
GET Bucket Location | 兼容 |
HEAD Bucket | 兼容 |
List Multipart Uploads | 兼容 |
PUT Bucket | 未支持x-amz-grant-* |
PUT Bucket ACL | 未支持x-amz-grant-* |
List Objects | 兼容 |
List Objects V2 | 未支持 fetch-owner |
OPTIONS | 兼容 |
Object API
AWS S3接口 | 描述 |
---|---|
DELETE Object | 未支持x-amz-mfa |
GET Object | 兼容 |
HEAD Object | 未支持x-amz-server-side-encryption-* |
PUT Object | 未支持x-amz-grant-*,x-amz-server-side-encryption-*,x-amz-storage-class支持STANDARD, STANDARD_IA |
PUT Object - Copy | 兼容 |
Abort Multipart Upload | 兼容 |
Complete Multipart Upload | 兼容 |
Initiate Multipart Upload | 未支持x-amz-grant-*,x-amz-server-side-encryption-*;x-amz-storage-class支持STANDARD, STANDARD_IA |
List Parts | 兼容 |
Upload Part | 未支持x-amz-server-side-encryption-* |
兼容工具
兼容说明
大多数基于AWS S3开发的工具都可以设置访问地址。通过设置这些工具的访问地址为FOS的AWS S3服务域名,您就可以使用这些工具访问FOS。下面以一些常用SDK和工具为例,说明如何对接FOS。 说明:
字串 | 含义 |
---|---|
$ACCESS_KEY | Flyme云账号的Access key |
$SECRET_KEY | Flyme云账号的Secret key |
AWS SDK for Python
- 安装Boto类库:
shell
pip install boto3
- 使用AWS SDK for python访问Fos
python
import boto3
from botocore.client import Config
s3 = boto3.client(
's3',
aws_access_key_id=$ACCESS_KEY,
aws_secret_access_key=$SECRET_KEY,
endpoint_url='https://fos.flymeyun.com',
region_name='US',
config = Config(
signature_version='s3v4',
)
)
# Use S3 client
s3.create_bucket(...)
AWS SDK for Java
- 添加依赖包到pom.xml
//添加下面AWS Java SDK依赖包到pom.xml
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.82</version>
</dependency>
- 使用AWS SDK for java访问Fos
java
import java.io.IOException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.S3ClientOptions;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.SDKGlobalConfiguration;
public class S3Sample {
public static void main(String[] args) throws IOException {
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials($ACCESS_KEY,$SECRET_KEY));
s3.setEndpoint("https://fos.flymeyun.com");
S3ClientOptions options = new S3ClientOptions();
options.withChunkedEncodingDisabled(true);
s3.setS3ClientOptions(options);
// Use S3 Client
s3.createBucket(...);
}
}
- 编译代码
shell
mvn package
AWS PHP SDK
- 安装:下载aws.phar,更多安装方式见AWS PHP SDK安装方式。
- 使用AWS SDK for PHP访问Fos
php
<?php
require 'aws.phar';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
'version' => 'latest',
'region' => 'bj',
'credentials' => [
'key' => $ACCESS_KEY,
'secret' => $SECRET_KEY,
],
'endpoint' => 'https://fos.flymeyun.com',
'signature_version' => 'v4',
]);
$buckets = $s3Client->listBuckets();
foreach ($buckets['Buckets'] as $bucket){
echo $bucket['Name']."\n";
}
AWS Golang SDK
- 安装go get -u github.com/aws/aws-sdk-go
- 使用AWS SDK for Golang访问Fos
go
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
)
conf := &aws.Config{
Region: aws.String("US"),
Endpoint: aws.String("https://fos.flymeyun.com"),
Credentials: credentials.NewStaticCredentials($ACCESS_KEY, $SECRET_KEY,, ""),
}
sess := session.Must(session.NewSessionWithOptions(session.Options{Config:*conf}))
svc := s3.New(sess)
getObjectParams := &s3.GetObjectInput{
Bucket: aws.String("my-bucket"),
Key: aws.String("my-object"),
}
getObjectResp, err := svc.GetObject(getObjectParams)
if err != nil {
fmt.Println(err.Error())
return
}
AWS CLI工具
- 安装AWS CLI工具pip install awscli
- 使用AWS CLI访问FOS
- 编辑配置文件
shell
$ cat ~/.aws/config
[default]
s3 =
signature_version = s3v4
region = US
$ cat ~/.aws/credentials
[default]
aws_access_key_id = $ACCESS_KEY
aws_secret_access_key = $SECRET_KEY
- 执行命令示例
shell
aws --endpoint-url https://fos.flymeyun.com s3 ls #list bucket
aws --endpoint-url https://fos.flymeyun.com s3 ls s3://${bucketname} #list object
- 参考文档
https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html