AWS

AWS

Amazon Web Serice

AWS EC2 GPU 实例简介及费用对比
AI

AWS EC2 GPU 实例简介及费用对比

本文介绍了AWS EC2 GPU实例的性能与费用对比,帮助大家选择适合自己需求的实例类型。文中对比了全球区和中国区的实例价格,并推荐了几种性价比较高的实例类型。还简要介绍了各类GPU实例的特点和性能差异,为需要在AWS上运行大模型的场景提供一些参考。 一、实例性能与费用对比 想要在本地运行大模型(LLM),一定少不了GPU,这里介绍一下目前在AWS上全球区和中国区所有带英伟达的 GPU EC2实例 [1]。 我整理了一张表格,用与对比各个实例的性能参数与价格。对于性能主要考虑显卡的型号、显卡数量、总GPU内存大小。 对于实例价格,AWS 全球区域选取了俄亥俄州区域(us-east-2)作为参考 [2],表格展示了每小时的按需费用,以及按照汇率7.2折算成人民币的价格。中国区选取了宁夏区域(cn-northwest-1)作为参考 [3],有些实例类型宁夏区域未上线,费用使用/表示。 从GPU大小和费用来看,下面几个实例类型是比较推荐的: * g4dn.xlarge:配备1个NVIDIA T4显卡,共16GB GPU。是带有NVIDIA显卡最便宜的实例,适合运行
5 min read
AWS 上配置 Paloalto GlobalProtect
Paloalto

AWS 上配置 Paloalto GlobalProtect

本篇文档介绍了在 AWS 上配置 Palo Alto GlobalProtect VPN 的完整流程。内容包括实例启动和初始化、防火墙接口配置、证书创建、认证方式设置、区域和地址池的建立、VPN 网关和门户的配置、客户端安装和连接测试、安全策略及 NAT 配置、保留客户端原始 IP 地址的 Ghost Pool 方法,以及主机信息收集(HIP)与授权许可的应用。 实验拓扑 一、AWS 启动 Paloalto 实例 实例启动较慢,大约需要 10 分钟才能通过SSH登录。这里选择PAYG类型的实例(pay-as-you-go),实例启动后带有Paloalto的授权许可。 实例设置两块网卡时,需要禁用自动分配公有 IP 功能。只有一块网卡时,才会自动分配公有 IP。 Paloalto 实例默认的第一个接口(
16 min read
Panorama系列--(5)Panorama配置QoS
Paloalto

Panorama系列--(5)Panorama配置QoS

Palo Alto Networks 防火墙上配置QoS需要配置三个部分,分别是QoS Profile、QoS Policy以及 QoS 出口接口的设置。 先创建QoS Profile,其中设置不同类(class)的带宽大小,然后设置Qos Policy,其中定义流量所属的类(class),最后在QoS出接口调用QoS Profile文件即可。 创建QoS Profile,定义不同类能享用的带宽。这里使用的是VM-100实例,最大带宽为2Gbps,所以配置QoS策略时,可以设置最大带宽为2000Mpbs。 AWS VM-100M5.XLARGE VM-300 M5.XLARGE Firewall Throughput (App-ID enabled) 2 Gbps 4 Gbps Threat Prevention Throughput 1 Gbps 1.7 Gbps
3 min read
Panorama系列--(4)Panorama收集日志与添加磁盘
Paloalto

Panorama系列--(4)Panorama收集日志与添加磁盘

Panorama 可以聚合所有管理防火墙的日志,并显示网络中所有流量的信息。此外,它还提供了所有策略修改的审核记录和对受管防火墙所作的配置更改。 一、Panorama集中收集日志 新建日志收集器,填入Panorama的序列号,配置提交到Panorama。 添加一块磁盘,因为虚拟机在启动时,已经添加过一块2TB的磁盘,所以这里可以直接识别出来。配置完后继续提交到Panorama。 新建收集组,设置日志保留时间,添加刚才创建的收集器。配置完后,配置提交并推送到防火墙设备。 查看收集器状态,如果收集组的配置没有推送到防火墙,可能遇见“Ring version mismatch”的报错。 编辑需要记录日志的策略,设置日志转发到IoT Security Default Profile,这是一个默认的日志策略,会记录所有日志信息。 如果防火墙已经修改过默认策略,那么Panorama是无法推送默认策略到防火墙上的,需要先在防火墙上点击Revert同步Panorama的策略,之后才能接受来自Panorama的策略。 等待一会,在Panorama上查看日志信息。
4 min read
Panorama系列--(3)Panorama模板、堆栈、设备组
Paloalto

Panorama系列--(3)Panorama模板、堆栈、设备组

一、设备组 1.1 设备组层次结构 Panorama会管理很多防火墙,Panorama修改防火墙配置时,往往会同时修改很多防火墙的配置。通过将防火墙加入相同的设备组,就可以共享设备组中的Policy(策略)和Objects(对象)。一般依据地理位置、功能特性等来划分设备组。 Panorama上创建一个设备组之后,会出现Policy和Objects的选项。 设备组的主要目的是绑定Policy和Objects * 防火墙设备必须要要加入一个设备组。 * 设备组有层级关系,最多含有4个层级。较低层次的设备组会继承较高层次设备组的Policy和Objects。 * 默认的Shared设备组,位于最顶层。 设备组的层次结构示例。 下面是按照地理位置划分设备组的一个示例,并将防火墙添加到了SecVpc-Firewall这个设备组。 Panorama添加防火墙到设备组后,需要将配置提交并推送到防火墙才会生效。如果未推送成功,可以选择强制推送到设备(Push to Devices--Edit Selections--OK) 1.2 设备组策略 防火墙按
9 min read
Panorama系列--(2)AWS上搭建Panorama测试环境
Paloalto

Panorama系列--(2)AWS上搭建Panorama测试环境

一、注意事项 * AWS上Paloalto防火墙默认版本是10.2.2h2,Panorama默认版本是10.2.0,需要将Panorama升级到与Paloalto相同版本,或者更高的版本,否则Panorama无法查看日志。 * Paloalto防火墙VM-50型号只支持ESXi、Hyper-V和KVM平台,不支持AWS和其他云平台。 二、利用CloudFormation部署实验环境 Panorama主要用来管理多台防火墙,在AWS云上,对流量做集中安全检测一般会有多台防火墙,所以这里利用CloudFormation搭建了流量集中检测的LAB环境,然后利用Panorama管理这两台防火墙。 只启动两台防火墙和一台Panorama,也可以做大部分的测试,搭建流量集中检测环境是为了更加模拟真实环境。 利用CloudFormation创建实验环境,CloudFormation代码中不会创建Panorama,需要自行手动创建,也不会对Paloalto防火墙做初始化。 上传堆栈模板文件。 设置堆栈名称,选择EC2密钥。 允许创建IAM资源。 Clou
24 min read
Panorama系列--(1)EVE-NG搭建Panorama测试环境
Paloalto

Panorama系列--(1)EVE-NG搭建Panorama测试环境

这篇文档介绍如何利用EVE-NG搭建Panorama测试环境。 一、注意事项 * EVE-NG的低版本不支持Panorama镜像,例如2.0.3-86版本就不支持。这里实验环境使用的是版本是5.0.1-13-Community,下载链接:https://www.eve-ng.net/index.php/download/#DL-COMM。 * Panorama与Paloalto防火墙版本需要保持一致,或者Panorama高于Paloalto防火墙的版本。这里实验环境Panorama与Paloalto都是用10.2.0版本。另外测试时发现Paloalto防火墙10.2.3版本在EVE-NG环境中需要编辑节点,在“QEMU custom options”中添加“-cpu host”参数才能启动。 * Paloalto防火墙在未激活的情况也可以测试大部分功能,但是Panorama不激活的情况下,无法管理Paloalto防火墙。 二、下载Panorama与Paloalto镜像 下载Panorama与Paloalto镜像文件,需要拥有Paloalto账号,登录https
6 min read
AWS上快速搭建OpenVPN服务器
AWS

AWS上快速搭建OpenVPN服务器

这篇文档介绍利用Shell脚本,快速搭建OpenVPN服务器,为用户提供远程访问VPN。 OpenVPN是使用最广泛的开源VPN,开源往往意味着体验不是那么美好。如果通过源码安装OpenVPN,确实会比较繁琐,但是操作过程又具有重复性,所以非常适合使用脚本来操作。 一、OpenVPN服务器配置 1.1 启动OpenVPN服务器 使用Amazon Linux 2 AMI镜像。 使用较小的实例测试即可。 OpenVPN服务器默认使用UDP 1194端口。 1.2 使用脚本配置OpenVPN服务器 切换到root模式。 [ec2-user@ip-172-31-32-219 ~]$ sudo -i 下载脚本文件。 [root@ip-172-31-32-219 ~]# curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh 为脚本授权运行权限。 [root@ip-172-31-32-219 ~]# chm
13 min read
AWS 上快速安装Greenbone漏扫工具
AWS

AWS 上快速安装Greenbone漏扫工具

B站视频 这篇文档介绍在AWS上,通过Docker容器快速安装Greenbone Community。 Greenbone的前身是OpenVAS扫描器。Greenbone 是世界上使用最广泛的开源漏洞管理器。 生产环境中推荐使用源码安装,不建议通过Docker方式安装,这种安装方式主要用于功能测试,或者临时的扫描任务。 一、AWS上启动Ubuntu实例 在AWS控制台选择Ubuntu Server 22.04 LTS虚拟机。 选择实例类型为t3.large,设置EC2密钥对,选择默认的VPC,允许自动获取公网IP地址,设置磁盘为30GB。 硬件最小配置: * CPU Cores: 2 * Random-Access Memory: 4GB * Hard Disk: 20GB free 硬件推荐配置: * CPU Cores: 4 * Random-Access Memory: 8GB * Hard Disk: 60GB free 可以直接在用户数据中完成Greenbone的安装。 用户数据内容
4 min read
AWS上结合Router53构建思科远程访问VPN高可用架构
Cisco

AWS上结合Router53构建思科远程访问VPN高可用架构

B站视频 一、背景 因为疫情的推动,居家办公已经成为常态化的趋势,员工居家办公的场景下,需要安全的访问企业内网。思科的AnyConnect RA-VPN(Remote Access VPN)是比较常见的解决方案,这篇文档介绍在亚马逊云科技上构建高可用的思科远程访问VPN架构。 在AWS Marketplace上,提供思科的ASAv和FTDv这两款防火墙产品,都可以用来部署AnyConnect RA-VPN,这里介绍更加常见的,通过ASAv防火墙来部署。 RA-VPN会作为员工访问内网的入口,一旦出现故障,将会影响所有员工的远程访问,所以为RA-VPN部署高可用架构是非常重要的。 在AWS上,可以通过两种方式来构建思科RA-VPN的高可用架构: * Router 53的DNS负载均衡。将VPN的域名配置两个权重相同的A记录,分别指向两台ASAv的公网地址,当用户通过VPN域名拨号时,平均来说,Router 53会负载分担的返回两台ASAv的公网IP地址,用户从而拨入到不同的ASAv上。 * Network Load Balancer
17 min read
AWS GWLB对访问ALB流量做安全检测
AWS

AWS GWLB对访问ALB流量做安全检测

B站视频 一、架构图 上一篇介绍了GWLB结合Network Load Balancer的场景,这里介绍一下GWLB结合Application Load Balancer的场景,主要区别还是在于路由表的设计。另外因为ALB可以关联AWS WAF,所以在代码里面顺带为ALB关联了一个WAF策略,策略只允许来自中国地区的IP访问,来自其他国家地区的请求会被拒绝。 这个架构图高清图片我放到百度网盘了,链接:https://pan.baidu.com/s/1r5uPBSmr9e0qaliz7fdTyQ 提取码:uuqd 实验环境一共有两个VPC,左边的是业务VPC,里面有两个APP模拟HTTP的业务,EC2放在私有子网里面,在不同的AZ。 有一个面向互联网的Application Load Balancer,向公网发布了这个HTTP的服务,这样互联网上的用户,就可以通过ALB访问后面的业务。我们要做的是把这个流量,引导到防火墙上去,做安全检测。这里使用Linux的iptables来模拟防火墙。 另外,APP可以通过NAT GW上网,这个
24 min read
AWS GWLB对访问NLB流量做安全检测
AWS

AWS GWLB对访问NLB流量做安全检测

B站视频 一、架构图 这个设计的核心在于路由表的设计,可以根据下面的架构图示,理解路由流量走向。(我发现公众号对图片压缩特别厉害,暂时没有找到上传原图的办法。如果你和我一样有强迫症,可以找我要高清图片) 实验环境一共有两个VPC,左边的是业务VPC,里面有两个APP模拟HTTP的业务,EC2放在私有子网里面,在不同的AZ。 有一个面向互联网的Network Load Balancer,向公网发布了这个HTTP的服务,这样互联网上的用户,就可以通过NLB访问后面的业务。我们要做的是把这个流量,引导到防火墙上去,做安全检测。这里使用Linux的iptables来模拟防火墙。 另外,APP可以通过NAT GW上网,这个APP主动访问互联网的流量,也需要送到防火墙上去,做安全检测。所以,APP有两种流量都需要送到防火墙上去做安全检测,下面看一下APP的两种流量路径。 一、来自于互联网对NLB访问的流量路径。 1. 首先,互联网上的用户,对NLB的公有DNS发起请求,这个DNS请求,会解析到NLB的两个
22 min read
AWS VPC 流量集中检测系列--(4)利用CloudFormation自动化部署AWS GWLB集成
AWS

AWS VPC 流量集中检测系列--(4)利用CloudFormation自动化部署AWS GWLB集成

B站视频 上一篇文章讲过了AWS GWLB如何集成FortiGate防火墙,来对流量做集中检测。上一次实验是通过AWS 控制台操作的,这里分享一下实验环境的CloudFormation代码,帮助大家快速部署一下实验环境。 一、CloudFormation代码部署 这里的CloudFormation代码在Tokyo区域部署的,如果要在其他Region部署,请修改FortiGate和Windows2022Base的AMI ID(参考我之前的文章《如何寻找EC2特定版本的AMI ID》)。 这次CloudFormation是全自动化代码,堆栈运行完成以后,可以直接测试现象,不需要再做任何额外的配置。默认防火墙使用6.4.10的版本部署,如果要使用7.2.2参考第四部分修改关于防火墙的代码。 AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: ap-northeast-1: FortiGate722: ami-08479d0bce02ca48b
21 min read
AWS VPC 流量集中检测系列--(3)AWS GWLB集成FortiGate防火墙
AWS

AWS VPC 流量集中检测系列--(3)AWS GWLB集成FortiGate防火墙

B站视频 一、背景 之前在《AWS GWLB集成paloalto防火墙》里面提到过,AWS GWLB集成FortiGate防火墙的官方博客[1]缺少一些配置,导致无法实现防火墙的高可用。这篇文档来介绍一下AWS GWLB如何集成FortiGate防火墙。 FortiGate防火墙集成AWS GWLB需要注意: * FortiGate防火墙建议使用6.4.10版本。经过测试目前使用7.0.7版本无法正常工作,但是从6.4.10升级到7.0.7版本,流量是可以正常转发的。另外,不建议对防火墙执行降级操作,防火墙会丢配置,并且图形化界面可能遇到无法切换VDOM的Bug。所以目前生产环境建议使用6.4.10,7.2.2版本可以用于测试。 * FortiGate防火墙建议配置VDOM,Fortigate默认没有带外管理接口,也就是所有接口默认都会转发数据流量,通过配置VDOM可以将管理流量与数据流量分离,从而简化路由配置。 二、Fortigate VDOM FortiGate 中有两种类型的 VDOM 模式—
22 min read
AWS 如何查找EC2实例特定版本的AMI ID
AWS

AWS 如何查找EC2实例特定版本的AMI ID

B站视频 一、背景 在我的CloudFormation代码里面,经常会使用到特定版本的实例。但是在AWS控制台启动EC2实例时,AWS只会提供特定版本的EC2镜像,用户并不能自由选择特定的版本进行启动。要启动特定版本的EC2只能通过AWS CLI或者AWS CloudFormation在代码里面指定ami-id信息然后启动。这里分享一下如何寻找特定版本的ami-id信息。 二、获取AWS控制台提供的镜像ami-id 对于控制台界面能够选择的实例,比较好查找对应的ami-id信息,找到这个ami-id是第一步,后续查找实例的其他版本需要用到这个ami-id。所以先看一下如何获取图形化能选择的实例ami-id。 AWS控制台界面可以通过四种途径启动EC2,分别是: 1. 快速启动(Quickstart AMIs) 2. 我的AMI(My AMIs) 3. 亚马逊云科技Marketplace(AWS Marketplace AMIs) 4. 社区AMI(Community AMIs)。 目前AWS 中国区和AWS Global
8 min read
AWS VPC 流量集中检测系列--(2)利用CloudFormation自动化部署AWS GWLB集成Palo Alto防火墙
AWS

AWS VPC 流量集中检测系列--(2)利用CloudFormation自动化部署AWS GWLB集成Palo Alto防火墙

B站视频 上一篇文章讲过了AWS GWLB如何集成Palo Alto防火墙,来对流量做集中检测。上一次实验是通过AWS 控制台操作的,部署起来还是比较繁琐的,这里分享一下实验环境的CloudFormation代码,帮助大家快速部署一下实验环境。 一、CloudFormation 代码部署 这里的CloudFormation代码在Tokyo区域(ap-northeast-1)部署的,如果要在其他Region部署,请修改paloalto和windows的ami id。堆栈大概会在8分钟创建完成。 AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: ap-northeast-1: PaBundle1: ami-0bcddfc3678d5a897 PaBundle2: ami-0c4d901d7a5370b78 us-west-2: PaBundle1: ami-01d7ef8ff7ddaff25 PaBundle
12 min read
AWS VPC 流量集中检测系列--(1)AWS GWLB集成paloalto防火墙
AWS

AWS VPC 流量集中检测系列--(1)AWS GWLB集成paloalto防火墙

B站视频 一、背景 1.1 参考的博客 这个文档是我的笔记,最开始是对着AWS官方博客[参见链接1]来做实验的,发现无论如何都无法实验成功,后来发现博客里面一个重要参数写错了导致异常。坑出现在原博客[3.2.1 创建PA防火墙实例],里面写到plugin-op-commands=Amazon-gwlb-inspect:enable,应该将Amazon修改为aws,即plugin-op-commands=aws-gwlb-inspect:enable。 测试完paloalto之后,我想测试FortiGate防火墙,飞塔是对这个AWS官方博客[参见链接2]来做实验的,两个拓扑基本一致,只是替换了防火墙,但是发现这篇博客更坑,关键步骤有缺失,无法实现防火墙的高可用切换。后续我会在相同的拓扑下,使用FortiGate防火墙来测试,会填上博客缺失步骤的坑。 这次实验是在AWS Console上操作的,后续我会演示AWS CloudFormation来部署这个环境。 1.2 流量集中检测 传统网络都会在出口部署防火墙,用于检测内网进出互联
21 min read
AWS CloudFormation 系列--(3)Python操作CloudFormation
AWS

AWS CloudFormation 系列--(3)Python操作CloudFormation

B站视频 前面两篇已经对CloudFormation做了快速入门和进阶的学习,但是在创建堆栈的时候,还是在AWS控制台界面导入文本文件。这个文章的目的是介绍如何使用Python来操作CloudFormation,进一步的实现自动化操作。 一、AWS 凭证(Credentials) 1.1、凭证介绍 客户端必须拥有凭证[参考链接1]才能对AWS API进行操作,可以通过多种方式来配置凭证。配置凭证的最佳实践是,如果你在EC2上运行代码,建议使用IAM角色。如果你是用AWS开发工具包(例如Python),建议使用共享凭证文件。后面代码都是使用的共享凭证文件。 Boto3 将在搜索凭证时查找多个位置。Boto3 查找凭据的机制是搜索可能位置的列表,并在找到凭据后立即停止。Boto3 搜索凭据的顺序参考: 1.在boto.client()方法中将凭证作为参数传递 2.创建Session对象时将凭证作为参数传递 3.环境变量 4.共享凭证文件 ( ~/.aws/credentials ) 5.AWS 配置文件 ( ~/.aws/config
6 min read
AWS CloudFormation 系列--(2)常用函数及字段
AWS

AWS CloudFormation 系列--(2)常用函数及字段

B站视频 前面CloudFormation的快速入门,基本了解了如何使用这个服务来创建AWS资源。但是前面写的代码基本只能自己看看,没法分享给别人使用,比如代码里面明确写了EC2的密钥,别人账号里面肯定没有这个密钥,应该让使用者自己选择密钥信息。 所以需要创建更加灵活的CloudFormation模板,这里会介绍一些常见的字段和函数,了解了这些之后,基本上能看懂网络上大部分的CloudFormation代码。 这篇文章知识点比较多,我会先追个介绍,最后会通过一个实验把这些知识点整合起来。下面这个实验环境,和之前快速入门是一样的,但是会通过一些函数和字段,让这个模板更加灵活。 一、DependsOn属性 前面快速入门,讲过了模板里面最重要的资源(Resources)字段。资源字段内部一共有6种属性,这里只介绍最常用的DependsOn属性。 之前创建的环境比较简单,所以没有用到这个属性。如果在两个资源之间有依赖关系时,如果你希望其中一个资源先创建,然后再创建另外一个资源,就可以用DependsOn属性。 CreationPol
15 min read
AWS CloudFormation 系列--(1)快速入门
AWS

AWS CloudFormation 系列--(1)快速入门

B站视频 学习AWS CloudFormation服务,需要具备一定的AWS基础知识,比如在AWS Console上创建过VPC和EC2等资源,因为这个服务就是用代码的方式来创建资源,如果你不会通过图形化的方式创建,那么会很难理解代码。 一、为什么需要AWS CloudFormation服务 利用AWS CloudFormation服务,可以让你通过代码的方式来创建AWS资源,这是AWS的基础架构即代码服务(IaC)。 为什么不在AWS Console界面来创建、删除资源,而是通过代码的方式来操作资源,主要有下面几个优势: 1. 容易分享AWS环境给他人。通过代码的方式分享你的AWS环境,可以确保每次部署都是完全相同的,不用担心一些误操作引起的环境差异。当你需要学习一个新的服务时,经常会看到别人已经搭建好了所有的测试环境,并且分享了CloudFormation的代码,学会看这些代码能帮你提高学习效率。例如学习GWLB时看到这篇文档[参考链接1],节约了很多部署环境的时间。 2. 可以「批量」操作AWS资源。在AWS CloudF
12 min read
AWS Session Manager
AWS

AWS Session Manager

Session Manager介绍 简单来说,Session Manager有点类似于VMware的控制台功能,你可以通过AWS控制台或者AWS CLI连接到EC2上。下面是一段官方文档介绍: AWS Systems Manager 会话管理器是一个新的交互式 Shell 和 CLI,有助于提供安全、访问权限受到控制且经过审计的 Windows 和 Linux EC2 实例管理。使用会话管理器,您无需打开入站端口、管理 SSH 密钥或使用堡垒主机。并且登录的主机可以处于公有子网或者私有子网。 借助会话管理器,您可以提高安全性,集中进行访问管理并接收详细的审计。除了无需打开入站端口之外,您还可以结合使用会话管理器与 AWS NAT Gateway,以便登录处于私有子网的EC2主机。通过使用 AWS Identity and Access Management (IAM) 策略,您可以在一个中心位置授予和撤销对实例的访问权限。提供访问权限后,您可以使用 AWS CloudTrail
5 min read
AWS上配置Cisco ASAv AnyConnect
Cisco

AWS上配置Cisco ASAv AnyConnect

这里演示了如何在AWS上搭建思科的SSLVPN,用来解决员工远程办公的需求。文章需要你有一定的AWS和SSLVPN基础。 1、实验简介 最近一直在研究思科防火墙的SSLVPN,用来解决员工远程办公的问题。传统上一般使用ASA55XX系列的硬件防火墙做SSLVPN,使用ASAv与使用硬件防火墙功能特性几乎没有区别。ASAv在vSphere和AWS环境都可以部署。这里主要介绍一下在AWS上使用ASAv配置SSLVPN的步骤。后续会继续深入去聊SSLVPN上的高级特性。 如果你有配置ASA SSLVPN的经验,需要注意的是AWS上的特殊场景,下面是整个实验的注意事项: * 在中国区如果AWS账号未经过ICP备案则无法使用TCP 80/443端口,所以需要SSLVPN修改默认的443端口号。 * AWS上ASAv为客户端分配的IP地址需要进过NAT转换后才能访问,因为服务器没有回包路由。 * AWS上的Windows2016无法安装ASDM,建议使用Windows2019安装ASDM软件。 * 如果ASAv未购买License会限速100k并且最大会话100个
14 min read