Our News
使用 Amazon S3 和 AWS Step Functions 增强文件共享 计算博客
作者 James Beswick发表日期 2023年8月29日分类 Amazon S3、AWS Step Functions、无伺服器架构分享链接 永久连结
Amazon S3 是一项由许多客户使用的云存储服务,旨在安全地存储文件。S3 提供了一种称为预签名 URL的功能,用以生成临时的下载链接,这对于授权用户上传和下载资料来说,是一种高效且安全的方式。
不过,有时客户需要更大的数据存取控制,例如基于 IAM 角色而非预签名 URL 限制下载,或是限制每个对象的下载次数以控制存取成本。此外,追踪访问这些下载 URL 的个体用户也是一项实用功能。
这篇博客展示了一个范例应用,透过使用 AWS 无伺服器服务来提供这些额外的功能。
这个范例中的代码使用了多种无伺服器服务:
服务功能Amazon API Gateway接收所有来自用户的请求,并使用 Amazon Cognito 检查授权。AWS Step Functions协调文件共享和下载的流程,包括用户验证、检查下载资格、记录事件、请求路由和响应格式化。AWS Lambda实施管理功能,例如检索元数据、列出文件和删除操作。Amazon DynamoDB存储文件访问权限,确保用户只能访问与其共享的文件。Amazon S3提供用户上传和下载文件的耐用存储。Amazon Athena提供查询S3 访问日志的高效方式,用以提取下载和带宽使用情况。Amazon QuickSight提供一个可视化仪表板,以查看下载和带宽分析。AWS Cloud Development Kit (AWS CDK) 部署 AWS 资源,并可以集成到您选择的 CI/CD 流程中。
在开始之前,您需要:
Nodejs 版本 16 或更高版本。AWS CLI 版本 2 或更高版本。一个 AWS 帐户及已在您的计算机上设置的 配置档。请遵循 代码库 中的说明,将范例部署到您的 AWS 帐户。一旦应用成功部署,便可访问用户界面。
在这个范例中,您将依照以下步骤上传文件并与接收者共享:
用户需要使用电子邮件地址确认身份。点击 创建帐户,然后用您的凭据 登录。
选择 共享文件。
选择 选择文件 以浏览并选择要共享的文件,再点击 下一步。
至少要填写一个接收者。选择 添加接收者 以增加更多接收者,然后点击 下一步。
设置 过期日期 和 限制下载次数,以配置分享的过期日期及限制下载次数,然后点击 下一步。
检查分享请求的详细信息。可以返回前面几个界面进行修改。完成后选择 提交。
点击 我的文件 查看您的共享文件。
飞跃加速器此范例使用 Step Functions 授权您扩展和自定义工作流程。它实施了一个默认的工作流程,使您可以重写逻辑或引入新的步骤,以满足您的需求。
此部分将介绍共享文件和下载文件的 Step Functions 工作流程的默认行为。
共享文件工作流程包括以下步骤:
验证 检查共享请求是否包含所有必要栏位。获取用户信息 从 Amazon Cognito 检索登录用户的信息,如姓名和电子邮件地址。授权 检查存储在 DynamoDB 中的权限,以验证用户是否拥有文件并具备共享权限。审核 记录共享请求以便日后审计。处理 更新 DynamoDB 中的权限存储。发送通知 向接收者发送电子邮件通知,告知他们有新文件与其共享。下载文件工作流程包括以下步骤:
验证 检查下载请求是否包含所需栏位例如,使用者 ID 和文件 ID。获取用户信息 从 Amazon Cognito 获取用户信息,例如他们的姓名和电子邮件地址。授权 检查 DynamoDB 中的权限存储,以确定用户是否拥有文件或拥有下载该文件的权限的有效接收者。审核 记录下载请求。处理 生成短期有效的 S3 预签名下载 URL 并返回给用户。该范例使用 API Gateway 的请求和响应数据映射,以使 REST API 能够直接与 Step Functions 通讯。这部分将展示如何根据您的用例自定义映射。

API Gateway REST API 使用 Apache VTL 模板来转换和构建对底层服务的请求。该解决方案利用 CDK 组件抽象化这些模板的构建:
plaintextapirootaddResource(share)addResource({fileId})addMethod( POST StepFunctionApiIntegration(shareStepFunction [ { name fileId sourceType params } { name recipients sourceType body } / 您的自订输入栏位 / ]) authorizerSettings)
StepFunctionApiIntegration 组件处理请求映射,允许您从进来的 API 请求中提取栏位并将其作为输入传递到 Step Functions 工作流程。这会生成以下 VTL 模板:
json{ name contextrequestId input {userIdcontextauthorizerclaimssubfileIdutilescapeJavaScript(inputparams(fileId))recipientsutilescapeJavaScript(inputjson(recipients))} stateMachineArn stateMachineArn}
在此情况下,栏位从 API 请求参数、主体以及授权标头中提取,并传递给工作流程。您可以根据需求自定义配置。
该范例具有使用 Apache VTL 的响应映射模板。工作流程中最后一步的输出会被作为 JSON 响应映射并通过 API Gateway 返回给用户。响应同时包括 CORS 标头:
plaintext
{ error inputpath(error) cause inputpath(cause)}
inputpath(output)
您可以根据需求自定义此响应模板。例如,为不同的响应代码提供自订行为。
在这篇博客中,您了解到如何安全地与授权的外部方共享文件并跟踪他们的访问情况,使用了 AWS 无伺服器服务。所展示的范例应用利用 Step Functions 使您能够扩展和自定义工作流程以满足用例需求。
若想学习更多相关概念,请访问:
范例应用使用预签名的 URL 共享对象将 AWS Step Functions 与其他服务结合使用专为云设计的 Cloudscape 设计系统映射模板实用工具参考更多无伺服器学习资源,请访问 Serverless Land。想了解 Step Functions 的数据处理,请查阅指南 Serverless 数据处理的分布式地图概述。
标签 贡献、无伺服器