亚马逊AWS官方博客
利用云原生组件快速构建 NFT 发售系统
背景
近年来随着 Web3 概念的火热,Web3 被描述为一个“基于区块链的去中心化生态系统”。吸引了大量互联网工作者不断的探索 Web3 在不同领域应用的落地。在 Web3 中,因为“非同质化代币”(NFT)的出现,使得创作者在数字世界的作品能够具备独一无二的权证而无法复制。NFT 既可以是现实世界中物品在数字世界中的映射,也可以是数字作品本身。创作者的作品有了 NFT 之后,就可以和现实世界中一样买卖、流转、租借。同时,没有中心化的平台也使得创作者能够获得更多的回报。
本文以公有云为依托,阐述了如何快速上线基于以太坊公链,发放非交易类型的虚拟资产 NFT 的无服务化的应用,从而能减少创作者对应用架构底层运维与产品使用学习的投入,达到应用的快速上线与版本的迭代。
方案设计
一般来说,发售系统主要会包含会员/账号管理、铸造、藏品管理、权益管理等模块。会员管理主要包含基础资料、实名认证等功能;藏品管理包含作品/作者介绍、解读、发行记录、额度、作品结构/非结构化等信息。
自从 AWS 推出无服务架构 AWS Lambda 以来,成千上万的用户都受益于此,无需预置或管理任何服务器,就可以快速部署和运行代码。使用 AWS lambda 和 API gateway 可以快速在互联网构建服务,提供给前端用户使用。
Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库,旨在运行任何规模的高性能应用程序。DynamoDB 提供内置安全性、连续备份、自动多区域复制等功能。借助 DynamoDB,发售系统的会员账户以及藏品系统均可保存在 DynamoDB,同时利用 DynamoDB 多 Region 复制能力,开发者不用维护多区域数据同步的问题,极大地节省了开发的时间,快速将系统部署在全球。
架构说明
1. 终端用户通过使 Route 53 作为 DNS 名称解析服务,将域名指向 CloudFront。
2. CloudFront+S3 用于存放静态文件(css,image 等)。
3. 为了让请求无缝地向任何区域中的 API gateway 终端节点进行身份验证,可以配置 route53 latency 的策略,通过 cloudfront 的源配置为 route53 的 latency 的方式(Lambda@Edge 查询 Route 53 的方式同样也可以)以找到转发请求的最佳区域。
4. 配置 API gateway,同时将配置好的域名放入到 route53 latency 的记录中。
5. 配置 Lambda 以作为动态 API 的请求。
配置说明
Route53
- 创建 route53 的托管区域,用配置域名和路由策略配置一条到 cloudfront 的记录,用户在访问域名后,流量可以指向 cloudfront 的域名(创建 Distribution 的时候自动生成)。 如下图:
- 配置基于延迟的路由策略,需要注意的是:
(1)2 条记录的流量路由填写为 API gateway 的域名,一条指向新加坡 Region 的 API Gateway,一条指向美西 2 的 API Gateway。
(2)记录名称和 API gateway 自定义域名保持一致。详见 API gateway 的配置。
P.S:基于延迟策略的配置除了上述方法,还可以在 Lambda@edge 里查询 route53 的延迟配置后,修改 request 的 domain 值,以达到动态路由的效果。
CloudFront
- 创建 Cloudfront 的 Origin,使其指向 junyang.site,承接上图的 route53 的延迟路由。
- 配置 Behavior,注意缓存策略。
API GateWay
- 由于 2 个 region 的创建方法是一样的,这里以美西 2 创建为例,首先配置 API Gateway。
- 配置自定义域名,注意:第一步 route53 里延迟路由的配置(记录名称和值)和这里(域名和 API Gateway 域名)保持一致。
- 配置 ACM 证书,需要注意的是,由于 API Gateway 是 Region 级别的,所以我们的 ACM 证书也需要在相应区域进行配置,如下:
注意:如果想控制 API Gateway 只能让 Cloudfront 来进行访问,可以使用 IAM 的基于标签的策略来控制。详见参考资料。
Lambda
Lambda 服务本身就在 VPC 内,如果 Lambda 想要访问 internet,需要配置公有子网和私有子网,然后通过 Nat gateway 访问 internet。
- 配置 VPC 和 IGW
- 配置公有子网
- 配置公有子网路由表
- 同时,创建 Nat Gateway,将 NATW 附加在公有子网上
- 配置私有子网
- 配置私有子网路由表
- 在 Lambda 里配置访问 VPC 的公有子网,以便于访问 Nat Gateway
参考资料
基于标签给 API gateway 做访问控制:https://docs.thinkwithwp.com/zh_cn/apigateway/latest/developerguide/apigateway-tagging-iam-policy.html
基于 route53 延迟策略的配置:https://thinkwithwp.com/cn/blogs/networking-and-content-delivery/reduce-latency-for-end-users-with-multi-region-apis-with-cloudfront/
DDB 的全局表创建: https://docs.thinkwithwp.com/zh_cn/amazondynamodb/latest/developerguide/globaltables.tutorial.html
ESR:https://github.com/serverless-stack/open-next#recommended-infrastructure-on-aws