Skip to content

https://blog.51cto.com/thedream/1893168

https://www.cnblogs.com/hei-ma/p/10155004.html

1.S3 cmd

官方网站 http://s3tools.org/s3cmd

安装

pip install s3cmd

第一次使用 s3cmd 前,需要先填写必要的信息。运行 s3cmd --configure,填入 csv 文件中的 access key 和 secret key,其余选项通常可以使用默认设定。设置结束后,在 $HOME 目录下会出现一个 .s3cfg 文件,里面存储了所有的设置信息。你可以使用文本编辑器进一步修改它

创建一个 bucket

s3cmd mb s3://bucket-name
s3cmd mb s3://bucket-name

显示所有 bucket

s3cmd ls
s3cmd ls

显示一个 bucket 中的内容

# 只显示根目录下的文件和文件夹
s3cmd ls s3://bucket-1

# 显示所有文件和文件夹
# -r 可以用 --recursive 代替,下同
s3cmd ls -r s3://bucket-1
s3cmd la s3://bucket-1
# 只显示根目录下的文件和文件夹
s3cmd ls s3://bucket-1

# 显示所有文件和文件夹
# -r 可以用 --recursive 代替,下同
s3cmd ls -r s3://bucket-1
s3cmd la s3://bucket-1

上传文件

# 上传单个文件
s3cmd put file-1 s3://bucket-1/dir-1/file-1

# 上传整个文件夹
# dir-1 将存放在 dir-2 之下
s3cmd put -r dir-1 s3://bucket-1/dir-2/

# 与 put -r 类似
# 但只上传已修改的文件
# 相当于 Linux 中的 rsync
s3cmd sync dir-1 s3://bucket-1/dir-2/
# 上传单个文件
s3cmd put file-1 s3://bucket-1/dir-1/file-1

# 上传整个文件夹
# dir-1 将存放在 dir-2 之下
s3cmd put -r dir-1 s3://bucket-1/dir-2/

# 与 put -r 类似
# 但只上传已修改的文件
# 相当于 Linux 中的 rsync
s3cmd sync dir-1 s3://bucket-1/dir-2/

下载文件

# 下载单个文件
s3cmd get s3://bucket-1/dir-1/file-1 file-1

# 下载整个文件夹
# 将在当前路径创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1

# 下载整个文件夹
# 直接下载内容,不创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1/
# 下载单个文件
s3cmd get s3://bucket-1/dir-1/file-1 file-1

# 下载整个文件夹
# 将在当前路径创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1

# 下载整个文件夹
# 直接下载内容,不创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1/

复制文件

# 复制单个文件
s3cmd cp s3://bucket-1/file-1 s3://bucket-2/file-2

# 复制整个文件夹的内容
s3cmd cp s3://bucket-1/dir-1/ s3://bucket-2/dir-2/
# 复制单个文件
s3cmd cp s3://bucket-1/file-1 s3://bucket-2/file-2

# 复制整个文件夹的内容
s3cmd cp s3://bucket-1/dir-1/ s3://bucket-2/dir-2/

移动文件

# 移动单个文件 s3cmd mv s3://bucket-1/file-1 s3://bucket-2/file-2

# 移动整个文件夹的内容 s3cmd mv s3://bucket-1/dir-1/ s3://bucket-2/dir-2/

删除文件

# 删除单个文件
s3cmd rm s3://bucket-1/file-1

# 删除整个文件夹
s3cmd rm -r s3://bucket-1/dir-1/
# 删除单个文件
s3cmd rm s3://bucket-1/file-1

# 删除整个文件夹
s3cmd rm -r s3://bucket-1/dir-1/

删除 bucket

# 删除一个空的 bucket
s3cmd rb s3://bucket-1

# 删除 bucket 和其中的所有内容
s3cmd rb --force s3://bucket-1
# 删除一个空的 bucket
s3cmd rb s3://bucket-1

# 删除 bucket 和其中的所有内容
s3cmd rb --force s3://bucket-1

2.S3上开启CORS

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/ManageCorsUsing.html

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/VirtualHosting.html#virtual-hosted-style-access

https://docs.aws.amazon.com/zh_cn/sdk-for-javascript/v3/developer-guide/s3-example-photo-album.html

  • 配置规则

https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html

  • 案例

打开s3->权限->cors

[
    {
        "AllowedHeaders": [
        	"*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2",
            "Access-Control-Allow-Origin"
        ],
        "MaxAgeSeconds": 3000
    }
]
[
    {
        "AllowedHeaders": [
        	"*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2",
            "Access-Control-Allow-Origin"
        ],
        "MaxAgeSeconds": 3000
    }
]

2.1CORS 方法进行故障排除

1.通过添加 -H "Access-Control-Request-Method:" 标志,使用 cURL 命令利用特定 CORS 方法: Method发出请求。此标志指定要测试的 CORS 方法。使用 --request OPTIONS 标志对请求执行预检检查。

注意:Amazon S3 支持 GET、HEAD、PUT、POST 和 DELETE 方法

bash
curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Access-Control-Request-Method: POST" --request OPTIONS -H "Origin: http://www.example.com"

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>POST</Method><ResourceType>OBJECT</ResourceType><RequestId>190J4Q6222HA2KZ5</RequestId><HostId>6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=</HostId></Error>
curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Access-Control-Request-Method: POST" --request OPTIONS -H "Origin: http://www.example.com"

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>POST</Method><ResourceType>OBJECT</ResourceType><RequestId>190J4Q6222HA2KZ5</RequestId><HostId>6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=</HostId></Error>

2.如果请求返回错误,请验证是否在桶上设置了 CORS 配置。请确保已将所需方法添加到桶上的 CORS 规则中。如果设置了 CORS 配置,则您将在 S3 控制台中桶的权限部分看到编辑 CORS 配置的选项

aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD","POST"],"AllowedOrigins":["http://www.example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'
aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD","POST"],"AllowedOrigins":["http://www.example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'

3.测试更新的 CORS 规则。如果您的方法按预期运行,那么您将收到以下响应:

curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Origin: http://www.example.com"

x-amz-id-2: tH9jeXGs0rGLGmM8l/4aELEqhe+uBPIFLo7dYqM9nsCOg8tUoqhSVu2ahBV2dn5P7Q5g3Tw1Iaw=
x-amz-request-id: DYTP8VXK4HYBBTNS
Date: Fri, 01 Mar 2024 02:08:42 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Expose-Headers: x-amz-server-side-encryption, x-amz-request-id, x-amz-id-2
Access-Control-Max-Age: 3000
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Wed, 28 Feb 2024 07:46:26 GMT
ETag: "7e2e5f9a95159aa6c4c176652afa0f77"
x-amz-server-side-encryption: AES256
Accept-Ranges: bytes
Content-Type: text/plain
Server: AmazonS3
Content-Length: 8365
curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Origin: http://www.example.com"

x-amz-id-2: tH9jeXGs0rGLGmM8l/4aELEqhe+uBPIFLo7dYqM9nsCOg8tUoqhSVu2ahBV2dn5P7Q5g3Tw1Iaw=
x-amz-request-id: DYTP8VXK4HYBBTNS
Date: Fri, 01 Mar 2024 02:08:42 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Expose-Headers: x-amz-server-side-encryption, x-amz-request-id, x-amz-id-2
Access-Control-Max-Age: 3000
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Wed, 28 Feb 2024 07:46:26 GMT
ETag: "7e2e5f9a95159aa6c4c176652afa0f77"
x-amz-server-side-encryption: AES256
Accept-Ranges: bytes
Content-Type: text/plain
Server: AmazonS3
Content-Length: 8365

4.使用您选择的工具捕获完整的请求和响应。对于 Amazon S3 收到的每个请求,您必须有一个 CORS 规则与请求中的数据相匹配

  • 验证请求是否具有 Origin 标头。如果缺少标头,则 Amazon S3 不会将该请求视为跨源请求,也不会在响应中发送 CORS 响应标头。
  • 验证您的请求中的 Origin 标头是否与指定 CORSRule 中的至少一个 AllowedOrigins 元素相匹配。Origin 请求标头中的方案、主机和端口值必须与 CORSRule 中的 AllowedOrigins 元素相匹配。例如,假设您将 CORSRule 设置为允许源 http://www.example.com。当您这样做时,请求中的源 https://www.example.comhttp://www.example.com:80 与配置中允许的源不匹配。
  • 验证您的请求或预检请求中的方法(在 Access-Control-Request-Method 中指定的方法)是否是同一 CORSRule 中的 AllowedMethods 元素之一。
  • 如果预检请求包含 Access-Control-Request-Headers 标头,请验证 CORSRule 是否包含 Access-Control-Request-Headers 标头中每个值的 AllowedHeader 条目

3.nginx代理s3

server {
    listen 80;
    server_name  img.xxx.com;

    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_request_buffering off;


include /data/apps/nginx/conf/roles/*.conf;
location / {
	proxy_hide_header x-amz-id-2;
	proxy_hide_header x-amz-request-id;
	proxy_hide_header x-amz-meta-s3b-last-modified;
	proxy_hide_header x-amz-meta-sha256;
	proxy_hide_header x-amz-server-side-encryption;
    proxy_pass http://s3.ap-xxx-1.amazonaws.com/bitimg.xxx.ai/;
	expires 3d;    #缓存3天
	access_log /var/log/nginx/oss.log es;
}
}
server {
    listen 80;
    server_name  img.xxx.com;

    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_request_buffering off;


include /data/apps/nginx/conf/roles/*.conf;
location / {
	proxy_hide_header x-amz-id-2;
	proxy_hide_header x-amz-request-id;
	proxy_hide_header x-amz-meta-s3b-last-modified;
	proxy_hide_header x-amz-meta-sha256;
	proxy_hide_header x-amz-server-side-encryption;
    proxy_pass http://s3.ap-xxx-1.amazonaws.com/bitimg.xxx.ai/;
	expires 3d;    #缓存3天
	access_log /var/log/nginx/oss.log es;
}
}