亚马逊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 值,以达到动态路由的效果。

const dns = require('dns');

let bestOrigin;
let expires = 0;
let TTL = 1;
let DNS_HOST = 'latency-routing.example.com';

function getBestRegion() {
console.log("inside resolver");
const now = Date.now();
if (now < expires)
return Promise.resolve(bestOrigin);
return new Promise((resolve, reject) => {
dns.resolveCname(DNS_HOST, (err, addr) => {
bestOrigin = addr[0];
expires = now + TTL;
resolve(bestOrigin);
});
});
}

let regions = []; // use lowercase.
regions['sinpore'] = { "Host": "<sinpore API domain>" };
regions['orgen'] = { "Host": "<us-west2 API domain>" };
function getRegionalSettings(bestRegion){
return regions[bestRegion];
}

exports.handler = async (event, context, callback) => { 
const request = event.Records[0].cf.request;

let bestRegion = await getBestRegion();
let map = getRegionalSettings(bestRegion);
let target_domain = map["Host"];

// Forward GraphQL subscription requests for WebSockets.
request.origin.custom.domainName = target_domain;

// Forward REST and GraphQL query/mutation requests.
request.headers["host"] = [{ 
key: "host", 
value: target_domain 
}];

// console.log(` Request headers set to "${JSON.stringify(request.headers)}"`)
callback(null, request);
};

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.aws.amazon.com/zh_cn/apigateway/latest/developerguide/apigateway-tagging-iam-policy.html

基于 route53 延迟策略的配置:https://aws.amazon.com/cn/blogs/networking-and-content-delivery/reduce-latency-for-end-users-with-multi-region-apis-with-cloudfront/

DDB 的全局表创建: https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/globaltables.tutorial.html

ESR:https://github.com/serverless-stack/open-next#recommended-infrastructure-on-aws

本篇作者

Dora Gui

AWS 技术客户经理,主要支持游戏,互联网行业客户的架构优化、成本管理、技术咨询等工作,并专注在 IAAS,大数据和容器等方向的技术选型,方案落地和实践。在加入 AWS 之前,曾就职于 EMC 和微软,腾讯等科技公司,拥有近 10 年虚拟化与公有云领域的架构优化和技术支持经验。

杨俊

亚马逊云科技资深解决方案架构师。加入 AWS 之前,主要从事电商和零售相关的系统开发工作,具备丰富的零售行业经验和企业上云实践经验。