aws 云平台常见操作

S3

s3 配置跨域

当使用 aws 的 cloudfront 或其他第三方 cdn (如 cdn77)为域名加速,资源是回源到 aws s3 的情况下,一般都需要配置 允许跨域,此种情况需要在 aws s3 存储桶中配置允许跨域 [1]

配置步骤如下:

  1. 定位到目标 s3 桶,进入 权限 管理页面

  2. 找到 CORS 配置,配置以下 JSON 格式内容,允许所有源的跨域

    [
    {
    "AllowedHeaders": [
    "*"
    ],
    "AllowedMethods": [
    "POST",
    "GET"
    ],
    "AllowedOrigins": [
    "*"
    ],
    "ExposeHeaders": []
    }
    ]

  3. Cloudfront 中,回源到此 S3 的加速域名配置中,行为 按照下图配置,主要为开启 OPTIONS 缓存,并在响应标头策略中选择: CORS-with-preflight-and-SecurityHeadersPolicy [2]

    此配置为可选配置,可以解决客户端偶尔会遇到的因跨域问题而导致的资源获取失败问题。

存储桶同步数据

Data Transfer Hub 数据在线传输解决方案

  1. 海外账号选择 从亚马逊云科技海外区域控制台中启动方案
  2. 弹出页面中点击下一步,在 指定堆栈详细信息 页面配置 堆栈名称 以及 AdminEmail后面登陆 Potal 需要发送到邮箱的初始密码,要确保邮箱可登录
  3. 后面步骤使用默认选项,一直下一步,直到点击 提交
  4. 等待 5-10 分钟后,全部资源创建完成,点击刚刚创建的堆栈的 输出 页面,其中有 数据在线传输 配置的 Potal 链接(PortalUrl),点击此 url,使用堆栈配置的邮箱中的密码登陆,第一次登陆后需要改密码。
  5. 登陆后,创建迁移任务。任务创建并运行后,可以在监控页面看到迁移时的相关监控数据

如果同步目标存储桶中的数据量太大,建议关闭 是否需要数据比对 选项,开启此选项,执行真正的数据同步前,需要完成对目标存储桶中数据的扫描,数据量越大,耗时越久


此同步工具会产生费用

创建 AWS S3 存储桶并允许 CDN 回源请求

若要允许 AWS S3 作为 CDN 回源桶,需要开启 S3 的公有访问权限,在 **S3 -> Bucket -> Permissions:Block public access (bucket settings) ** 中不要勾选 Block all public access

同时为 Bucket 添加 Bucket Policy

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
}
]
}

AWS S3 配置生命周期规则

进入 S3 生命周期设置

  1. 登录 AWS 控制台,进入 S3 服务。

  2. 点击进入你的 存储桶 (Bucket)

  3. 选择 Management (管理) 选项卡。

  4. Lifecycle rules (生命周期规则) 下,点击 Create lifecycle rule (创建生命周期规则)

  5. 选择 规则生效范围(Choose a rule scope) ,包括

    • Limit the scope of this rule using one or more filters(使用过滤器限制范围) ,过滤器使用路径前缀(Prefix),如 project-a/ (注意结尾要带斜杠)
    • Apply to all objects in the bucket (应用于桶内所有对象)
  6. 定义过期操作 (Lifecycle rule actions)

  • 勾选 Expire current versions of objects (使对象的当前版本过期) 。除非你开启了版本控制(Versioning),否则只需要勾选这一项。如果开启了版本控制,建议同时勾选 Permanently delete noncurrent versions of objects(永久删除非当前版本) ,并设置为 1 天,以防产生冗余费用。

  • 勾选 Delete expired object delete markers or incomplete multipart uploads(删除过期的删除标记或未完成的分段上传) ,防止垃圾数据残留。

  • Days after object creation 填写过期时间,如 30。这表示对象上传 30 天后,AWS 会自动将其标记为删除。

Cloudfront

Cloudfront 配置 referer 校验

referer 校验 是一种常用的基础的防盗链手段,可以限制非法的 Referer 来源请求资源。参考配置步骤如下:

  1. 登陆 aws 帐号后,定位到 Cloudfront --> 函数(Function) 页面

  2. 点击 Create function(创建函数),为函数命名,例如 referer

  3. 编辑函数代码

    function handler(event) {
    var request = event.request;
    var headers = request.headers;

    // 获取 Referer 头,如果不存在,则设置为空
    var referer = headers.referer ? headers.referer.value : "";

    // 定义允许的 Referer 列表
    var allowedReferers = [
    "https://example.com/",
    "https://example.com"
    ];

    // 检查 Referer 是否在允许列表中
    var isAllowed = allowedReferers.some(function(allowedReferer) {
    return referer.startsWith(allowedReferer);
    });

    if (!isAllowed) {
    // 如果 Referer 不被允许,返回 403 Forbidden 响应
    return {
    statusCode: 403,
    statusDescription: "Forbidden",
    headers: {
    "content-type": { value: "text/plain" }
    },
    body: "Access denied"
    };
    }

    // 如果 Referer 合法,允许请求继续
    return request;
    }

  4. 在测试页面添加自定义 Header 进行测试,看函数是否按照预期工作,函数功能正常后 Publish (发布)函数

  5. 定位到 Cloudfront --> Distributes(分配) 页面,选择要关联函数的 Distribute。找到 Actions(行为) 进行编辑

  6. Function associations 中配置关联 CloudFront 函数。

Cloudfront Function 详解

AWS CloudFront Function(函数) 是一种轻量级、服务器无关的 JavaScript 执行环境,可以在 CloudFront 分发的边缘节点运行。CloudFront 函数的主要目的是处理 HTTP 请求和响应,具有低延迟和较高的性能,适用于修改请求/响应头、重写 URL、设置缓存等操作。

在 CloudFront 函数中,你可以通过事件处理器来操作请求和响应。

事件类型 (Event Type)
CloudFront 支持四种主要的事件类型,每种类型在不同的生命周期阶段触发。

  • Viewer Request :当 CloudFront 接收到用户的请求时触发。
  • Origin Request :当请求从 CloudFront 转发到源服务器时触发。
  • Viewer Response :当 CloudFront 准备将响应发送回客户端时触发。
  • Origin Response :当源服务器响应 CloudFront 时触发。

当请求或响应到达 CloudFront 时,CloudFront 会将一个事件对象传递给函数。这个对象的结构依赖于触发函数的 事件类型(如 Viewer Request,Viewer Response,Origin Request,Origin Response)

处理请求的语法示例

处理 Viewer Request

当 CloudFront 从用户接收到请求时,触发 Viewer Request 。你可以 修改请求对象重定向请求验证请求 等。

function handler(event) {
var request = event.request;

// 获取请求的 URI 和查询字符串
var uri = request.uri;
var queryString = request.querystring;

// 打印请求的 URI 和查询字符串
console.log("Request URI: " + uri);
console.log("Query String: " + queryString);

// 如果 URI 是 /old-url,重定向到 /new-url
if (uri === "/old-url") {
return {
statusCode: 301,
statusDescription: "Moved Permanently",
headers: {
"location": {
value: "/new-url"
}
}
};
}

// 返回原请求,允许继续处理
return request;
}

通过 Viewer Request 实现回源 URI 改写

假如有以下需求:

  1. 客户端请求 URI 为 /uploads/* ,例如 /uploads/ads/apicture.png
  2. 在回源时,将请求改写为 /encrypt-images/uploads/$1.webp ,例如 /encrypt-images/uploads/ads/apicture.png.webp

可以参考以下代码实现回源 URI 改写

function handler(event) {
var request = event.request;
var uri = request.uri;

// 匹配以 /uploads/ 开头的路径
var regex = /^\/uploads\/(.*)/;

// 检查请求的 URI 是否匹配 /uploads/*
var match = uri.match(regex);

if (match) {
// 如果匹配,将 URI 改写为目标格式
var newUri = '/encrypt-images/uploads/' + match[1] + '.webp';
request.uri = newUri;
}

// 返回修改后的请求
return request;
}

处理 Viewer Response

Viewer Response 允许你修改返回给用户的响应。例如,可以修改 响应头 或修改返回的 HTML 内容。

function handler(event) {
var response = event.response;

// 添加一个自定义响应头
response.headers['x-custom-header'] = { value: 'Hello, CloudFront!' };

// 打印响应状态码
console.log("Response Status Code: " + response.statusCode);

return response;
}

响应中添加允许跨域的头部(CORS,跨源资源共享)

需要创建一个 Viewer Response 类型的函数,此函数将在 CloudFront 向客户端返回响应时触发,允许你在响应中添加或修改 CORS 相关的头部信息。

function handler(event) {
var response = event.response;

// 添加 CORS 相关的响应头
response.headers['access-control-allow-origin'] = { value: '*' }; // 允许所有来源的访问
response.headers['access-control-allow-methods'] = { value: 'GET, POST, OPTIONS' }; // 允许的方法
response.headers['access-control-allow-headers'] = { value: 'Content-Type, Authorization' }; // 允许的请求头
response.headers['access-control-max-age'] = { value: '3600' }; // 指定预检请求的缓存时间

// 可选:如果需要支持某些特定的域名,可以替换 '*' 为特定域名
// response.headers['access-control-allow-origin'] = { value: 'https://example.com' };

return response;
}

处理 Origin Request

Origin Request 是当请求从 CloudFront 转发到源服务器时触发。你可以 基于请求头或查询字符串对请求进行修改 ,或在 某些条件下返回不同的缓存版本

function handler(event) {
var request = event.request;

// 获取请求头
var headers = request.headers;

// 检查用户的语言设置
var lang = headers['accept-language'] ? headers['accept-language'].value : 'en';

// 根据语言设置修改请求的 URI
if (lang === 'fr') {
request.uri = '/fr' + request.uri;
}

return request;
}

处理 Origin Response

当源服务器返回响应给 CloudFront 时,触发 Origin Response 。你可以 修改响应的内容 ,如 更改响应头或正文

function handler(event) {
var response = event.response;

// 更改响应的 Content-Type
response.headers['content-type'] = { value: 'application/json' };

// 添加自定义响应头
response.headers['x-cache-status'] = { value: 'MISS' };

return response;
}

函数编写常见操作

  • 获取请求头 (Request Headers)

    var headers = event.request.headers;
    console.log(headers);

  • 修改请求头 (Modify Request Headers)

    event.request.headers['x-custom-header'] = { value: 'myValue' };

  • 获取响应头 (Response Headers)

    var headers = event.response.headers;
    console.log(headers);

  • 修改响应头 (Modify Response Headers)

    event.response.headers['x-custom-header'] = { value: 'Hello' };
  • 日志输出 (Logging)
    使用 console.log() 进行日志输出,可以在 CloudFront 函数控制台的 CloudWatch Logs 中查看日志。

脚注