月度归档: 2019年8月

使用AWS的10个最佳实践

最佳实践#1:可伸缩性

基础设施简单、无缝伸缩是在AWS云上运行Workload的最大原因之一。

反面模式1:全容量运行。当发生问题(故障或容量激增),由于没有更多的备用资源可用,用户无法访问应用程序。

反面模式2:手工伸缩。发现服务器满负荷运行,手工启动一个或多个新实例扩容。不幸的是,从启动实例到可以使用之间总是有几分钟的时间,这段时间用户无法访问应用程序。

使用支持可伸缩性的最佳实践,此模式旨在及时预测需求并交付更多容量。Amazon CloudWatch监控解决方案可以检测整个服务器集群的总负载是否达到了指定的阈值。这个阈值可以是“CPU利用率保持在60%以上超过5分钟”,或者任何与资源使用相关的Metric。使用CloudWatch,可以基于特定的应用程序设计自定义指标,根据需要触发伸缩。当触发警报时,EC2 Auto-Scaling会立即启动一个新实例,在达到容量预警前就已准备好实例,为用户提供无缝体验。

确保基础设施每一层的可伸缩性,保证架构能随时应对变化。理想情况下,还应该设计系统Scale-in,以便在需求下降时收缩,这样就无需为不再需要的实例付费。

最佳实践#2:自动化

AWS几乎在基础设施的每一层都提供了内置的监视和自动化工具。利用这些工具确保基础设施能够快速响应变更、自动检测不健康的资源并启动替换资源,并且在资源分配发生更改时及时通知。

在应用体系中引入一种或多种自动化,包括无服务器管理和部署、基础设施管理和部署、警报和事件,自动地提供、终止和配置资源,以确保更具弹性、可伸缩性和性能。

最佳实践#3:使用一次性资源

在传统的IT基础设施环境中,通常提前采购新硬件,使用固定资源,手工登录到服务器、安装软件、修复补丁、配置文件、分配IP地址、测试、运行等。这既昂贵又缺乏灵活性,升级难度更大。

对于长时间运行的服务器,另一个问题是“配置漂移”。随着时间的推移,不同环境中应用变更和软件补丁可能导致配置迥异。

使用AWS设计,可以利用云计算的动态供应特性,将服务器和其他组件视为临时资源。可以启动任意数量的应用程序,只在需要时使用它们。

当出现问题或需要更新时,问题服务器被具有最新配置的新服务器替换。这使资源始终处于一致的状态,并使回滚更容易。无状态结构更易支持这一特点。

反面模式 最佳实践
随着时间推移,不同的服务器终止时具有不同的配置 使用相同配置自动部署新资源
不需要时也在运行 终止不再使用的资源
硬编码IP地址缺乏弹性 自动转到新IP
在运行中的硬件中测试更新很不方便 在新资源测试更新,然后用新资源替代老资源

利用云计算的动态供应特性。这一最佳实践将基础设施视为软件而不是硬件。使用硬件,很容易在特定组件上“买进”太多,这使得在必要时升级变得更加困难。用不同的方式思考资源的使用方式,将之视为容易替换的资源,可以快速响应容量需求的变化、升级应用和管理底层软件。

最佳实践#4:松耦合

传统的基础设施与服务器组紧密集成,每台服务器都有特定的用途。然而,当其中一个组件/层发生故障时,对系统的破坏可能是致命的。如果在一层添加或删除服务器,还必须连接每个连接层上的每台服务器。

如果可能的话,使用松散耦合,可以利用托管解决方案作为系统层之间的代理。在这种情况下,每一层的故障和扩展由代理自动处理。解耦组件的两个主要解决方案是负载平衡器和消息队列。左边的图展示了一组紧密耦合的web和应用服务器。右边的图显示了一个负载平衡器,它在web服务器和应用服务器之间路由请求。

在右侧,如果一个应用服务器宕机,弹性负载均衡器自动将所有流量引导到两个正常的服务器。在左边,如果一个应用程序服务器宕机,在试图访问web服务器和该服务器之间的连接时将导致出错。

最佳实践#5:服务而非服务器

开发、管理和操作应用程序,特别是大规模应用程序,需要各种各样的底层技术组件。使用传统的IT基础设施,公司将不得不构建和运行所有这些组件。

AWS提供了一组广泛的计算、存储、数据库、分析、应用程序和部署服务,帮助组织更快地移动和降低IT成本。

没有利用这种架构的宽度 (例如,只使用EC2)就不会充分利用云计算,并且可能会错过提高开发人员生产力和操作效率的机会。

最佳实践充分利用AWS服务的广泛性,而不是仅使用服务器。

反模式 最佳实践
简单应用持续运行在服务器上 按需提供无服务器方案
应用间直接互相通信 应用间通过消息队列通信
静态web资源存储在本地实例上 静态web资源存储在外部,如S3上
后端服务处理用户授权和用户状态 AWS服务管理用户授权和用户状态

尽管EC2在如何提供解决方案方面提供了极大的灵活性,但它不应该是满足所有需求的第一解决方案。AWS提供的无服务器解决方案和托管服务可以解决许多需求,而无需提供、配置和管理EC2实例。AWS Lambda、Amazon Simple Queue Service、Amazon DynamoDB、Elastic Load balance、Amazon Simple Email Service和Amazon Cognito等解决方案可以更低的成本替换基于服务器的解决方案,取而代之的是配置文件更简单、性能更好的托管解决方案。

 

最佳实践#6:选择正确的数据库

对于传统数据中心,硬件和License会限制数据库方案的选择。在AWS,这些约束被开源的托管数据库消除。AWS提供了数据存储选项,在选择数据库时提供了更大的灵活性,为每个工作负载选择正确的数据库技术。以下问题可以帮助决策在架构中包含哪些解决方案:

  • 这是一个重读、重写还是平衡的工作负载?每秒需要多少读和写?如果用户数量增加,这些值将如何变化?
  • 需要存储多少数据,存储多长时间?这种增长会有多快?在不久的将来会有上限吗?每个对象的大小(平均值、最小值、最大值)是多少?如何访问这些对象?
  • 在数据持久性方面有哪些要求?
  • 延迟需求是什么?需要支持多少并发用户?
  • 数据模型是什么?将如何查询数据?查询本质上是关系型的吗?能否创建更容易伸缩的更平坦的数据结构?
  • 需要什么样的功能?是需要强大的完整性控制,还是需要更大的灵活性?是否需要复杂的报告或搜索功能?开发人员是否比NoSQL更熟悉关系数据库?
  • 数据库许可成本是多少?这些成本是否考虑了应用程序开发投资、存储和使用成本?许可模式是否支持预期的增长?是否可以使用Amazon Aurora等云原生数据库引擎来获得开源数据库的简单性和成本效益?

最佳实践#7:避免单点故障

应假设每一点都可能Fail,设计恢复措施。在可能的情况下,从架构中消除单点故障。但这并不意味着每个组件在任何时候都必须冗余。根据停机SLA,可以只在需要时启动自动化解决方案,或者使用AWS自动替换故障底层硬件的托管服务。

上面这个简单系统显示了连接到单个数据库服务器的两个应用服务器。数据库服务器是一个单点故障。当它不可用或性能下降时,应用程序也会同样受到影响。单点故障需要避免,即使底层物理硬件发生故障或被删除/替换,应用程序应该继续运行。

解决单个数据库服务器问题的常见方法是创建一个备用服务器并复制数据。如果主数据库服务器脱机,备用服务器可以接管负载。注意,当主数据库脱机时,应用程序服务器需要自动将其请求发送到辅助数据库。这又回到了最佳实践#3:将资源视为一次性资源,并设计应用程序来支持硬件更改。

最佳实践#8:成本优化

利用AWS的弹性增强成本效率。需要考虑:

  • 资源大小与负载匹配吗?
  • 哪些指标需要监控?
  • 确保没有使用的资源被关掉;
  • 使用资源的频率;
  • 可以利用托管服务替代现有服务器吗?

AWS的另一个优势是能够匹配成本要求,用运营支出(OPEX)替换资本性支出(CAPEX)。构建基础设施成本的最好方法是确保只支付所需要的东西。

此外, AWS每个服务通常有不同的定价层和模型,或者在每个服务中有不同的配置,可以利用它们来优化成本。

最佳实践#9:合理使用缓存

使用缓存减少冗余数据的检索操作。

缓存是将数据或文件临时存储在请求程序和永久存储之间的中间位置,目的是使将来的请求更快,并降低网络吞吐量。例如,在上面的反面模式中:

1. Amazon S3 bucket没有使用缓存服务

2.三个用户分别从Amazon S3 bucket中请求文件

3.文件以相同的方式交付给每个用户,每个请求花费相同的时间和费用

将其与更好的模式进行比较:

1. 在最佳实践中,在Amazon S3前面提供缓存

2. 在这个场景中,第一个请求检查CloudFront中的文件,找不到时,从Amazon S3中提取文件,并将文件的副本存储在CloudFront中离用户最近的边缘位置

3. 当其他用户请求该文件时,是从CloudFront中较近的边缘位置获取的,而不是从Amazon S3获取的。这样减少了延迟和成本,因为在第一个请求之后,不再需要为Amazon S3传输文件付费

最佳实践#10:安全

安全是第一要务,确保基础设施安全性的保护落实到系统的每一层。需要考虑:

  • 隔离基础设施的各个部分
  • 利用托管服务
  • 加密传输和静态数据
  • 记录访问日记
  • 严格执行访问控制,使用最小权限原则
  • 自动部署以保持安全一致性
  • 使用多因素认证

安全不仅是保护基础设施的外部边界,还要确保各个组件彼此之间是安全的。例如,在Amazon EC2中,可以设置安全组,确定实例上的哪些端口可以发送和接收流量,以及这些流量来自或前往何处。

可以使用此功能来降低单一实例上的安全威胁传播到环境中的其他实例的可能性。其他服务也应采取类似的预防措施。

 

AWS单点应用高可用实践

背景

应用迁移到AWS公有云,通常我们使用ELB实现应用高可用与负载均衡,实际存在部分负载不大,通过EIP发布的应用,如果应用所在EC2出现故障或者可用区出现故障时,应用不可用。 本文介绍了使用AWS服务实现上述场景下应用高可用的方法。

原理

通过EC2自身状态检查功能实现EC2的终止操作。

通过AutoScaling功能实现EC2节点数监控,启动新的EC2实例。

步骤

  1. 创建一个IAM角色,可执行ec2 CLI的命令;
  2. 创建EC2,具有步骤1中IAM角色,部署应用后,绑定EIP;
  3. EC2上创建一个脚本,增加执行脚本到rc.local文件中,实现开机自动绑定EIP,内容如下:

#! /bin/bash

instanceid=`curl 52.83.57.155//169.254.169.254/latest/meta-data/instance-id`

aws configure set region cn-northwest-1 –profile user1

export AWS_DEFAULT_PROFILE=user1

aws ec2 associate-address –instance-id $instanceid –allocation-id eipalloc-090bf95cf8d916786

替换加粗字体部分为实际EIP ID

  1. 测试无问题后,用上述EC2制作AMI镜像文件(每次应用升级制作新的AMI镜像);
  2. 配置EC2 系统状态检查 VS 实例状态检查,当状态异常时,执行终止实例操作;
  3. 基于步骤4制作的AMI创建启动配置,具备步骤1中的角色;
  4. 使用步骤6的启动配置增加Auto Scaling 组,子网指定多可用区多子网,组大小为1;
  5. 将当前EC2增加到步骤7中的Auto Scaling 组,配置完成。

上述配置完成后,当EC2状态异常或者可用区状态异常时,实现应用分钟级的自动化故障切换,增加应用的高可用性。

手把手教你如何使用Terraform操作AWS

Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 “Write, Plan, and create Infrastructure as Code”, 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。

https://img2018.cnblogs.com/blog/952033/201812/952033-20181202095002537-1803290074.png

Terraform 提供了对资源和提供者的灵活抽象。该模型允许表示从物理硬件、虚拟机和容器到电子邮件和 DNS 提供者的所有内容。由于这种灵活性,Terraform 可以用来解决许多不同的问题。这意味着有许多现有的工具与Terraform 的功能重叠。但是需要注意的是,Terraform 与其他系统并不相互排斥。它可以用于管理小到单个应用程序或达到整个数据中心的不同对象。

Terraform 使用配置文件描述管理的组件(小到单个应用程序,达到整个数据中心)。Terraform 生成一个执行计划,描述它将做什么来达到所需的状态,然后执行它来构建所描述的基础结构。随着配置的变化,Terraform 能够确定发生了什么变化,并创建可应用的增量执行计划。

是不是还是很懵逼的感觉,其实一句大白话可以解释他的用处——就是咱们遵循Terraform的代码规范,替代咱们人工在AWS控制台吭哧吭哧的操作各个服务,最大的好处是,对于不熟悉AWS各个服务操作的用户,咱们可以给他写个Terraform脚本,只要执行这个脚本就可以按照客户的要求构建AWS各个服务了,是不是觉得很神奇,废话不多说,直接上代码,感受一下。

关于Terraform

Terraform以单个二进制文件的形式分布。通过解压缩并将其移动到包含在系统路径中的目录中来安装Terraform.

下载安装

Terraform的官方网站是https://www.terraform.io , 在这个网站中,可以轻松的找到的下载地址, https://www.terraform.io/downloads.html

https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_openbsd_amd64.zip

我安装的是Terraform0.126,这个版本对需要集成python 3.6以上.

准备环境

注:我装的是Linux版的环境,其他环境可以由自己测试。

一:首先检查一下你的python环境

  1. python –version,
  2. Python 2.7.8

默认的环境是2.7.8,这个版本太低,需要升级到3.6.8,

1、wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz  下载python

2、tar zxvf Python-3.6.3.tgz 解压

3、cd Python-3.6.3

4、./configure –prefix=/usr/local/python3.6 5、指定安装路径

6、make 编译

7、make install 安装

按照步骤应该没什么问题,在命令行输入python看看版本。
可是依然显示python2.7。

我们需要改变这种默认。为新安装的python3建立软链接

mv /usr/bin/python /usr/bin/python.bak 删除原来指向python2的软链接

ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python

此时再检查一下python的版本

二:安装Terraform

解压Terraform文件后Terraform是个文件

配置Terraform 环境变量

(1)export PATH=”$PATH:/path/to/dir”

(2)source ~/.profile

三:安装aws-cli

  1. sudo pip install –upgrade pip
  2. sudo pip install awscli

总结

此时环境全部准备好了,下面就开始进入Terraform的世界了。

手把手教你如何使用Terraform操作AWS(二)

上文已经详细介绍了Terraform的运行环境了,接下来,咱们开始用Terraform试试手。

一:访问密钥和秘密访问密钥

AWS Access Key ID 和 AWS Secret Access Key 是您的 AWS 凭证。它们与 AWS Identity and Access Management (IAM) 用户或角色相关联,用于确定您拥有的权限。有关如何使用 IAM 服务创建用户的教程,请参阅 IAM 用户指南 中的创建您的第一个 IAM 管理员用户和组

访问密钥包含访问密钥 ID 和秘密访问密钥,用于签署对 AWS 发出的编程请求。如果没有访问密钥,您可以使用AWS 管理控制台进行创建。作为最佳实践,请勿在不必要时使用 AWS 账户根用户 访问密钥执行任务。而是为自己创建一个具有访问密钥的新管理员 IAM 用户

仅当创建访问密钥时,您才能查看或下载秘密访问密钥。以后您无法恢复它们。不过,您随时可以创建新的访问密钥。您还必须拥有执行所需 IAM 操作的权限。

$ aws configure

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE

AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Default region name [None]: us-west-2

Default output format [None]: json

键入该命令时,AWS CLI 会提示您输入四条信息(访问密钥、秘密访问密钥,AWS 区域和输出格式),并将它们存储在名为 default 的配置文件(一个设置集合)中。每当您运行的 AWS CLI 命令未明确指定要使用的配置文件时,就会使用该配置文件。

二:使用Terraform 创建,删改,修改 S3 Bucket

(1).每个 Terraform 项目需要自己单独的目录空间

mkdir terraform

cd terraform

(2).目录下的所有  *.tf 文件都会被 Terraform 加载,在初始化 Terraform 工作空间之前必须至少要有一个 *.tf 文件。我们这里建立文件 terraform.tf, 内容如下

Terraform 配置的语法是该公司 HashiCorp 独创的 HCL(HashiCorp configuration language), 它可以兼容 JSON 格式。

provider “aws” 部分,它指定选用什么 provider, 以及验证信息。aws 既允许指定 access_key 和 secret_key

provider “aws” {
region           = “us-east-1”
access_key  = “your-access-key-here”
secret_key   = “your-secret-key-here”
}

也能够指定证书文件中的 profile

provider “aws” {
region                                  = “us-east-1”
shared_credentials_file  = “~/.aws/credentials”   //不指定的话,默认值是 “~/.aws/credentials”
profile                                  = “………”                        //不指定的话,默认值是 “default”
}

如果是使用 shared_credentials_file 中的 profile, 请确定您以预先生成好的 credentials 文件及有效的 profile。更多关于 AWS Provider 的配置请参考 https://www.terraform.io/docs/providers/aws/index.html

(3)resource “aws_s3_bucket” “s3_bucket” 部分

如果 bucket-test-bucket 不存在的话,运行 terraform apply 将会创建它,否则试图更新该 bucket。此例子只指定了 bucket 的 acl 和 tag 信息。terraform destroy 用来删除已存在的  bucket。

注意:terraform 配置文件中只指定要管理的资源对象,并不关心操作资源的行为–创建,修改,删除操作。操作行为与 Terraform 的状态有关系,无则创建,有则修改,更名会拆分为除旧立新两个操作,terraform destroy 用于显式删除资源。后面实例操作时会讲到。

注:resource “aws_s3_bucket” “s3_bucket” { 中,resource 后第一个是 type, 即资源名,第二个参是 name。在作为变量引用的时候就要用到它,例如在后面要为 Lambda 创建一个 S3 Event 的 Trigger, 就要写成 event_source_arn = “${aws_s3_bucket.s3_bucket.arn}”, 引用时不需要知道实际的名称。

(4)初始化工作目录

在初始化 Terraform 工作目录之前, 其他命令如 apply, plan 多是不可用的,提示需要初始化工作目录,命令是

terraform init

它要做的事情像是 git init 加上 npm install,执行完了 terraform init 之后会在当前目录中生成 .terraform 目录,并依照 *.tf 文件中的配置下载相应的插件。

(5). 执行 Terraform 管理命令

有了前面的准备之后,终于可以开始运行 Terraform 的管理命令了。Terraform 在正式执行之前提供了预览执行计划的机会,让我们清楚的了解将要做什么

terraform plan

由此计划还能知道关于 aws_s3_bucket 有些什么配置项,比如配置中可以加上 acceleration_status = “Enabled”

terraform apply


这样便在 AWS 上创建了一个 S3 bucket “test-bucket”, 同时会在当前目录中生成一个状态文件 terraform.tfstate, 它是一个标准的 JSON 文件。这个文件对 Terraform 来说很重要,它会影响 terraform plan 的决策,虽然不会影响到实际的执行效果。我们可以把它存到远端,如 S3 或 Consul。terraform state [list|mv|pull|push|rm|show] 用来操作状态文件。

总结

  1. 关于Terraform的基本操作也就这几条,很简单吧,下一节,将会加大难度。
  2. 创建 IAM Role, 该 Role 要能操作 Lambda,S3和 CloudWatch
  3. 创建IAM Policy策略,可以操作ec2的所有权限。
  4. 将托管的IAM策略附加到角色。
  5. 创建一个Lambda函数。
  6. 创建一个cloudwatch event rule定时触发Lambda函数。
  7. 创建Lambda权限,允许外部源调用Lambda函数。

 

手把手教你如何使用Terraform操作AWS(三)

本例子中要是用cloudwatch event 来触发lambda函数,给所有的ec2实例打标签。

以下是Lambad代码

接下来的事情全部要交给 Terraform 来完成了,在于怎么写那个 tf 文件,为方便起见我们创建一个 terraform.tf 文件。

第一部分:

(1)首先resource “aws_iam_role” “role” 第一个标签的功能,是创建IAM Role,要求这个用户有执行lamdba的权限。

(2)resource “aws_iam_policy” “policy”,创建一个IAM策略,此策略可以操作所有的ec2的策略。

(3)resource “aws_iam_policy_attachment” “test-attach”,将托管的IAM策略附加到用户、角色和/或组

(4)提供Lambda函数资源。Lambda允许您触发代码的执行,以响应AWS中的事件。

第二部分:

(5)提供CloudWatch事件规则资源。

schedule_expression调度表达式。例如,cron(0 20 * * ?或费率(5分钟)

(6)提供一个资源来创建CloudWatch事件权限,以支持当前帐户缺省事件总线中的跨帐户事件。

(7)之后执行terraform计划,我们知道这些脚本的将要操作哪些资源。

(8)上面创建的东西不想要了,想统统干掉,那就更简单了 terraform destroy 就行了。

AWS实用工具指南–MobaXterm

EC2是AWS中用量最大的服务。基本上每一个AWS用户都会使用EC2,今天我们推荐一款可以方便的远程访问EC2的工具:MobaXterm。

关于MobaXterm

MobaXterm是一款Windows平台的功能强劲的远程访问工具。MobaXterm有免费版和商业版,使用免费版,就能够满足我们远程管理EC2服务器的各种需求。

下载安装

MobaXterm的官方网站是https://mobaxterm.mobatek.net/ , 在这个网站中,可以轻松的找到 MobaXterm的下载地址。

目前,MobaXterm的版本是12.1,我们推荐使用Portable版本。也就是免安装单文件版本。对应的下载地址为

https://download.mobatek.net/1212019080215819/MobaXterm_Portable_v12.1.zip

下载完成后,直接点击解压缩就可以使用了。为了方便,还可以在桌面创建快捷方式。

主要功能

MobaXterm主要功能

从图中可以看到,MobaXterm提供了非常丰富的连接方式支持。不仅包括常见的SSH,Telnet,X-Windows,Windows远程桌面,VNC,FTP,SFTP,串口,还支持微软新推出的WSL, S3,甚至可以模拟不同版本的IE浏览器。

连接EC2的Linux实例

在MobaXterm可以直接使用私钥连接EC2实例。例如,假设某个EC2的IP地址是13.125.72.134,使用的秘钥是soul.pem。那么在MobaXterm中只需要设置一下IP地址,本地私钥的路径和用户名,就可以直接访问 EC2实例了。

连接配置

特色功能

MobaXterm提供了很多实用的特色功能,下面我们将简单介绍其中的几个。

SFTP

在日常的运维中,经常需要在服务器和本地之间上传和下载文件。针对这个需求,MobaXterm提供了一个非常实用的侧边栏文件服务功能。参考附图,当连接到服务器之后,终端窗口的左侧会有一个对应的文件窗口。这个窗口的操作就和FTP客户端一样,可以直接通过拖拽上传和下载文件。特别值得一提的是,在这个窗口下方还有一个特殊的选项,follow terminal folder。勾选上这个选项后,如果在终端中切换目录,左侧的文件窗口也会一起进行目录切换。例如,如果在终端窗口中输入 cd /var,进入/var目录,那么左侧的文件窗口也会自动的切换到/var目录,十分的方便。

文件窗口

录制宏

MobaXterm另外一个特色功能是录制宏,打开录制宏功能后,MobaXterm可以直接记录用户在终端所有的操作。用户还可以方便的对记录好的宏进行编辑、重新执行等操作。

宏管理

分屏展示

在系统维护过程中,另外一个常见的场景是一边查看运行日志,一边运行其他命令,这个时候就需要打开多个窗口。MobaXterm提供了非常方便的分屏展示功能,主要点一下split就可以实现多个终端窗口的分屏显示。

在 MobaXterm另外一个特色功能是录制宏,打开录制宏功能后,MobaXterm可以直接记录用户在终端所有的操作。用户还可以方便的对记录好的宏进行编辑、重新执行等操作。

分屏展示

AWS实用工具指南–S3Browse

S3是AWS提供的云存储服务,官网上S3的介绍是这样描述的:

Amazon Simple Storage Service (Amazon S3) 是一种对象存储,旨在通过 Internet 存储及访问任何类型的数据。

它非常安全,耐用性高达 99.999999999%,并且可扩展过去的几十万亿对象。S3 可用于备份和恢复、分层存档、用户主导型内容(如照片、视频、音乐和文件)、用于大数据分析的数据湖和数据仓库平台,或者作为无服务器计算设计的基础。

说起云存储,最容易想到的应用方式就是网盘,那么有没有工具可以让用户像使用网盘一样使用S3呢,今天我们推荐一款S3的客户端工具:S3Brower。

关于S3Browser

S3Browser是一款windows的S3客户端。S3Browser有免费版和注册版两个版本,使用S3 Browser免费版就可以方便的管理S3存储桶里的文件。

下载安装

S3Browser的官方网站是52.83.57.155//s3browser.com/ , 在这个网站中,可以轻松的找到 S3Brower的下载地址。

目前,S3Browser的版本是8.4.1,对应的下载地址是

https://s3browser.com/download/s3browser-8-4-1.exe

https://netsdk.s3.amazonaws.com/s3browser/8.4.1/s3browser-8-4-1.exe

下载完成后,直接点击安装,一路OK即可。安装完成后,可以在桌面看到S3Browser的图标。

主要功能

S3 Browser主要功能

从图中可以看到,S3Browser的免费版本就提供了非常全面的功能,下面将简单的介绍S3Browser的使用。

账户设置

在使用S3Browser之前,需要在AWS的控制台界面中使用IAM服务为S3Browser创建专门的用户。为了提高安全性,可以用托管权限创建 S3桶的只读用户和S3的管理用户,也可以按照S3桶配置用户和权限。

如下图所示,可以在IAM中建立一个具有S3所有权限的S3Client用户。

添加S3管理用户1

添加S3管理用户2

添加IAM用户后,就可以在S3Browser中添加相应的Account。

在S3Browser中添加新账号

需要注意的是如果是Global的AWS账号那么Account Type选择Amazon S3 Storage,如果是中国区的AWS账号,Account Type需要选择Amazon S3 in China。

为了安全,还可以给账号设置一个密码,并且在传输时使用加密连接。

文件操作

完成账号设置后,就可以开始正式使用S3Browser了。S3Browser的使用和其他网盘客户端软件非常相似,可以批量的对文件进行上传、下载、剪切、复制、删除等各种操作。

需要特别指出是,S3Browser中的所有操作都支持断点续传,S3Browser会自动的进行文件拆分,上传时的块大小为16M ,下载时的块大小为100M。

文件分块下载

【AWS迁移指南】从北京区域迁移到宁夏区域实践分享

2017年底AWS宁夏区域正式开放运营,AWS宁夏区域部分实例价格比AWS北京区域降价近40%,出于成本原因考虑,很多客户希望把自己的业务迁移到AWS宁夏区域。

迁移范围如下:

  • EC2
  • EBS
  • S3
  • RDS
  • ElastiCatch
  • DynamoDB

1.将 EC2从 BJS 迁移至 ZHY

a)从实例创建AMI

在 EC2 控制台中,在左侧选择栏中点击 Instances,在迁移的实例上右键选择 Image -> Create Image。

可以使用 AWS 管理控制台或命令行创建 AMI。

下图总结了从正在运行的 EC2 实例创建 Amazon EBS 支持的 AMI 的过程。从现有 AMI 开始,启动一个实例,自定义该实例,从该实例创建新 AMI,并最终启动新 AMI 的实例。下图中的步骤与下面的过程中的步骤匹配。

 从实例创建 AMI 的工作流程

从实例创建 AMI 的工作流程

具体操作步骤:

b)复制 AMI

可以使用 AWS 管理控制台、AWS Command Line Interface 或开发工具包、或者 Amazon EC2 API(三者都支持 CopyImage 操作)在 AWS 区域内或跨 AWS 区域复制 Amazon 系统映像 (AMI)。可以复制由 Amazon EBS 支持的 AMIs 和由实例存储支持的 AMIs。您可以复制带加密快照的 AMI,并在复制过程中更改加密状态。

复制源 AMI 将生成完全相同但独立的目标 AMI(具有自己的唯一标识符)。对于 Amazon EBS 支持的 AMI,默认情况下其每个支持快照将会复制到完全相同但独立的目标快照。(唯一的例外是在选择加密或重新加密快照时。) 您可以更改或取消注册源 AMI,这不会对目标 AMI 产生任何影响。反之亦然。

复制 AMI 没有任何费用。但要收取标准存储和数据传输费。

AWS 不会将启动许可、用户定义的标签或 Amazon S3 存储桶许可从源 AMI 复制到新 AMI。复制操作完成之后,可以将启动许可、用户定义的标签和 Amazon S3 存储桶权限应用于新 AMI。

复制实例存储支持的 AMI 的权限

如果您使用 IAM 用户复制实例存储支持的 AMI,则用户必须具有以下 Amazon S3 权限:s3:CreateBucket、s3:GetBucketAcl、s3:ListAllMyBuckets、s3:GetObject、s3:PutObject 和 s3:PutObjectAcl。

以下示例策略允许用户将指定的存储桶中的 AMI 源复制到指定的区域。

  1. {
  2. “Version”: “2012-10-17”,
  3. “Statement”: [
  4. {
  5. “Effect”: “Allow”,
  6. “Action”: “s3:ListAllMyBuckets”,
  7. “Resource”: [
  8. “arn:aws:s3:::*”
  9. ]
  10. },
  11. {
  12. “Effect”: “Allow”,
  13. “Action”: “s3:GetObject”,
  14. “Resource”: [
  15. “arn:aws:s3:::ami-source-bucket/*”
  16. ]
  17. },
  18. {
  19. “Effect”: “Allow”,
  20. “Action”: [
  21. “s3:CreateBucket”,
  22. “s3:GetBucketAcl”,
  23. “s3:PutObjectAcl”,
  24. “s3:PutObject”
  25. ],
  26. “Resource”: [
  27. “arn:aws:s3:::amis-for-123456789012-in-us-east-1*”
  28. ]
  29. }
  30. ]
  31. }

具体操作步骤:

c)在ZHY启动实例

从 AMI 启动实例,进入启动实例向导,最后在ZHY启动成功

2.将EBS从 BJS 迁移至 ZHY

a)创建快照

b)跨区域复制快照

image 01

c)在ZHY创建卷

image 01

3.将S3从 BJS 迁移至 ZHY

将S3从 BJS 迁移至 ZHY,您有以下两种迁移方案:

  1. 在宁夏区创建一个新的 S3 桶,将数据拷贝到该桶中。
  2. 删除原数据桶并在宁夏区(目标区)重新创建同名 S3 桶,该方案需要一个临时桶作为转移中转。

a)创建新的S3桶

在 S3 控制台中,点击 Create Bucket,选择宁夏作为桶的可用区,在 Copy settings from an existing bucket 选项中,选择您欲做迁移的 S3 桶,可同步两个桶的配置。

在 CLI 端运行以下命令行,开始复制桶内文件。

aws s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME

image 01

创建临时桶,步骤参见(1)。

在 CLI 端逐步运行以下命令行,将旧 S3 桶中的内容存入临时桶。

aws s3 sync s3://foobucket s3://tmpbucket

在控制台中旧 S3 桶删除,等待24小时后该命名重新生效。

重新在宁夏区注册同名 S3 桶。

在 CLI 端逐步运行以下命令行,将临时桶中的文件存入目标桶。

aws s3 sync s3://tmpbucket s3://foobucket

4.将RDS for MySQL从 BJS 迁移至 ZHY

将RDS迁移到ZHY有两种方案

  • 创建快照部署到其他区域
  • 使用DMS服务

方案一 创建快照部署到其他区域

具体操作步骤:

1.登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

2.在导航窗格中,选择 Databases (数据库)

3.在数据库实例列表中,选择您想拍摄快照的数据库实例。

4.对于操作,选择拍摄快照

此时会显示拍摄数据库快照窗口。

5.在快照名称框中,键入快照的名称。

在左侧导航栏中选择 Snapshot,选中刚创建的快照,Actions选择 Copy Snapshot 复制 RDS快照,并将宁夏区域作为快照复制的目标区域。

image 01

接下来就可以通过快照在宁夏区域恢复RDS服务了

方案二 使用DMS服务

使用DMS可以完成7*24 小时在线的数据库最小停机时间迁移,大致流程如下:

  • 创建复制实例

  • 创建目标和源终端节点

  • 为数据库创建迁移任务

  • 确认迁移

可以通过从 AWS 管理控制台选择正在运行的任务来查看任务的统计数据和监控信息,确认迁移完成情况。

 复制状态

5.将ElastiCatch for Redis从 BJS 迁移至 ZHY

迁移ElastiCatch服务分为两个步骤,将ElastiCatch备份到BJS的S3,复制到ZHY的S3后,进行备份恢复。

步骤一 备份 Redis 服务到S3

创建备份前需要停止写入操作。

在控制台选中希望迁移的 Redis 服务,点击上方的 Backup 按钮创建备份。

image 01

在控制台左侧选择栏中点击 Backups 选项,查看刚创建的备份。

image 01

  • 创建一个 S3 桶用来存储 ElastiCache 备份。
  • 依次选择 Permissions -> Access Control List。
  • 在 Access for other AWS accounts 下, 选择 + Add account。
  • 在窗口内添加对应区域的 canonical id
  • 下述选项勾选Yes: List objects Write objects Read bucket permissions
  • 选择 Save,授权 ElastiCache 读写 S3 桶内文件

步骤二 将备份部署到宁夏区域

  • 将位于北京区的 S3 桶中的备份文件迁移至宁夏区,或下载后上传到宁夏的 S3 。
  • 在宁夏区域建立新的 Redis 服务
  • 在 Import data to cluster 项中填入位于宁夏 S3 桶中的备份文件路径

image 01

6. 将 DynamoDB 服务从 BJS 迁移至 ZHY

方案一 使用自定义 API

可以使用 API 将 BJS 的数据转移到 ZHY,根据需要脚本程序配置参数

具体操作步骤:

  1. from __future__ import print_function
  2. import boto3
  3. import argparse
  4. def replicate(table_name, existing_region, new_region, new_table_name):
  5. “””
  6. Replicate table in new region.
  7. Creates a new table with existing KeySchema and AttributeDefinitions
  8. default read and write capacity units are set to 5. Change it as required.
  9. Parameters
  10. ———-
  11. table_name: string
  12. Name of the existing table to be replicated.
  13. existing_region: string
  14. Region in which the table is present.
  15. new_region: string
  16. Region in which the table needs to be replicated.
  17. new_table_name: string
  18. Name for the new table to be created, if not given
  19. existing table name is used.
  20. “””
  21. existing_table = boto3.resource(
  22. ‘dynamodb’, region_name=existing_region).Table(table_name)
  23. items = existing_table.scan()[‘Items’]
  24. dynamodb = boto3.resource(‘dynamodb’, region_name=new_region)
  25. print(“Creating table ‘{0}’ in region ‘{1}'”.format(
  26. new_table_name, new_region))
  27. table = dynamodb.create_table(
  28. TableName=new_table_name,
  29. KeySchema=existing_table.key_schema,
  30. AttributeDefinitions=existing_table.attribute_definitions,
  31. ProvisionedThroughput={
  32. ‘ReadCapacityUnits’: 5,
  33. ‘WriteCapacityUnits’: 5
  34. })
  35. print(“Table status:”, table.table_status)
  36. table.wait_until_exists()
  37. table.reload()
  38. print(“Table status:”, table.table_status)
  39. print(“Updating table with data…”)
  40. if table.table_status == ‘ACTIVE’:
  41. for item in items:
  42. response = table.put_item(Item=item)
  43. print(“PutItem status:”,
  44. response[‘ResponseMetadata’][‘HTTPStatusCode’])
  45. print(“Total items created:”, table.scan()[‘Count’])
  46. if __name__ == “__main__”:
  47. parser = argparse.ArgumentParser()
  48. parser.add_argument(
  49. ‘-t’,
  50. ‘–table_name’,
  51. type=str,
  52. required=True,
  53. help=”Name of the table to be replicated in new region”)
  54. parser.add_argument(
  55. ‘-r’,
  56. ‘–region’,
  57. type=str,
  58. required=True,
  59. help=”Region in which the table is present”)
  60. parser.add_argument(
  61. ‘-nr’,
  62. ‘–new_region’,
  63. type=str,
  64. required=True,
  65. help=”Region in which the table needs to be replicated”)
  66. parser.add_argument(
  67. ‘-nt’,
  68. ‘–new_table_name’,
  69. type=str,
  70. help=”Name for the new table [Optional], Old table name will be used”)
  71. args = parser.parse_args()
  72. if args.new_table_name is None:
  73. args.new_table_name = args.table_name
  74. replicate(args.table_name, args.region, args.new_region,
  75. args.new_table_name)

终端执行如下代码:

  1. python transferDynamoDB.py -t [source table] -r [source region] -nr [destination region]

方案二 使用 EMR Hive迁移数据到宁夏区域

利用 Amazon EMR创建集群,使用 EMR Hive 将 BJS 数据迁移到 ZHY。

具体操作步骤:

启动 Amazon EMR 集群,并使用SSH连接集群

登入 Hive

在 Hive 创建2个 External table,location 分别指向 BJS 和 ZHY。

CREATE EXTERNAL TABLE hive_table

(hive_column1_name hive_column1_datatype, hive_column2_name hive_column2_datatype…)

STORED BY ‘org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler’

TBLPROPERTIES (

“dynamodb.table.name” = “dynamodb_table”,

“dynamodb.column.mapping” = “hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name…”

);

使用 query 将 BJS 数据复制到 ZHY,可使用 insert into 进行复制,以免覆盖原数据。

数据库迁移完毕后,请及时更改服务器配置。

Amaz Web Services与自购服务器成本对比

AWS与自购服务器成本对比

云计算火起来之后,人们似乎有了“用云便宜,公有云便宜”的观念。

“公有云是不是便宜”这个命题,看似清楚明白,其实很含糊。

比如你说“面包很便宜”的时候,是说比馒头便宜,还是比蛋糕便宜?

是同等重量的面包和馒头比、还是同样体积的?

是切片面包、牛角面包还是夹馅面包?

是新出炉尝鲜的面包、还是快过期大甩卖的?

是面包店卖的,还是超市?

咱们先确定尽量相似的配置。这些需要说明,vCPU是对应到一个超线程,而不是一个核,这一点有时会搞错。

选型 CPU 内存 磁盘
自购戴尔R730 8核/16超线程/2.4GHz 32G 3*300G 15K转
AWS宁夏c5.4xlarge 16 vCPU/3.0 GHz 32G 900G st1

然后看可比价格,戴尔R730京东价格20199元,按5年折旧算;占用机房电力等按IDC托管每年9000估算,三年下来总费用31039万。AWS宁夏c5.4xlarge,配900G st1硬盘,3年价格为30922元。可见,价格基本持平。

如果考虑到AWS提供的可靠性、OS自动升级、自动备份等一系列服务,AWS云的优势就很明显了。

AWS迁移五步法

AWS五步迁移法

根据AWS推荐的最佳实践,已经以往的迁移经验,从本地数据中心或其他云迁移到AWS可以分为下面五步:

图1 AWS推荐的迁移步骤

第1阶段:迁移准备和业务规划

  1. 现状评估:与客户沟通Key Person沟通并了解系统部署情况,存在的问题或不足
  2. 用户目标:业务发展的要求,用户的希望通过迁移解决什么问题,有什么收益?
  3. 差距分析:目标和现在的差异是什么?
  4. 制定行动计划

第2阶段:产品组合发现和规划

当处理一个重大的项目时,最具挑战性的部分是决定从哪里开始。

如果客户已经开始了迁移项目,有明确的选择,这一步会相对简单;但是,如果客户的基础设施分布在多个数据中心或多个团队中,没有一组用于评估应用程序的统一度量标准,则很难确定哪个APP最适合第一波迁移。

我们需要结合正确的数据和正确的专业知识可以帮助客户完成这个阶段。

具体步骤如下:

步骤一:调研当前基础设施情况

  • 收集客户当前基础设施的性能、使用情况、部署情况,进行记录。(包括业务的闲忙时及该期间的使用情况。)
  • 了解业务应用的优先级,系统间的相互依赖度
  • 列出应用程序基础设施清单

步骤二:确定首批迁移的应用

建议首批迁移的应用如下:

  • 与其他业务应用依赖关系最少的应用。这样避免因为迁移原因影响其他业务,造成损失;同时也可以使在迁移的过程中逐步提升对AWS技术的了解和信心,为后续更复杂的应用的迁移打好基础。
  • 从供应过剩或空闲资源最多的应用开始。行业研究表明,多达30%的本地服务器(包括物理服务器和虚拟服务器)都是僵尸(在6个月或更长时间内没有显示出有用的计算活动的迹象)。最重要的是,超过35%的服务器显示活动的时间少于5%。只要在AWS上正确调整云部署的大小,这些应用在迁移之后将看到最大的价格/性能改进。

易于迁移且容易看到效果的应用有以下特点:

  • 应用间依赖关系少
  • 应用服务器有冗余
  • 服务器上的应用程序容量有浪费

迁移过程有挑战的应用有以下特点:

  • 大型的、遗留的应用程序(找不到开发人员或无技术支持的应用)
  • 需要与本地文件系统低延迟连接的应用程序
  • 应用中含有专用设备的应用

步骤三:确定迁移策略

一旦确定了最终状态和将要开始的应用程序,就必须确定迁移策略。根据工作负载情况、应用程序和业务单元,可能有多种不同的策略选择。

实际工作中比较常用的包括:

  • 重新托管(Rehost)。这种方法允许保持应用程序的原样,并在AWS上运行时进行任何必要的调整。这是最快的方法之一,有许多迁移工具可以帮助这个过程。一般情况下,用户首次迁移,又希望快速完成一般建议采用此方法。
  • 修补后迁移。Rehost策略是最简单、最快的方法,也是将其第一个应用程序迁移到AWS的公司最常用的方法。但是,使用这种方法,无法在AWS上看到显著的成本节约,因为无法使用AWS的一些成本节约服务,比如Auto Scaling、托管数据库等等。因此,在这种情况下,一般选择修补后迁移的方式(Replatform),通过选择托管数据库或者将应用程序迁移到 AWS Elastic Beanstalk 等完全托管的平台,以此来减少管理数据库实例花费的时间,获得更大的收益。
  • 部分重构。应用程序的某些方面可以保持原样,但其他部分可能需要重新构建才能在AWS上正常运行。部分重构还可以保留现有的应用程序,并在其上构建额外的支持服务。
  • 完整的重构。重新构建应用程序是最耗时的方法,但它也代表了利用AWS云的灵活性和可用性的最大机会。这也是将应用程序分解为微服务或构建基于容器的体系结构的好机会。很多传统企业上云的时候,由于其应用重新紧耦等原因,需要进行解耦将程序分解成微服务,再进行迁移。

步骤四:团队建设,确定全面的业务计划

许多用户都认为AWS是“容易的”。用户可以在几分钟内启动一个新的AWS实例,但是要构建和管理一个不断增长的AWS环境,则需要与管理任何复杂系统的人员相同的专业知识的专业团队。因此,我们在帮助客户完成迁移的同时,也同样需要帮助用户培训现有技术团队,将经验输出给用户团队,与用户内部技术团队密切配合下构建、迁移和管理用户的云架构。

组建迁移团队后,甲乙双方项目经理将一同对后续的迁移进行计划,并制作预算,计划和预算通过后,双方签订合同,开始正式迁移工作。

在合同签订前,我们的售前工程师将需要根据用户的迁移计划进行后续的服务选型,如选择哪种实例类型,如何最大化投资等等。根据选择的实例类型和服务类型,进行预算,然后提交给客户讨论并确定

第3阶段:迁移设计

在此阶段,项目组的架构设计师将根据用户的业务情况,帮助用户进行以下设计:

整体架构设计

    1. 应该使用哪些实例类型,以及在哪些配置中使用? 查看用于服务器的CPU、内存、网络和磁盘的历史性能数据,以及用于存储的跨吞吐量、容量和IO的性能数据。
    2. 决定希望为每个资产提供多少“可用空间”,然后查看跨这些指标的实际最小、最大和平均使用量,以确定哪种实例类型在AWS上最有意义。当CPU需求在任何1小时的1%以上达到70%以上的峰值时,就会认为虚拟机的大小过小。另一方面,如果在7天的时间内,CPU需求在30%以下的时间内超过1%,则虚拟机被认为是超大的。查看30天的历史记录就足够了,因为如果需要,可以很容易地扩展云上的资源。在进行此过程时,对不同代的物理基础设施进行规范化是至关重要的。确定应该购买哪些保留实例来最大化投资回报率?
    3. 设计AWS体系结构,包括体系结构图和建议服务列表,包括EC2实例、EBS卷、VPC等,以及相关成本。

系统可靠性设计

  1. 收集业务方面对RTO和RPO的要求
  2. 设计系统的高可用性和弹性,可以考虑多AZ部署和Auto Scaling等技术
  3. 数据备份方面需求,进行备份设计
  4. 了解用户对容灾的需求,根据用户的实际情况和经济情况,进行容灾设计

系统安全性设计

  1. 与用户的安全工程师一起设计整体架构的安全性,如果有合规性要求,则同样要求进行合规性设计。
  2. 进行MFA账号设计
  3. 安全组策略设计
  4. 密钥保护设计
  5. 数据安全设计
  6. 操作审计设计

上云后运维管理设计

  1. 运维体系设计
  2. 运维工具设计
  3. 监控指标设计
  4. 自动运维设计

成本设计

  1. 资源购买方式设计
  2. 资源容量选择设计
  3. 自动伸缩设计
  4. 总体拥有成本评估

与甲方的Key Person进行沟通,汇报设计情况,在获得甲乙双方对设计的一致认可情况下,才运行进入后面的迁移实施阶段。

第4阶段:迁移和验证

理想情况下,该过程遵循以下模式:

  • 实施工程师在AWS CloudFormation中构建已批准的架构,这是一个架构模板工具,允许 “构建”一次,然后立即派生出未来的环境
  • 使用AWS提供的机器映像(AMI),并使用Puppet或Chef等自动化配置管理工具为每个应用程序进一步配置
  • AWS CloudFormation模板和Puppet或Chef脚本一起保存在代码存储库(Git)中,并像软件一样进行版本控制和更新
  • 服务器、数据库和数据通过internet(这需要相当多的时间)或AWS迁移服务迁移到AWS
  • 云工程师开始初始测试过程,在此过程中,基础设施可以通过CloudFormation被无数次地拆除/重建。
  • 其他团队测试和验证应用程序性能、安全性、合规性等。

不推荐使用CLI或控制台手动构建AWS资源,会使未来测试/开发环境的构建变得复杂,并导致长期管理问题。

第5阶段:运营及优化

虽然在迁移过程中确定了许多具有成本效益的迁移的关键元素,但是在AWS平台上获得长期成功的关键是不断优化。

在迁移阶段,必然会遇到一些低效的情况。当在测试环境中更改实例以满足应用程序的需求时,将会产生一些意想不到的成本。迁移之后,我们需要有专门的时间对系统进行整体Review,检查这些低效性,提出优化建议。

只有通过在新的基础上进行迭代、关闭旧系统,并向现代化运行模式不断迭代。才能使运营的人员、流程和技术会始终保持最佳状态。

本文参考文献:

1、AWS Migration Whitepaper

浅析AWS的黑科技——Nitro系统

AWS新发布的一系列EC2新实例较以往的产品在性能上有了极大的提升,例如C5实例较C4实例提供了更高的内存与 vCPU 比率,并且性价比提高了25%,对于某些应用程序更是提高了50% 以上的效率。而让人印象较深的是,C5n.18xlarge提供了高达 100Gbps 的网络吞吐量。

如此巨大的提升后面隐藏着怎样的黑科技呢,今年的中国上AWS峰会谜底得以揭晓了——AWS Nitro系统,AWS下一代EC2实例的底层平台。

Nitro系统是AWS2017年发布的一项最新的底层虚拟化技术。目前已经被应用于EC2 M5、C5、R5、T3、I3、A1等实例型号,也将是AWS下一代EC2实例的主要底层平台。

作为公有云技术领头羊的AWS为何会选择了Nitro技术为核心底层技术呢?Nitro系统有哪些神奇之处呢?

为了说明这个问题,我们有必要首先介绍一下AWS虚拟化技术的发展历史。见下图:

在发布Nitro系统之前,AWS使用的是Xen虚拟化技术(从#2到#6)。

上图是发布Nitro之前的EC2型号,是未采用Nitro技术的EC2型号。如图所示,Xen 实现了CPU 和内存的虚拟化,但是虚拟机的I/O 访问是通过前端模块和 DOM0 中的后端模块通信,然后由DOM0 中的后端模块通过设备驱动实现的。结果是业务虚拟机的资源被抢占,I0性能降低。

Nitro技术有效的解决了这些问题。上图是2017年11月发布的C5 实例类型,已经采用了Nitro系统。如图上图所示,AWS使用基于KVM的Nitro Hypervisor 替换了Xen,将存储、网络和安全等功能卸载到专用的Nitro卡上,取消了DOM0。

Nitro系统使得虚拟实例几乎可以获得服务器的所有资源,在提升性能的同时,有效的降低了成本。

Nitro系统包括以下内容:

NITRO卡

Nitro卡是一组硬件卡,可以卸载和加速IO的功能,最终提高整个系统的性能。主要的卡包括Nitro Card for VPC, Nitro Card for EBS, Nitro Card for Instance Storage以及Nitro卡控制器。

NITRO安全芯片

Nitro安全芯片整合到宿主机主板中,控制对所有非易失性存储的访问,持续监控和保护硬件资源。Nitro提供在系统启动时的固件验证。

NITRO Hypervisor

Nitro管理程序是一个轻量级Hypervisor程序,它管理内存和CPU分配,并提供与裸机无异的性能。

由于篇幅关系,以上内容不再展开。总之,Nitro系统提供了密钥、网络、服务器、安全、固件补丁和监控等功能支持,极大的释放底层服务资源供客户的虚拟机使用,从而有效的提升性能的同时,降低了成本。

Nitro系统是一个丰富的构建块集合,可以用许多不同的方式进行组装,使AWS能够灵活地设计和快速交付EC2实例类型,据AWS官网报道:“使用Nitro系统,我们在2018年的出货量几乎是前一年的三倍。”由此可见,Nitro技术是近年来AWS在底层虚拟技术上的重大创新。

关于Nitro技术的更多内容请参见AWS官网:AWS Nitro System

Azure迁移到AWS实战

综述

本文记录了将Azure中运行的虚机迁移到AWS中EC2运行的实战过程。

原理

使用 VM Import/Export 将虚拟机 (VM) 映像VHD文件,作为 Amazon 系统映像 (AMI) 从虚拟化环境导入到 Amazon EC2 中,并用于启动实例。

步骤

1、查询限制条件

在开始之前,需要了解 VM Import/Export 支持的操作系统和映像格式,以及实例和卷的导入限制。参考:

https://docs.aws.amazon.com/zh_cn/vm-import/latest/userguide/vmie_prereqs.html

2、环境中增加中转机

新增Window EC2设备,用于从Azure侧下载镜像VHD文件。

3、Azure VDH文件下载(解决镜像文件大下载不成功问题)

下载Microsoft Azure Storage Explorer,使用Azure 管理员账户登陆,选择需要迁移的虚拟机,执行VHD文件下载。

4、VHD文件上传S3

4.1、创建 S3 存储桶

通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

选择 Create Bucket。

在 Create a Bucket (创建存储桶) 对话框中,执行以下操作:

对于 Bucket Name,键入azuremigration您的存储桶的名称。

对于 Region,为您的 AMI 选择一个区域。

选择 Create。

4.2、创建服务角色

  1. 利用以下策略创建名为 trust-policy.json 的文件:
  2. {
  3. “Version”: “2012-10-17”,
  4. “Statement”: [
  5. {
  6. “Effect”: “Allow”,
  7. “Principal”: { “Service”: “vmie.amazonaws.com” },
  8. “Action”: “sts:AssumeRole”,
  9. “Condition”: {
  10. “StringEquals”:{
  11. “sts:Externalid”: “vmimport”
  12. }
  13. }
  14. }
  15. ]

}

使用 create-role 命令创建名为 vmimport 的角色,并向 VM Import/Export 提供对该角色的访问权。请确保指定 trust-policy.json 文件的完整路径,并且为路径添加 file:// 前缀。

aws iam create-role –role-name vmimport –assume-role-policy-document “file://trust-policy.json”

创建名为 role-policy.json 的文件并编写下面的策略,其中,disk-image-file-bucket为存储磁盘映像的存储桶:

  1. {
  2. “Version”:”2012-10-17″,
  3. “Statement”:[
  4. {
  5. “Effect”:”Allow”,
  6. “Action”:[
  7. “s3:GetBucketLocation”,
  8. “s3:GetObject”,
  9. “s3:ListBucket”
  10. ],
  11. “Resource”:[
  12. “arn:aws:s3::: azuremigration“,
  13. “arn:aws:s3::: azuremigration/*”
  14. ]
  15. },
  16. {
  17. “Effect”:”Allow”,
  18. “Action”:[
  19. “ec2:ModifySnapshotAttribute”,
  20. “ec2:CopySnapshot”,
  21. “ec2:RegisterImage”,
  22. “ec2:Describe*”
  23. ],
  24. “Resource”:”*”
  25. }
  26. ]

}

使用下面的 put-role-policy 命令将策略挂载到之前创建的角色。请务必指定 role-policy.json 文件位置的完整路径。

aws iam put-role-policy –role-name vmimport –policy-name vmimport –policy-document “file://role-policy.json”


4.3、将映像上传到 Amazon S3

安装AWS CLI,执行命令:aws s3 cp xxx.vhd s3://azuremigration/,完成镜像上传。

4.4、导入 VM镜像

将您的 VM 映像文件上传到 Amazon S3 后,使用 AWS CLI 导入该映像。

aws ec2 import-image –description “bishuiyuantest” –disk-containers “file://containers.json”

下面是一个 containers.json 示例文件。

[

{

“Description”: “bishuiyuantest-1”,

“Format”: “vhd”,

“UserBucket”: {

“S3Bucket”: “azuremigration”,

“S3Key”: “jiayuefeng0320190509094710.vhd”

}

},

{

“Description”: “bishuiyuantest-2”,

“Format”: “vhd”,

“UserBucket”: {

“S3Bucket”: “azuremigration”,

“S3Key”: “jiayuefeng03-disk-0-20190509094710.vhd”

}

}

4.5检查导入任务的状态

使用 describe-import-image-tasks 命令返回导入任务的状态。

包括的状态值如下:

  • active — 正在运行导入任务。
  • deleting — 正在取消导入任务。
  • deleted — 导入任务已取消。
  • updating — 导入状态正在更新。
  • validating — 正在验证导入的映像。
  • validated — 已验证导入的映像。
  • converting — 正在将导入的映像转换成 AMI。
  • completed — 导入任务已完成,并且 AMI 已准备就绪,随时可以使用。

aws ec2 describe-import-image-tasks


5、启动VM

基于当前镜像文件启动对应的VM,完成业务节点迁移。

AWS EBS卷RAID0配置与实测

文档概述:

RAID 0 又称为Stripe(条带化),将多个硬盘合并成一个大硬盘,不具有冗余,并行I/O。在存放数据时,将数据按磁盘个数进行分段,然后同时将这些数据写进磁盘中。在所有RAID级别中,RAID 0速度是最快的,为取得比通过单个卷取得的 I/O 性能更高的 I/O 性能,RAID 0 可将多个卷组合在一起。

AWS EBS卷同样也支持RAID 0的配置。本文将介绍AWS EBS卷RAID 0相关配置及实测磁盘吞吐量,仅供参考。

常见RAID配置选项:

比较常见的RAID配置如下表所示:

配置 使用 优点 缺点
RAID0 当 I/O 性能比容错能力更重要时;例如在频繁使用的数据库中 (其中,已单独设置数据复制)。 I/O 在卷内以条带状分布。如果您添加卷,则会直接增加吞吐量。 I/O 在卷内以条带状分布。如果您添加卷,则会直接增加吞吐量。
RAID1 当容错能力比 I/O 性能更重要时;例如在关键应用程序中。 在数据持久性方面更具安全性。 不提供写入性能改进;需要比非 RAID 配置更大的 Amazon EC2 到 Amazon EBS 带宽,因为数据将同时写入多个卷。

背景介绍:

一台AWS Linux EC2实例,根存储卷大小为默认8GB ,还挂载了4块未使用的EBS卷,分别为nvme3n1 33GB、nvme1n1 10GB、nvme2n1 10GB、nvme4n1 13GB。所有卷的IOPS大小均为100.

RAID0配置:

将其中3块盘创建RAID0条带化。

mdadm –create –verbose /dev/md0 –level=0 –name=RAID0 –raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme4n1

RAID0配置细节信息。mdadm –detail /dev/md0

创建文件系统。mkfs.ext4 -L RAID0 /dev/md0

创建挂载点,并挂载 mkdir -p /mnt/raid0 mount LABEL=RAID0 /mnt/raid0

增加/etc/fstab条目,设置开启自启动后执行mount –a 无报错即可,如下图示。

注:不要注释UUID的行

为卷拍摄快照并测试数据完整性:

创建测试文件,生成一个1GB的文件,吞吐量为215MB/s

快照3块ebs卷,启动一台新ec2,将快照挂载

可看到自动创建raid元设备md127.创建目录挂载即可,数据也可以恢复

测试磁盘吞吐量:

吞吐量测试命令 dd if=/dev/zero of=here bs=1G count=1 oflag=direct
RAID 0 20GB大小 (2块盘) 吞吐量:205MB/s
标准存储

根卷20GB(1块盘)

吞吐量:141MB/s
标准存储

根卷8GB(1块盘)

吞吐量:145MB/s
RAID 0配置

33GB大小 (3块盘)

吞吐量:215MB/s
标准存储

33GB卷(1块盘)

吞吐量:146MB/s

实测结论:

  1. 对于33GB以下的标准EBS存储,IOPS 为100。最大吞吐量实测为140MB/s
  2. 对于将3个卷制作成RAID0方式(大小在33GB以下),吞吐量实测为210MB/s
  3. RAID0配置若坏一块盘,数据则会丢失,应定期拍摄快照
  4. RAID0适合于大规模并发读写,但对数据安全性要求不高场景中

泰岳云服务-安全技术讨论

从传统数据中心时代,安全一直是最大的问题,建立独立机房、物理隔离设备、部署防火墙、多重安全认证、建立DMZ区、架设堡垒机,使用跳板机等都是为了安全所投入的必需成本。当泰岳云服务带着他的技术扑面而来时,安全是泰岳云服务主要亮点之一。这次我们就安全分享下心得体会:

1. 安全不是等待的事情

泰岳云服务的一大亮点,就是安全的主动检测和主动出击。传统式的安全防御,只会不停增加防御功能,提高防御技术,设置各种屏障,等待攻击或者入侵的到来。泰岳云服务能够主动检测,对所有用户基于地理位置的异地登录检测、登录频率异常检测、账号异常状态检测、重要操作检测和控制,做到无时无刻的主动检测。同时对于某一IP或者区域的异常流量或者被认定为蛮力攻击的行为,在最初检测到后,采取主动出击,屏蔽区域异常IP,记录日志信息追踪,做到大量攻击到来之前先削弱后续攻击力度。

2. 安全关乎你做的每件小事

安全问题很大部分并不是正面的DDoS攻击,泰岳云服务有着强大的DDoS主动检测、缓解和防御能力,攻击者大部分都是拼尽全力后无功而返。然而账号安全也是安全的一大重点,可能你在几十个网站注册过账号,为了便于记住使用了同样的密码或者相近的密码,关键在于一些安全力度不够的网站往往泄露密码,攻击者使用泄露的账号密码大量尝试在其他安全网站正常登录,我们称为“凭证填充”,正常网站无法识别你是否是你,只能认为正常登录,这就好像马奇诺防线一样,虽然泰岳云提供的服务足够安全,但是攻击者也会找到薄弱的部分攻击。我们建议使用泰岳云服务的多重身份认证,在登录重要账号时,需要手机验证码或者手机应用二次授权,保障安全。

3. 安全也可以很智能

没有一成不变的安全环境,安全也需要随着时间和攻击不断进化,泰岳云服务的安全服务,可以通过机器学习,人工智能等,不停的自我更新完善,自动更新安全补丁,自动更新威胁检测规则,持续监控恶意活动和未经授权的行为,并且通过收集这些信息更改策略,快速适应新的环境,加固安全壁垒。再加上泰岳云服务安全团队全天的不间断支持,使安全不单单是坚固的城墙,而是美队的盾牌、钢铁侠的铠甲、绿巨人的短裤,坚不可催,亦可给予反击。

最后最重要一点
安全要找专业的来做,这样您就可以高枕无忧,享受工作生活乐趣