亚马逊AWS官方博客

by AWS Team | on |

自动化部署服务——CodeDeploy快速入门    24 Apr

手把手教你在FPGA实例上运行“Hello World”    24 Apr

带您玩转Lambda,轻松构建Serverless后台!    11 Apr

使用Sqoop实现RDS MySQL到Redshift的数据同步    7 Apr

AWS CodeDeploy    7 Apr

CrowdTangle经验谈:如何立足AWS构建SaaS解决方案    24 Mar

Amazon EBS弹性卷修改实践    27 Feb

利用Mycat中间件实现RDS MySQL的分库分表及读写分离功能    26 Feb

使用AWS控制台或命令行将AWS IAM角色附加到现有的Amazon EC2实例中    26 Feb

巧用Amazon EMR节省数据分析成本    14 Feb

利用Amazon Redshift构建新一代数据分析BI系统    13 FEB

Capital One 与Alexa – 看美国银行业如何玩转人工智能    9 Feb

AWS文件存储网关初体验  6 Feb

Amazon DynamoDB 让海量数据管理变为可能    6 Feb

使用Amazon CloudFront签名URL+S3实现私有内容发布    23 Jan

AWS Snowmobile——在数周内将数EB数据迁移至云端     22 Jan

AWS Snowball Edge——更多存储容量、本地端口与Lambda函数    19 Jan

敬请期待——Amazon EC2 Elastic GPU    18 Jan

从IaaS到FaaS—— Serverless架构的前世今生    18 Jan

通过AWS目录服务管理AWS资源    18 Jan

Token Vending Machine:移动应用客户端安全访问AWS服务的解决方案(更新)    13 Jan

利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶    12 Jan

Amazon Aurora Update – PostgreSQL 兼容性   6 Jan

Amazon Lightsail – 兼具 AWS 的强大功能与 VPS 的简易性    5 Jan

实力省钱,总有一款适合您    5 Jan

2016


如何在1个小时之内轻松构建一个Serverless 实时数据分析平台    30 Dec

AWS Limit Monitoring ——书到用时方恨少,资源提限需趁早!    29 Dec

Amazon Polly – 支持47种语音与24种语言的文本到语音转换服务  19 Dec

开发者预览版——EC2实例(F1)携手可编程硬件    19 Dec

Amazon Lex – 构建对话语音与文本界面    15 Dec

如何在AWS上安装使用分布式TensorFlow    13 Dec

New feature launched to AWS China (BJS) region, operated by SINNET – Amazon RDS for SQL Server – Support for Native Backup/Restore to Amazon S3    5 Dec

由光环新网运营的AWS中国北京(BJS)区域现推出新RDS功能–支持SQL Server 本机备份/还原到Amazon S3   27 Nov

Amazon S3 和 Amazon Glacier 降价    27 Nov

构建健壮的混合云网络——BJS DX+VPN篇    23 Nov

构建健壮的混合云网络——BJS DX篇    23 Nov

构建健壮的混合云网络——BJS VPN篇    23 Nov

GPU为 Amazon Graphics WorkSpaces 提供助力    21 Nov

Amazon QuickSight全面上线——更快更易用的大数据商务分析服务    21 Nov

Amazon EC2 产品价格调降通知(C4,M4, 和T2实例)    21 Nov

利用 CloudWatch 搭建无人值守的监控预警平台    16 Nov

一键搞定云端网络环境,让您轻松迁移至AWS!    9 Nov

程序员的深度学习入门指南    07 Nov

如何在 AWS上构建基于 OpenSwan 的软件 VPN 解决方案    01 Nov

AWS的在线云计算专家,你用了吗?    31 Oct

CloudFront常见错误配置及解决方法    25 Oct

使用DMT工具迁移北京区域的数据库    18 Oct

VPC中NAT的那点事     17 Oct

CloudWatch Events监控您应用的安全    8 Oct

Oracle数据库迁移到AWS云的方案    28 Sep

使用AWS的数据库迁移DMS服务    28 Sep

手把手教你使用Amazon EMR进行交互式数据查询    27 Sep

使用Oracle Data Pump将数据库迁移到AWS的RDS Oracle数据库    26 Sep

手把手教你快速部署流量压测工具 – Bees with Machine Guns    26 Sep

优秀的领导者如何更进一步迈向伟大?    24 Sep

现代IT高管已然化身首席变革管理官    24 Sep

利用云方案进行实验时的四要与四不要    24 Sep

来自成功云企业的十项诀窍    24 Sep

助你决胜云时代的人才其实近在眼前    13 Sep

手把手教你如何用Lambda + Alexa调用echo设备    01 Sep

AWS Kinesis的Javascript交互方法    25 Aug

基于AWS 平台跳板机配置    08 Aug

如何使用AWS 命令行分段上传大文件    02 Aug

我喜欢我的Amazon WorkSpaces    02 Aug

算法改变世界 - 从Prisma 的走红说开去    02 Aug

为员工进行云培训时的11条箴言    07 Jul

畅谈CIO该如何合并业务和技术    07 Jul

协同合作伙伴 合力加速上云战略    07 Jul

在云端试验时的“有所为和有所不为”    07 Jul

专线直连AWS建立混合IT环境实务指南    01 Jul

手把手教你调校AWS PB级数据仓库    20 Jun

Token Vending Machine:移动应用客户端安全访问AWS服务的解决方案    20 Jun

分布式神经网络框架 CaffeOnSpark在AWS上的部署过程    16 Jun

打造DIY版Echo:树莓派+ Alexa 语音服务    01 Jun

使用Docker封装IPSec安全网关    30 May

将VMware 中的Ubuntu 12.04 映像导入成Amazon EC2 AMI    30 May

如何使用AWS Auto-reboot和Auto-recovery进一步提升单机高可用    16 May

AWS CTO对过去十年的经验总结 – 十条军规    12 Apr

AWS上的游戏服务:Lumberyard + Amazon GameLift + Twitch    12 Apr

为AWS北京区管理控制台集成ADFS访问    12 Apr

AWS的十年创新之路    12 Apr

空荡的数据中心,120种妙用!    12 Apr

媒体洞察 | 让企业自由发展的云时代    12 Apr

亚马逊 风力发电厂在福勒岭启动了!    12 Apr

自动化部署服务——AWS CodeDeploy 快速入门

by AWS Team | on |

作为DevOps和微服务的深入践行者,Amazon在内部积累了许多持续集成、交付和部署的自动化工具和平台。其中, Apollo作为代码部署的自动化平台,每年进行超过5000万次部署。

为了能够让广大开发者和企业用户使用到功能丰富且久经考验的代码部署平台,在Apollo的经验基础上,AWS发布了自动化部署服务——CodeDeploy。

平台介绍

AWS CodeDeploy旨在帮助用户完成应用的快速部署,按照用户指定的策略将代码部署在一组EC2服务器上。用户策略可以包括集群部署速度、部署事件通知、警报处理策略等。此外,CodeDeploy还可以和弹性负载均衡(Elastic Load Balancer)、自动扩展组(Auto Scaling Group)等服务结合,完成无缝升级和动态部署。

为方便有效地组织部署任务,CodeDeploy设立了三个概念:应用(Application)、部署(Deployment),以及部署配置(Deployment Configuration)。

1)应用程序(Application)

应用程序是部署的核心,由部署组(Deployment Group)和代码修订(Revisions)组成。一个应用可以包含多个部署组,一个部署组又可以包含多台EC2服务器。同时,一个服务器也可以属于多个部署组,因为一个服务器可能同时运行多个应用。

1.1)部署组

创建或修改部署组时,如果添加EC2服务器,可以通过标签(Tag)对已有的EC2服务器进行筛选。所以,在创建EC2时一定要打上标签(Tag),便于在创建应用的部署组时找到对应业务的服务器。

此外,部署组还可以添加自动扩展组(Auto Scaling Group),以及用户自己机房的主机(On-Premise Instance)。

1.2)代码修订

代码修订保存了当前应用涉及到得所有代码,代码的存放位置可以在S3或Github。

如果用户自建代码托管,当需要部署时,可以在工作机上同步代码到本地,然后使用AWS命令行进行打包上传。

aws deploy push --application-name <MyAppName> \

      --s3-location s3://<MyBucketName>/<MyNewAppBundleName> \

      --source <PathToMyBundle>

上面的命令可以将运行目录下得代码打包上传到S3,同时显示在关联应用的代码修订一栏中。

2)部署(Deployment)

每一次部署都有唯一的ID标记,并保存所有信息,如代码来源、部署时间、目标服务器、部署结果等。并且针对每一台服务器,都可以详细查看部署过程中的事件(如下载程序、安装前检查、 程序启动、安装后检查等7个事件),以便追踪部署的各个步骤。当部署出错时,可以快速定位和排查。

3)部署配置(Deployment Configuration)

部署配置存放了一次部署的服务器台数或百分比,在发起部署时需要指定所需配置。CodeDeploy默认提供了三种配置:一次部署一台、一次部署一半数量的服务器,以及一次完成全部部署。部署发起后,CodeDeploy会按照上述策略进行工作,指导完成部署组内全部服务器的更新。

如果用户要自定义部署策略,建议使用命令行完成。比如下面的例子创建的配置就是一次完成20%的服务器部署。

aws deploy create-deployment-config --deployment-config-name ThreeQuartersHealthy --minimum-healthy-hosts type=FLEET_PERCENT,value=20

此外,CodeDeploy还可以管理物理主机(或第三方主机)。只要在物理主机上安装和配置CodeDeploy Agent,Agent向CodeDeploy注册完成后,CodeDeploy就可以像管理 EC2服务器一样在物理服务器上部署应用。

服务器配置

CodeDeploy是通过与部署在服务器上的Agent通信,实现代码部署的。

1)服务器角色

由于Agent需要访问S3下载代码,所以EC2服务器需要配置角色(Role)以保证Agent对S3的读取权限。创建一个IAM Policy包含如下内容,在创建所需的角色关联这个Policy。然后,在创建EC2服务器时,关联此角色。

{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Action": [

        "s3:Get*",

        "s3:List*"

      ],

      "Effect": "Allow",

      "Resource": "*"

    }

  ]

}

2)Agent安装

Agent可以在创建EC2时通过User Data安装,也可以登录到服务器上安装。

如果使用User Data安装,模板如下:

#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://bucket-name/latest/install . --region region-name
chmod +x ./install
./install auto

其中,关于bucket-name和region-name,请查阅下面链接,找到对应Region的替换名称。

https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-set-up-new-instance.html

例如,北京Region的User Data是:

#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-cn-north-1/latest/install . --region cn-north-1
chmod +x ./install
./install auto

如果是选择先创建EC2服务器,再安装Agent,请注意使用sudo以root权限安装。详情请见:

https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html

部署完成后,使用如下命令检验Agent是否工作正常。

sudo service codedeploy-agent status

用户端配置

建议AWS命令行工具(https://aws.amazon.com/cn/cli/),作为开发流程工具,CodeDeploy的功能可以通过命令行快速完成,而不必使用图形界面。安装完成后的配置方法请参考:https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html

如前文所述,用户可以通过aws deploy push命令来完成代码打包上传。但打包内容除了应用程序代码外,还包含了一个AppSpec.yml文件和一些用于处理安装中一个或多个事件的脚本。

AppSpec.yml脚本不仅定义了代码部署的路径,而且指定了部署过程中相关事件的处理脚本。部署事件有7个,可以按需选择指定。

用户把代码、AppSpec.yml、事件脚本通过aws deploy push命令打包上传后,用户就可以通过CodeDeploy图形化平台选择对应的代码修订(Revision)进行部署了。当然,继续使用命令行进行部署,更是高效的方法。

此外,CodeDeploy还可以和常见的持续集成工具协同工作,如Jenkins、Travis CI等。

案例分享

GILT是一家专注服饰的电商平台,成立于2007年,总部位于纽约,员工超过1000人。 2016年1月,GILT以2亿5千万美金的价格被收购。

GILT的特色业务之一就是促销,并且是在每天中午开售。为了能够灵活、快速地应对业务压力,GILT的DevOps团队基于微服务来设计和部署平台,并采用了Docker提高平台的弹性。其部署平台经历过数次演化,目前是第五代平台NOVA(代码已开源)。CodeDeploy在最新一代的平台中,结合Cloudformation完成核心部署工作,NOVA通过AWS API/SDK完成对CodeDeploy和Cloudformation的调用。

扩展阅读
The Story of Apollo – Amazon’s Deployment Engine

http://www.allthingsdistributed.com/2014/11/apollo-amazon-deployment-engine.html

AWS Codedeploy plugin for Jenkins

https://wiki.jenkins-ci.org/display/JENKINS/AWS+Codedeploy+plugin

AWS CodeDeploy for Travis CI

https://docs.travis-ci.com/user/deployment/codedeploy

GILT NOVA

https://github.com/gilt/nova

 

作者介绍

代闻

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在大规模后台架构、物联网应用、媒体行业转型、企业混合IT和自动化运维等方面有着广泛的设计和实践经验。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。曾任IBM中国软件开发中心软件工程师,从事企业软件和移动平台的开发工作。

手把手教你在FPGA实例上运行“Hello World”

by AWS Team | on |

前言

在4月19号的旧金山AWS技术峰会上,亚马逊CTO Werner Vogels宣布了多项AWS新功能,其中就包括众人期待已久的FPGA实例F1。

F1 实例配有最新的 16 nm Xilinx UltraScale Plus FPGA,目前有f1.2xlarge和f1.16xlarge两种类型,其中f1.2xlarge配备有1个FPGA卡, f1.16xlarge配备有8个FPGA卡。

使用 F1 实例部署硬件加速在许多高性能计算 (HPC) 应用程序中非常有用,可解决需要高带宽、增强型联网和较高计算能力的复杂科学、工程和业务问题。F1 实例尤其适用于有时间要求的应用程序,如临床基因组学、实时视频处理和财务风险分析。

因为这段时间都在学习神经网络,所以F1实例最吸引我的是在FPGA上部署神经网络模型,神经网络的前向计算以高频脉冲的方式同时发生在门电路构成的神经网络单元上,想想都让人激动。

不过FPGA这个东西确实太专业了,入门学习曲线不是一般的陡,启动F1实例运行一个简单的Hello World都需要折腾一番。

所以在这里记录一下自己启动F1实例运行Hello World的过程,供各位参考,希望可以让大家开始开始FPGA的旅程。

启动f1实例

f1实例的启动过程和一般的EC2启动过程类似,有关AWS账号的准备,EC2创建过程的细节请大家参考相关技术文档。以下只列出一些需要注意的地方。

测试时我选择了“弗吉尼亚北部”这个区域,也就是us-east-1区域。

启动f1实例时强烈推荐使用 AWS FPGA Developer AMI 镜像, FPGA Developer AMI 包括一个预先打包的工具开发环境,其中含有用于模拟 FPGA 设计、编译代码及构建和注册 AFI 的脚本和工具。

在启动实例的第一步,选择系统镜像的时候选择“AWS Marketplace”,然后搜索“FPGA”就可以找到FPGA Developer AMI, 该镜像在弗吉尼亚北部区域的ID为:ami-3afc6f2c,镜像选择界面截图如下。

启动过程中注意给你的实例指定一个IAM Role, 后续使用AWS CLI命令行工具的时候就需要配置静态的Access Key和Secret Key了。

还有就是安全组配置,缺省的22号端口保留打开状态,另外建议开3389端口,后续如果你希望使用远程连接的方式使用图形化界面需要用到这个端口。

还有一个不需要再强调的就是你启动的f1实例需要有公有IP。

系统登录

在f1实例启动后在EC2控制台上找到这台实例的公有IP地址,然后通过ssh命令连接该实例,注意使用的用户名是centos, ssh命令样例如下:

ssh -i ~/.ssh/<mykey.pem> centos@<ip address>

登录以后可以看到下面的信息:

 ___ ___  ___   _     ___  _____   __    _   __  __ ___
| __| _ \/ __| /_\   |   \| __\ \ / /   /_\ |  \/  |_ _|
| _||  _/ (_ |/ _ \  | |) | _| \ V /   / _ \| |\/| || |
|_| |_|  \___/_/ \_\ |___/|___| \_/   /_/ \_\_|  |_|___|
AMI Version:        1.2.0
Readme:             /home/centos/src/README.md
GUI Setup Steps:    /home/centos/src/GUI_README.md
AMI Release Notes:  /home/centos/src/RELEASE_NOTES.md
Xilinx Tools:       /opt/Xilinx/
Developer Support:  https://github.com/aws/aws-fpga/blob/master/README.md#developer-support

注意这里提到的GUI设置说明文档: /home/centos/src/GUI_README.md,如果你后续希望使用图形化界面,请参考这个文档进行操作。

克隆AWS FPGA项目

在远程f1实例上创建一个工作目录,在该工作目录下执行以下命令克隆AWS FPGA 项目:

git clone https://github.com/aws/aws-fpga.git

执行完成以后可以看到一个aws-fpga目录

安装 FPGA SDK

进入aws-fpga目录,然后执行以下命令安装FPGA SDK:

source sdk_setup.sh

安装命令执行完以后会有以下输出,表示安装成功:

Done with SDK install.
Done with AWS SDK setup.

这个过程会安装好FPGA管理工具,通过这个管理工具可以查看FPGA卡的情况,列出FPGA卡上的镜像情况,还可以执行加载镜像等操作。

首先我们可以通过fpga-describe-local-image-slots命令查看FPGA卡的情况,这里就是FPGA的“image slot”的情况,具体命令请如下:

sudo fpga-describe-local-image-slots -H

在我的 f1.2xlarge 实例上有如下输出:

$ sudo fpga-describe-local-image-slots -H
Type  FpgaImageSlot  VendorId    DeviceId    DBDF
AFIDEVICE    0       0x1d0f      0x1042      0000:00:1d.0

这里列出的就是slot 0的情况,接着你可以使用fpga-describe-local-image-slots命令查看这个slot上的FPGA镜像情况:

sudo fpga-describe-local-image -S 0

其中参数 -S 用于指定希望查看的image slot,参数值就是FPGA image slot的编号。

如果你希望将新的FPGA镜像加载到一个image slot上, 你可以使用命令 fpga-load-local-image, 同时通过参数 -S指定image slot的编号,通过-I参数指定需要加载的FPGA镜像ID,如:

sudo fpga-load-local-image -S 0 -I agfi-0123456789abcdefg

有关FPGA管理工具的更多信息,请参考以下链接:

https://github.com/aws/aws-fpga/blob/master/sdk/userspace/fpga_mgmt_tools/README.md

安装FPGA HDK

安装好FPGA的SDK以后就需要安装FPGA HDK了,具体的安装命令如下:

source hdk_setup.sh

这个过程稍长一点,可能需要5到10分钟,执行的命令的时候输出结果中也有提示:

AWS FPGA-INFO:   This could take 5-10 minutes, please be patient!

如果一切正常,安装成功后会有如下信息:

AWS FPGA-INFO: DDR4 model build passed.
AWS FPGA-INFO: ATTENTION: Don't forget to set the CL_DIR variable for the directory of your Custom Logic.
AWS FPGA-INFO: AWS HDK setup PASSED.

如成功信息里提示的,如果你以后要构建自己的FPGA模块,需要将CL_DIR变量指向你的模块目录,我们在后续的步骤中会进行设置。

配置 AWS CLI

因为FPGA镜像创建过程需要使用AWS CLI命令行工具,所以我们需要提前配置好AWS CLI。

在我们使用的这个FPGA Developer AMI中AWS CLI命令行工具已经安装好了,如果你使用其它镜像需要手工安装AWS CLI的话请参考AWS CLI命令行工具的安装文档。

需要注意的时,虽然在FPGA Developer AMI中已经安装好了AWS CLI,但是这个版本不一定是最新的,所以建议通过以下命令先进行升级:

pip install --upgrade --user awscli

然后就通过以下命令启动AWS CLI配置过程:

aws configure

在配置AWS CLI的过程中一般需要提供Access Key和Secret Key,不过我们的f1实例在启动过程中制定了IAM Role, 而且我给这个IAM Role足够的权限,所以我们这里不需要配置静态的Access Key和Secret Key,我们要做的只是指定区域,这里我们指定区域为us-east-1。

$aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-east-1
Default output format [None]:

构建DCP

安装好HDK,配置好工具,就可以开始跑样例了,这里我们使用AWS FPGA项目里的hello world样例,该样例在aws-fpga中的以下目录中:

./hdk/cl/examples/cl_hello_world

如之前安装过程中提到的,如果我们使用目录./hdk/cl/examples/cl_hello_world中的样例,我们需要设置CL_DIR变量指向./hdk/cl/examples/cl_hello_world目录,具体命令如下:

cd ./hdk/cl/examples/cl_hello_world
export CL_DIR=$(pwd)

接下来的工作需要使用Xilinx Vivado工具,所以我们需要检查一下vivado工具是否安装正常,具体命令如下:

$ vivado -mode batch

正常的输出如下:

****** Vivado v2017.1 (64-bit)
  **** SW Build 1846317 on Fri Apr 14 18:54:47 MDT 2017
  **** IP Build 1846188 on Fri Apr 14 20:52:08 MDT 2017
    ** Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
 
Sourcing tcl script '/opt/Xilinx/Vivado/2017.1/scripts/Vivado_init.tcl'
INFO: [Common 17-206] Exiting Vivado at Fri Apr 21 02:42:35 2017...

现在我们可以开始构建DCP了,构建命令在$CL_DIR/build/scripts中,文件名是aws_build_dcp_from_cl.sh,所以具体命令如下:

cd $CL_DIR/build/scripts
$ ./aws_build_dcp_from_cl.sh

需要注意的是,这个命令的运行时间比较长,需要几个小时的时间才能完成。为了避免ssh会话中断导致构建失败,样例的作者选择在后台运行建构过程。在我们运行aws_build_dcp_from_cl.sh命令之后,会马上获得以下输出,不过构建程序会在后台持续运行:

$ ./aws_build_dcp_from_cl.sh
AWS FPGA: Starting the design checkpoint build process
AWS FPGA: Checking for proper environment variables and build directories
Creating the reports directory
Creating the checkpointss directory
Creating the checkpoints\/to_aws directory
AWS FPGA: Environment variables and directories are present. Checking for Vivado installation.
AWS FPGA: Build through Vivado is running as background process, this may take few hours.
AWS FPGA: Output is being redirected to 17_04_21-025018.nohup.out
AWS FPGA: If you have set your EMAIL environment variable and -notify is specified, you will receive a notification when complete.
AWS FPGA:   (See $HDK_DIR/cl/examples/README.md for details)

在以上输出中我们可以注意到,构建日志会输出到文件xxxx.nohup.out中,所以我们可以定时查看这个日志文件从而了解构建进程.

当然,时不时跑过来看看日志文件看看是不是构建完成了并不是一个很有效的办法,如果你希望构建程序在结束的时候给你发一封邮件,可以使用-notify参数,使用-notify参数前需要通过以下命令设置SNS:

$ export EMAIL=your.email@example.com
$ ./$HDK_COMMON_DIR/scripts/notify_via_sns.py

有关-notify参数的更多信息请参考对应的READMD.md文件,本例中就不设置了,采用定时查看日志的笨办法。

在构建结束后,我们可以在xxxx.nohup.out文件中看到以下信息:

AWS FPGA: (07:00:53) Finished creating final tar file in to_aws directory.

然后你可以查看一下这个目录:$CL_DIR/build/checkpoints/to_aws,目录中会有打包好的tar文件,执行ls命令的结果如下:

$ ls checkpoints/to_aws
17_04_21-025018.Developer_CL.tar  17_04_21-025018.manifest.txt  17_04_21-025018.SH_CL_routed.dcp

上传文件到S3

在构建的dcp以后,我们需要将tar文件上传到S3上,然后才能通过AWS CLI命令构建FPGA image。

为了上传文件到S3上,我们需要创建对应的S3桶,这个过程可以通过AWS控制台完成,也可以使用AWS CLI命令行工具完成,有关S3的具体操作请参考相关文档。

本例使用AWS CLI来创建S3桶并上传文件,命令参考如下:

$ aws s3 mb s3://<bucket-name> --region us-east-1
$ aws s3 cp $CL_DIR/build/checkpoints/to_aws/*.Developer_CL.tar s3://<bucket-name>/<dcp-folder-name>/

接着我们还需要为日志文件创建一个目录,其实在S3上没有目录的概念,整个文件路径和文件名就是这个文件的key,所以样例中创建目录的方法就是直接上传一个空文件到我们需要的目录中,具体命令如下:

$ touch LOGS_FILES_GO_HERE.txt                    
$ aws s3 cp LOGS_FILES_GO_HERE.txt s3://<bucket-name>/<logs-folder-name>/

因为我们上传的tar文件最后会交由AWS对应账号完成构建工作,同时构建日志还需要由AWS对应账号写回到我们的S3桶中,所以我们需要为我们的S3桶设置桶访问策略,让AWS账号可以访问这些文件和目录。具体的访问策略样例如下,我们需要把下面的策略配置拷贝到我们的S3桶的“访问策略”设置中。注意样例中的 和 等内容,要把它们修改成真实的桶名和对应路径。

 {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Bucket level permissions",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::365015490807:root"
                },
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": "arn:aws:s3:::<bucket-name>"
            },
            {
                "Sid": "Object read permissions",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::365015490807:root"
                },
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": "arn:aws:s3:::<bucket-name>/<dcp-folder-name>/<tar-file-name>"
            },
            {
                "Sid": "Folder write permissions",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::365015490807:root"
                },
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::<bucket-name>/<logs-folder-name>/*"
            }
        ]
    }

设置完S3的桶访问策略以后我们需要验证一下策略写的对不对,不然策略写错了,AWS对应账号拿不到需要的tar文件,就不能成功构建FPGA image了,而且我们分析问题还不知道如何下手。

验证S3桶策略的脚本在下面这个文件里:

`aws-fpga/hdk/common/scripts/check_s3_bucket_policy.py`

如果执行出现INFO: Passed字样就表示策略设置正确。

不过在有些python环境下check_s3_bucket_policy.py运行会报下面这个错误:

AttributeError: PolicyStatement instance has no attribute 'principals_re'

发现这个错误的话需要手工改一下check_s3_bucket_policy.py文件。

用你习惯的编辑器打开文件check_s3_bucket_policy.py,然后找到下面的代码:

class PolicyStatement:
    def __init__(self, statement, principal=None):
        self.statement = statement
        self.process_policy_statement(statement, principal)
        self.principals_re = []
        self.actions_re = []
        self.notactions_re = []
        self.resources_re = []

然后把self.process_policy_statement(statement, principal)这句放到其它变量设置之后,像下面这样:

class PolicyStatement:
    def __init__(self, statement, principal=None):
        self.statement = statement
        self.principals_re = []
        self.actions_re = []
        self.notactions_re = []
        self.resources_re = []
 
  self.process_policy_statement(statement, principal)
然后就不会报错了,具体运行check_s3_bucket_policy.py命令的参考和对应输出如下:

$ check_s3_bucket_policy.py --dcp-bucket fpga.use1.damondeng.com --dcp-key fpgajarfile/17_04_21-025018.Developer_CL.tar

--logs-bucket fpga.use1.damondeng.com --logs-key logfile
INFO: Passed

一切准备好就可以开始运行 aws ec2 create-fpga-image 命令构建FPGA image了,命令参考如下:

$ aws ec2 create-fpga-image --name DamonFPGAOne

--description "Testing FPGA Image" --input-storage-location Bucket=fpga.use1.damondeng.com,Key=fpgajarfile/17_04_21-025018.Developer_CL.tar

--logs-storage-location Bucket=fpga.use1.damondeng.com,Key=logfile

如果你发现AWS CLI命令报下面这个错误,则你的AWS CLI版本不够,需要运行pip install --upgrade --user awscli进行升级:

Invalid choice: 'create-fpga-image', maybe you meant:
 
  * create-image
  *
运行正常的情况下你会获得类似这样的输出:

{
    "FpgaImageId": "afi-046ead8eb3a0e3112",
    "FpgaImageGlobalId": "agfi-06fdb0f3cea076195"
}

其中”FpgaImageId”是本区域唯一的image ID,”FpgaImageGlobalId”是全球唯一的image ID,后面我们加载FPGA image时要使用过的是全球唯一的”FpgaImageGlobalId”,以agfi开头。

开始构建FPGA image后需要等待一段时间,你可以查看你指定的保存日志的S3桶以了解进展。

如果你在日志目录里看到有个新目录产生,里面有个叫State的文件中出现{State=available} 字样就表明构建成功了。接着就可以加载你的FPGA image了。

在加载新的FPGA image之前记得先清除现有image:

sudo fpga-clear-local-image  -S 0

接着通过以下命令加载FPGA image:

sudo fpga-load-local-image -S 0 -I agfi-06fdb0f3cea076195

如之前描述的,这里-S参数用于指定image slot,-I参数用于指定FPGA image的镜像ID,注意是全球唯一,以agfi开头的镜像ID。

为了检查FPGA image是否加载成功,可以使用fpga-describe-local-image命令,执行输出的样例如下:

$ sudo fpga-describe-local-image -S 0 -R -H
Type  FpgaImageSlot  FpgaImageId             StatusName    StatusCode   ErrorName    ErrorCode   ShVersion
AFI          0       agfi-06fdb0f3cea076195  loaded            0        ok               0       0x04151701
Type  FpgaImageSlot  VendorId    DeviceId    DBDF
AFIDEVICE    0       0x1d0f      0xf000      0000:00:1d.0

其中可以看到镜像ID为agfi-06fdb0f3cea076195的状态是loaded,就是加载成功了。

最后我们就需要运行宿主机上的软件端来测试了,进入cd $CL_DIR/software/runtime/目录,这里有个写好的c的代码用于测试,运行以下命令编译软件测试端:

$ cd $CL_DIR/software/runtime/
$ make all

编译成功后通过./test_hello_world命令执行,以下是执行结果:

$ sudo ./test_hello_world
AFI PCI  Vendor ID: 0x1d0f, Device ID 0xf000
===== Starting with peek_poke_example =====
register: 0xdeadbeef
Resulting value matched expected value 0xdeadbeef. It worked!
Developers are encourged to modify the Virtual DIP Switch by calling the linux shell

command to demonstrate how AWS FPGA Virtual DIP switches can be used to change a CustomLogic functionality:
$ fpga-set-virtual-dip-switch -S (slot-id) -D (16 digit setting)
In this example, setting a virtual DIP switch to zero clears the corresponding LED, even if the peek-poke example would set it to 1.
For instance:
# fpga-set-virtual-dip-switch -S 0 -D 1111111111111111
# fpga-get-virtual-led  -S 0
FPGA slot id 0 have the following Virtual LED:
1010-1101-1101-1110
# fpga-set-virtual-dip-switch -S 0 -D 0000000000000000
# fpga-get-virtual-led  -S 0
FPGA slot id 0 have the following Virtual LED:
0000-0000-0000-0000

这个样例有两部分,一部分是peek_poke部分,就是寄存器的读写。样例为了说明FPGA寄存器的功能是否起作用,将输入的比特位做了交换。

./test_hello_world.c中的代码所描述的:

uint32_t value = 0xefbeadde;
uint32_t expected = 0xdeadbeef;
/* read it back and print it out; you should expect the byte order to be
* reversed (That's what this CL does) */

第二个部分是虚拟LED的使用,测试者可以通过FPGA管理工具设置virtual-dip开关,以类似掩码的形式影响虚拟LED的显示,比如,原来虚拟LED的输出是1010-1101-1101-1110我通过fpga-set-virtual-dip-switch 设置了 1111111100000000值, 虚拟LED的输出就是1010-1101-0000-0000

[centos@ip-172-31-8-87 runtime]$ sudo fpga-set-virtual-dip-switch -S 0 -D 1111111100000000
[centos@ip-172-31-8-87 runtime]$ sudo fpga-get-virtual-led  -S 0
FPGA slot id 0 have the following Virtual LED:
1010-1101-0000-0000

到这里我们的Hello World就成功啦,虽然比一搬的软件Hello World麻烦好多,但是要知道这里可是直接操控硬件喔。

后续工作

在跑完Hello World样例以后可能会有不少人想了解这个开发环境的图形化访问的问题。

如文中提到的,当你通过SSH登录到FPGA实例时,FPGA Developer AMI的欢迎文字中有提到GUI界面的设置。这里提到的方法概括起来就是在centos上启动xrdp,然后通过MS的远程桌面程序进行连接。

在centos端的命令拷贝如下:

sudo yum install -y kernel-devel # Needed to re-build ENA driver
sudo yum groupinstall -y "Server with GUI"
sudo systemctl set-default graphical.target
sudo yum -y install epel-release
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
sudo yum install -y xrdp tigervnc-server
sudo systemctl start xrdp
sudo systemctl enable xrdp
sudo systemctl disable firewalld
sudo systemctl stop firewalld

设置完记得给centos用户设置一个密码,否则远程桌面登录不了:

sudo passwd centos

当你通过远程桌面登录centos后,就可以看到图形化界面了。更多可以参考Jeff Bar的博客https://aws.amazon.com/blogs/aws/developer-preview-ec2-instances-f1-with-programmable-hardware/

以下是从该博客拷贝的远程图形界面截图:

最后希望大家可以在FPGA的世界里找到自己的方向,开始创建自己的芯片系统真是一件让人兴奋的事情。

 

作者介绍

邓明轩

AWS解决方案架构师;拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术挑战,目前在集中精力学习分布式计算环境下的机器学习算法。

带您玩转Lambda,轻松构建Serverless后台!

by AWS Team | on |

Amazon CTO Werner Vogels曾经在AWS re:Invent大会上提到: 如果把云计算理解成一个执行环境,那么,在这个环境里,函数(即业务逻辑的载体)+数据(即跟业务相关的输入与输出)就是应用的核心,有了Functions、Data、Event这三者,其它任何代码和框架,无非是整个应用的胶水和UI罢了。那么,最理想的情况就是用最少的时间写胶水,将更多的时间投入到核心应用的开发中,甚至,彻底实现整个软件栈的微服务化。

那么能不能做到呢?答案是肯定的。AWS Lambda也在这样的背景下应运而生了,其实在很多人眼里,Lambda是一个具有“革命性”的服务,我本人也非常喜欢Lambda这个服务,因为它给我的感觉是: 轻、快、高可用!能够快速将想法写成代码,并应用到生产,不需要关心底层基础设施的运维。接下来,让我们一起搭建一个serverless的后台!

【1】AWS Lambda怎么用?

怎么学习Lambda呢?让我们从一个简单的数学问题开始,10以内乘法和加法运算,获得随机的一个数字。代码有注释,如下:

//Node.js尽量全使用严格模式

'use strict';

//利用console.log可以将日志自动打到CloudWatch里面

console.log('Loading function');

exports.handler = (event, context, callback) => {

    //定义一个最小值为2

    var min = 2;

    //定义一个最大值为10

    var max = 10;

    //生成一个随机数,乘以最大值,再加上一个最小值

    var generatedNumber = Math.floor(Math.random() * max) + min;

    //利用callback回调,得到结果。

    callback(null, generatedNumber);

};
接下去,然后选择Lambda服务

创建一个Lambda Function

选择Node.js 6.10的环境

当然,Lambda目前支持C#,Node.js,Python,Java,后续会支持很多的语言比如Go,PHP,Ruby等。换言之,之后任何能在Linux上跑的环境都能在Lambda上运行。

接下去把上面那段代码拷贝进去,选择“Role”角色,这其实就是Lambda执行时所拥有的权限。当然,你可以通过IAM服务创建一个新的Role,或者选择已经存在的Role。

然后点击“Create Function”,接着就会看到

好!Lambda创建成功了!在Lambda上方点击Test,进行测试,能看到输出的结果。细心的你已经发现,代码运行的时间只有0.3ms哦。

查看Lambda执行的结果:

您可以多次点击test,每次输出的结果都不一样,这是因为,代码一开始生成了一个随机数,所以每次输出的结果也都是随机的。

您可以点击“View logs in CloudWatch”,能看到所有Lambda运行相关的日志。AWS已经把这部分的日志已经自动集成到CloudWatch里面了。

如果你想结合自己常用的日志分析工具,比如sumologic,可以再用一个Lambda将CloudWatch Logs的日志导出。

【2】Lambda + API Gateway

到这里,我们发现,应用的逻辑可以交给Lambda执行,那前端的HTTP请求怎么办呢?AWS还有一个服务叫API Gateway,提供的HTTP网关服务,那么,Lambda怎么和API Gateway又怎么结合起来使用呢?

接下去,您可以进入到API Gateway这个服务里面,点击“Create API”。

写入API的名字然后创建

创建一个Method

选择HTTP Get方法。目前,AW API Gateway支持HTTP DELETE, HEAD, OPTIONS, PATCH, POST, PUT等方法。指定我们之前创建的Lambda函数,选择“Integration Type”Lambda Function。

输入Lambda对应的Region和Lambda函数的名字,然后点击Save。

然后进行部署API,点击“Deploy API”。

指定API的版本,比如prod或者test。

注意,当你定义好这个API之后,可以自动生成整套SDK,有Android,JavaScript,iOS-OC,iOS-Swift,Java。所以,开发人员可以基于这一套自定义的、标准的SDK进行统一开发。只要指定了统一的后端数据库,所有的开发人员都可以各自开发自己的内容,互不干扰,最终形成一个统一、完整的项目。

然后点击“Stages”,查看Get的http地址。

将这个地址复制到浏览器(比如Firefox),可以查看Lambda运行后输出的结果。这样,Lambda就和API gateway结合起来了。

点击刷新,当然数字会变。

【3】Lambda + API Gateway + 传参

如果客户端需要想传递参数,怎么办呢?

那就可以通过API Gateway接受客户端(比如浏览器)输入的参数,然后API Gateway把这个参数传递给后端的Lambda,Lambda通过event对象获得前端API Gateway传递过来的参数,从而进行代码的逻辑执行。

让我们先改动一下Lambda的代码,将固定值2和10换成以变量的形式传递进去。

然后再到API Gateway服务里面,找到“Integration Request”。

找到“Body Mapping Templates”,修改其中的“application/json”,输入提供的内容。

{

    "min":$input.params('min'),

    "max":$input.params('max')

}
点击保存,这样,就通过客户端就可以把参数传递给API Gateway了。比如:

https://j3bi4vs4w4.execute-api.us-west-2.amazonaws.com/prod/number

这个时候打开之前的链接是空值,因为还没传递参数进去。

https://j3bi4vs4w4.execute-api.us-west-2.amazonaws.com/prod/number?min=1&max=10

在浏览器客户端中,传递参数进去之后,比如min=1,max=10,如下:

刷新浏览器,当然会得到随机的结果。

再来一次,刷新浏览器,当然会得到随机的结果。

【4】快速部署Lambda函数?

部署Lambda的函数,可以直接在控制台输入代码,也可以在本地写好之后打成zip包上传到Lambda,或者上传到S3再指定链接内部加载到Lambda上。

当然,如果觉得不是很方便,目前其实已经有很多开源的框架支持都Lambda的快速部署了,比如SERVERLESS.com,Claudiajs.com,APEX,Zappa,Kappa,Chalice等。

【注意!】我们会在下一期内容中专门讲解这些框架怎么用,以及如何借用这些框架,再配合AWS CodePipeline,CodeCommit,CodeBuild,CloudFormation完全实现serverless微服务化,一键自动化发布和部署整个软件栈。

在这里,由于个人喜好,我们拿一个比较轻量的工具APEX举例,http://apex.run/,Apex集成了Lambda的SDK,用户只需要在本地执行apex init命令就创建了一个Lambda环境以及所需的Role,然后通过deploy命令就可以将本地的Lambda代码以及所需要的依赖自动打成zip包,并上传到云端环境。并且Apex会自动进行Lambda版本管理,更重要的是,还支持回滚,查看云端log。这可以让您真正只关心代码,写完代码之后直接部署就可以了,非常方便。你会发现,开发的时候甚至连AWS的控制台都不需要打开!

本地安装,一条curl语句。搞定了!真的挺简单的。

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sudo sh

接下去通过aws configure配置你的权限

danrongm:~ danrong$ aws configure

AWS Access Key ID [****************2T5A]:

AWS Secret Access Key [****************Tcma]:

Default region name [us-west-2]:

Default output format [json]:

创建apex项目: apex init,然后输入项目名称 first-apex-project

接着就开始部署了

acbc32c13f31:apex-demo danrongm$ apex deploy

   • creating function         env= function=hello

   • created alias current   env= function=hello version=1

   • function created          env= function=hello name=first-apex-project_hello version=1

Apex自动会帮您创建Role,以及进行版本的管理和控制。当你修改完代码之后,可以再次执行apex deploy,只要代码有改变,版本号以数字形式就会往上增加。

如果部署其中的一个函数: apex deploy hello

如果调用函数显示输出结果: apex invoke hello

另外,可以直接在本地查看日志的输出。

apex-demo danrongm$ apex invoke -L hello 会把日志输出的所有内容输出

START RequestId: 7c432478-ee78-11e6-8d9b-21a4e48977b8 Version: 5

2017-02-09T03:33:13.014Z     7c432478-ee78-11e6-8d9b-21a4e48977b8     processing event: {}

END RequestId: 7c432478-ee78-11e6-8d9b-21a4e48977b8

REPORT RequestId: 7c432478-ee78-11e6-8d9b-21a4e48977b8     Duration: 0.41 ms     Billed Duration: 100 ms      Memory Size: 128 MBMax Memory Used: 10 MB 104

查看Apex的所有日志(其实就是最近5分钟内的CloudWatch的日志)

apex logs

【5】Lambda + CloudWatch Event

有些场景,有可能是想定期、或者定时让Lambda去执行处理逻辑,针对这种情况,可以使用CloudWatch Event,触发Lambda定时执行。

可以在CloudWatch里面创建一个Rule,然后Event selector可以通过Cron方式定期调用Lambda函数,如下:

这样,你就可以按照一定的规则,定时的去触发Lambda函数了。更多内容可参考:

http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/events/RunLambdaSchedule.html

【6】Lambda + DynamoDB –> 数据写入到数据库

用户发送HTTP请求,交给API Gateway处理,业务逻辑交给Lambda处理,那如果动态的数据需要存储到数据库呢?AWS提供了NoSQL的数据库DynamoDB和关系型数据库RDS,这些都可以和Lambda配合使用。值得一提的是,Lambda可以和RDS一样,放在VPC内部,配置安全组。

那么,如何使用Lambda把处理后的数据存储在DynamoDB呢?Lambda又怎么和数据库进行交互呢?直接上代码。首先创建一个Lambda函数,比如命名为: lambda_dynamodb_write,代码如下

'use strict';

console.log('Loading function');

var AWS = require('aws-sdk');

var docClient = new AWS.DynamoDB.DocumentClient();

AWS.config.region = 'us-west-2’;

exports.handler = function (event, context, callback){

     var params = {

          Item: {

               date: Date.now(),

               message: "Danrong"

          },

          TableName: 'lambda_dynamodb_write_read'

     };

     docClient.put(params, function(err, data){

          if(err){

               callback(err, null);

          }else{

               callback(null, data);

          }

     });

};

【7】Lambda + DynamoDB –> 数据从数据库读取

搞定了数据库的写入操作,Lambda又怎么读写数据库里的内容呢?直接上代码。

创建一个Lambda函数,比如命名为: lambda_dynamodb_read,代码如下

'use strict';

console.log('Loading function');

var AWS = require('aws-sdk');

var docClient = new AWS.DynamoDB.DocumentClient({region:'us-west-2'});

exports.handler = function(event, context, callback){

     var params = {

          TableName: 'lambda_dynamodb_write_read',

          Limit: 100

     };

     docClient.scan(params, function(err,data){

          if(err){

               callback(err, null);

          }else{

               callback(null, data);

          }

     });

};
对于数据库的修改和删除操作,同样可以轻松做到。到这里,Lambda和DynamoDB的交互就搞定了。

【8】Lambda + API Gateway + DynamoDB

此时,我们再将前面三者,即Lambda,API Gateway,DynamoDB结合起来。创建一个Date为主键的DynamoDB Table,让它存储Lambda处理的结果,如下:

由于之前我们已经创建过HTTP GET了,同样的方式,在API Gateway里面,创建一个HTTP POST的方法。如下:

API Gateway中可以解决跨域CORS的问题,点击“Enable CORS”。

到这里,客户端浏览器发出请求,会发送到API Gateway 那边,然后API Gateway传递客户端的参数给Lambda,Lambda通过Event对象获取API Gateway传参的值,并处理逻辑。比如将数据写入到DynamoDB,或者从DynamoDB读取数据显示在前端。

【9】Lambda + API Gateway + DynamoDB + S3 + CloudFront

托管静态网站。如果您是一个网站,或者是移动、IoT等后台,可以把前端显示的静态内容,比如HTML,JS,CSS,以及所有图片托管在S3上,启用静态网站托管。

到这里,一个serverless的网站就做好了,您可以点击下面链接进行尝试。

https://s3.amazonaws.com/danrong.io/index-ajax.html

前端显示的HTML代码开源,您可以公开下载:

https://s3.cn-north-1.amazonaws.com.cn/danrong-share/external/aws-china-blog-lambda-demo-index.html

接下去,其实就是前端的UI设计了,比如,我比较喜欢用http://www.bootcss.com/

完全可以改善一下前端的展示风格,看起来舒服一点。

如果要解决域名的问题,可以使用Amazon Route53访问(注意,域名也可以直接在Route53上购买),这样,就可以用您自定义的域名访问一个Serverless的网址了。

到这里,一个类似于“点击发布评论”、“查看所有评论”的网站就完成了。整个网站基于微服务的思想,完全实现了serverless的架构。

【10】Lambda + CodeCommit + CodePipeline + CodeBuild + CloudFormation

到这里,或许您已经在考虑Lambda如何做到持续化的发布和部署呢?能不能让我的开发人员只关心写代码,其余之后的事情全部一键搞定呢?比如,开发人员在本地用各种各样的IDE写代码,写完之后将代码提交到Git仓库,然后整个pipeline自动完成。在AWS的世界里,当然可以!例如,整个流程可以这样:

我们完全可以利用AWS全面的开发工具,CodeCommit + CodePipeline + CodeBuild + CloudFormation,实现从代码开发,到代码提交,到代码发布,到代码构建,到代码部署,一键自动化发布整个软件栈。再配合Serverless的各种框架(见前面正文),真正可以做到微服务化并且快速迭代敏捷开发!

另外,读者也可以关心一下Security安全的问题,比如Authentication, Authorization, Sensitive data等问题;关于Quality,比如Testing, Continuous Integration, Deployment等问题。这两部分的内容,我们将会在下一期中介绍,期待您继续关注AWS中国官方微信。

更多关于Lambda内容可以参考:

https://aws.amazon.com/cn/lambda/

http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html

 

作者介绍:

毛郸榕

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,毕业于北京航空航天大学云计算专业,硕士,毕业后直接加入亚马逊AWS中国。在大规模后台架构、企业混合IT和自动化运维等方面有着丰富的实践经验。目前在集中精力学习新一代无服务器架构的开发与设计。

 

使用Sqoop实现RDS MySQL到Redshift的数据同步

by AWS Team | on |

希腊有一个著名的谷堆悖论。“如果1粒谷子落地不能形成谷堆,2粒谷子落地不能形成谷堆,3粒谷子落地也不能形成谷堆,依此类推,无论多少粒谷子落地都不能形成谷堆。但是,事实并非如此。”
这个悖论说的,就是告诉我们量变产生质变,需要一个明显的分割线。如果说,量是一个量化的数据,质是一个结论的话。那么,数据分析做的,就是要分析量,从而引向“定性”、”定质”。定量的了解历史的规律(“质”),从而预测未来。
近几年,大数据风靡全球,越来越多的企业利用MapReduce,Hive,Spark等计算框架和工具来为自身的业务提供帮助,在AWS上,我们也提供了诸多的服务,帮助用户能够快速地构建起适合自身需求的大数据分析架构,其中,Amazon Redshift是性能优异并且完全托管的PB级别数据仓库服务,提供了标准SQL数据库访问接口,并且可以十分方便地与现有的主流商业智能数据分析工具整合,构建企业级数据仓库。

然而,大部分企业的核心数据都存储在关系型数据库中,如何能够有效地将这部分存量数据以及后续的增量数据导入Redshift中呢?本文介绍一种使用开源的Apache Sqoop工具,帮助我们轻松实现这一过程。

配置步骤:

第一步 准备工作

1.1 修改MySQL中的表结构

为了能够实现增量同步,需要在MySQL表中增加一列时间戳,该列能够自动记录行被插入更新的时间
为了能够实现同步删除操作,需要在MySQL表中增加一列删除记号列,应用对数据库的删除通过标记该列完成,而不是通过传统的delete语句,因为通常对于曾经存在过的数据,也有分析的意义

本例需要同步的表为country,orders,user,其中country表为Mycat中的全局表,在两台RDS mysql1和mysql2中都有全部信息,orders和user表为Mycat中的分片表,信息分布在RDS mysql1和mysql2中

mycat_sequence表是用于记录其他表自增字段信息的功能表,无需同步到Redshift中分析

执行如下语句添加两列

alter table country add ifdelete boolean NOT NULL default 0;
alter table country add lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMEST AMP;

1.2 创建EMR集群

注意勾选上Hive和Sqoop,同时目前AWS EMR最新的版本为5.4.0,其中对一些组件的版本进行了更新,不过Hive和Sqoop的版本与本文一致

注意选择相应的VPC和子网,子网需要有internet的路由方便之后ssh登入

选择登入的密钥对,Master安全组使用默认的ElasticMapReduce-master,不用修改

启动EMR集群后,修改Master节点的安全组,添加允许公网ssh访问

在EMR界面获取master节点ssh登入的信息

1.3 创建Redshift数据仓库

首先创建Redshift使用的安全组,放行所有源访问5439端口的权限

分别在cn-north-1a和cn-north-1b两个可用区中创建两个子网给Redshift使 用,由于之后会通过公网连接Redshift,这两个子网需要有到internet的路由

在Redshift中创建子网组,选上之前创建的两个子网组

创建Redshift参数组

创建Redshift集群实例

选择之前创建的参数组,VPC,子网组和安全组,开启公网访问

获取连接Redshift的JDBC驱动及连接的URL信息

驱动如果无法下载,也可以从如下连接下载

https://s3.cn-north-1.amazonaws.com.cn/junyublog/RedshiftJDBC41-1.1.17.1017.jar

1.4 创建并保存access key和secret access key

之后从 S3 中同步数据到Redshift时需要提供access key和secret access key信息,这边测试时可以全部放开权限

在IAM中增加一个用户并赋予权限

下载存有access key和secret access key的CSV文件

1.5 创建S3的bucket桶

S3会作为Hive表的底层存储

第二步 创建Hive表

Hive表为RDS到Redshift数据同步的中间表,底层使用S3作为存储,另外由于Hive的表名不能是user,这里使用users

exit; 退出hive

第三步 安装MySQL JDBC驱动(可选)

下载安装JDBC驱动,最新版的EMR不需要,如果在运行Sqoop的时候报找不到驱动时需要手动安装

ssh登入EMR的master节点

wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.40.tar.gz

tar xzvf mysql-connector-java-5.1.40.tar.gz

cp mysql-connector-java-5.1.40/ mysql-connector-java-5.1.40-bin.jar /usr/bin/sqoop/lib/

第四步 修改java权限,否则执行Sqoop job会有warning和error

vim /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.29.amzn1.86_64/jre/lib/security/java.policy
在grant{}中添加如下语句

permission javax.management.MBeanTrustPermission “register”;

第五步 配置Sqoop

5.1 创建Sqoop访问数据库的密码,XXXXXX 为创建RDS mysql1和mysql2时赋予的账号密码

echo –n “XXXXXX” > /home/hadoop/sqoop.password

5.2 创建并执行Sqoop任务

其中由于country表是全局表,所以这里只是从mysql1的read replica读副本中同步,而user和orders表由于是分片表,所以需要分别从mysql1和mysql2各自的读副本中同步数据
需要注意修改如下指令中的URL为自己RDS读副本的URL,同时,对于user和orders,两条sqoop job是不同的,第一条job中通过hive-overwrite参数覆盖上一次job执行后遗留在Hive表中的数据,第二条job是没有hive-overwrite参数的,否则会把上一条job从mysql1中同步的数据错误地删除

下面进行第一次同步,分别执行如下命令将RDS中的数据同步到Hive表中,第一次执行是全备,根据表中数据量,时间可能较长

sqoop job –exec mysql1_country

sqoop job –exec mysql1_user

sqoop job –exec mysql2_user

sqoop job –exec mysql1_orders

sqoop job –exec mysql2_orders

进入Hive,查看表是否同步成功

第六步 将Hive表中的数据同步到Redshift中

使用JDBC客户端连接Redshift,这里使用SQL Workbench
分别创建country,user,orders表及各自的中间表,同时将Hive存在S3中的数据同步到中间表中,其中aws_access_key_id和aws_secret_access_key为准备工作中在IAM下载的CSV中的值

查看stage表中的信息是否同步正确

通过如下事务插入更新country,users,orders表,并删除中间表

查看数据是否正确插入更新到country,users,orders表中

第七步 执行增量同步

人为对MySQL中的表进行适当的增删改操作,本例对country表执行插入操作, 对user表执行插入和更新操作,对orders表执行删除操作,注意到时间戳为操作执行时的时间

ssh登入EMR的master节点,再次运行sqoop job将MySQL中插入更新的数据同步到Hive表中
sqoop job –exec mysql1_country

sqoop job –exec mysql1_user

sqoop job –exec mysql2_user

sqoop job –exec mysql1_orders

sqoop job –exec mysql2_orders

在Sqoop执行输出中可以看到,sqoop job会记录之前执行任务的时间,并调整where语句来实现增量同步数据,所以如果需要多次测试,需要删除job(sqoop job –delete XXX)并重新创建,这样会再次全量同步

进入Hive,查看增量数据是否同步成功

使用SQL Workbench通过JDBC连接Redshift,执行如下命令将增量数据同步到中间表

执行如下事务将中间表的数据插入更新到country,users,orders表中

查看数据是否正确插入更新到country,users,orders表中

之后在Redshift中的分析语句都可以通过添加where ifdelete=false排除删除的记录,同时可以定期删除ifdelete标记为false的记录,释放存储空间

作者介绍:

余骏

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。在加入AWS之前,他在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。

 

 

 

AWS CodeDeploy现已在中国(北京)AWS 区域提供

by AWS Team | on |

作为一个开发运维人员,您是否还在为:

1.    如何快速地将新版本应用部署到大批量服务器,无论其是云服务器EC2还是本地服务器?

2.    如何在部署过程中消除停机时间?

3.    如何规避易于出错的手工操作?

4.    在遇到问题时,如何快速回滚?并及时向您发送通知?

今天,我们很高兴地宣布:AWS的CodeDeploy服务能够助您一臂之力!它能够协助您将应用程序部署到 Amazon EC2 实例和/或非 Amazon EC2 实例的物理或虚拟设备。应用程序包扩:代码、Web 和配置文件、可执行文件、程序包、脚本等可部署的内容。AWS CodeDeploy 支持从 Amazon S3 存储桶和 GitHub 存储库部署应用程序。

您无需更改现有代码即可使用 AWS CodeDeploy。您可以使用 AWS CodeDeploy 控制跨 Amazon EC2 实例部署的速度,并定义要在每个阶段采取的操作。

AWS CodeDeploy 具备下列优势:

  • 自动部署。AWS CodeDeploy 可完全自动部署应用程序,并随您的基础设施进行扩展,让您能够部署到数千个实例。
  • 最大程度减少停机时间。AWS CodeDeploy 可以最大程度地提高应用程序的可用性。支持滚动部署和蓝/绿部署模式。并根据您配置的规则跟踪应用程序运行状况。
  • 停止并回滚。出现错误时,您可以自动或手动停止和回滚部署。
  • 易于采用。AWS CodeDeploy 与平台无关,适用于任何应用程序。您可以轻松重用设置代码。AWS CodeDeploy 还能与您的软件发布过程或持续交付工具链集成。

AWS CodeDeploy 支持如下2种部署模式

就地部署:对部署组中的实例依次执行脱机操作/更新应用/恢复联机的操作,完成滚动部署。

蓝绿部署:创建一组新的替换实例,并安装新版本的应用程序。成功后,切换流量到这些新实例,删除旧实例,完成部署。AWS CodeDeploy 运行您在切换流量之前,对新版本应用程序进行测试。如果发现问题,您可以快速回滚到旧版本。

此外,您还可以对蓝绿部署模式做更多控制:

  • 您可以选择是手工创建一组新实例,还是完全复制运行中的自动扩展组?
  • 您可以选择何时切换流量?按照什么比例切换流量?
  • 以及在部署完成后,是否删除旧实例?

下面,我们以一个具体示例来演示如何进行蓝绿部署。

第一步:启动部署向导,搭建测试应用。

步骤1:登录 AWS 管理控制台,选择AWS CodeDeploy 服务

步骤2:如果显示介绍页面,请选择 Get Started Now。如果显示 Applications 页面,请在 More info 中,选择 示例部署向导

步骤3:选择 Sample deployment

步骤4:选择 Blue/green deployment

步骤5: Key pair name 根据您账户中的设置选择,其它选项保持默认设置。

点击 Launch environment

此时,CloudFormation会为您创建一个堆栈 – 一个简单的Web网站:由一个ELB和3台Web服务器组成,并配置了自动扩展组。几分钟后,您将会看到Congratulations! Your environment is ready页面。

Sample application 部分,您可以点击http://BlueGreenLoadBalancer-xxx查看Web网站内容(注意背景色是蓝色)

在Sample blue/green deployment部分,记下新版本应用程序的S3地址 https://s3.cn-north-1.amazonaws.com.cn/aws-codedeploy-cn-north-1/samples/latest/SampleApp2_Linux.zip,后续步骤会用到。

第二步:修改部署模式为“蓝绿部署”

步骤1:在CodeDeploy控制台,选择  Applications -> BlueGreenDemoApplication(刚创建的应用程序) -> BlueGreenDemoFleet-xxx(刚创建的部署组)。在 Actions下拉菜单中,选择“Edit

步骤2:在新页面中,将 Deployment Type 设置为 Blue/green deployment,并点击 Save

注:在该页面中,您还可以设置更灵活的部署方式,是否发送通知,如何回滚等。

第三步:部署一个新版本

步骤1:在前一步返回的页面中,依旧选择之前的部署组 BlueGreenDemoFleet-xxx在 Actions下拉菜单中,选择 Deploy New Version

步骤2:在新页面中,在 Revision location* 中,填入之前记录的新版本应用程序所对应的S3地址:https://s3.cn-north-1.amazonaws.com.cn/aws-codedeploy-cn-north-1/samples/latest/SampleApp2_Linux.zip,并点击 Deploy

第四步:观察部署过程和结果

在接下来的页面中,您将会看到整个部署过程:

在EC2控制台,您会看到创建了3个新实例。

部署完毕后,在页面底部您可以看到新创建的3个实例接替了所有流量,原有的3个实例不再接收流量,并被终止。

您也可以随时在控制台的Applications -> Deployments 点击相应的部署ID查看详情。

使用浏览器重新刷新Web页面,背景色已变成绿色。

至此,蓝绿部署完毕。

测试完毕,为避免产生后续费用,请按照以下顺序清除所有资源:

  1. 替换环境的实例所属的 Auto Scaling 组。(删除 AWS CloudFormation 堆栈时,与原始环境中的实例关联的 Auto Scaling 组也将被删除。)
  2. 示例部署向导 创建的用于为蓝/绿部署提供原始环境的 CloudFormation 堆栈。
  3. 示例部署向导 创建的 AWS CodeDeploy 部署组和应用程序。

除了管理AWS 的EC2实例,AWS CodeDeploy还能够管理您本地数据中心的物理服务器和/或其它环境中的虚拟服务器,只需在其上安装相应的Agent即可实现混合云管理和部署。目前支持的操作系统包括:Amazon Linux/RHEL/Ubuntu/Windows。

如要获取更详细的帮助信息,请参考AWS CodeDeploy中文文档:http://docs.amazonaws.cn/codedeploy/latest/userguide/welcome.html

 

作者介绍:

田明晶

AWS解决方案架构师,拥有18年IT、互联网工作经验,曾在中国联通互联网中心、Sun、Oracle等公司担任售后,售前工程师;2014加入AWS,担任云技术支持工程师,现任职解决方案架构师。在存储、数据库方面有多年经验;对大数据、容器和各种前沿技术(深度学习、AI等)有浓厚的兴趣和技术积累。

CrowdTangle经验谈:如何立足AWS构建SaaS解决方案

by AWS Team | on |

马曾经是种极为重要的交通工具。

如果大家打算在150年前提供信使服务,就会意味着使用马匹作为交通工具能够带来远超步行的交付效率。当然,大家也必须雇专人照顾马匹、购买饲料并清理马厩——但这一切在马匹带来的速度优势面前简直不值一提。随着时间的推移,饲养马匹带来的相关技能将使得大家建立起自己的完整业务系统,从而更为高效地处理各类突发事件。

然而接下来汽车出现了,马匹作为交通工具的使命开始逐步被历史所淘汰。

当然,这一过程并非一蹴而就。第一辆行驶在街头的汽车并不会让您立刻破产。而且尽管汽车已经越来越多被主流所接受,大家仍然拥有一定的比较优势,证明并无转投汽车邮递方向的必要。然而,一旦以车辆为主要工具的同类企业开始出现,您的大麻烦将很快由可能变为现实。

在CrowdTangle公司,我们构建起一系列全球领先的工具选项,旨在帮助人们对社交媒体中的信息动态加以追踪。我们拥有一支工程师与才会人员团队,负责引导各大媒体企业、大联盟队伍以及其他用户找到其最关心的实时信息。更重要的是,我们的公司建立于2011年,并在过去五年中一直在使用AWS。我们过去曾经、未来也将坚信AWS能够作为我们建立完整业务的稳固基石。

AWS对我们而言就如汽车一般。

这样的比喻看似夸张,但其实非常客观。立足于AWS,我们得以建立起一套完全不同于以往五年的组织形式。具体来讲,AWS在四大主要方面对我们产生了影响:业务模式、人员聘用、规划以及速度——当然,这一切总结起来都可以归纳为“成本”二字,进而推衍为“生存”。

首先是商业模式。当最初建立这家企业时,我们并没有考虑利用物理介质承载我们的软件,亦没有考虑建立自己的基础设施。相反,我们选择了软件即服务(简称SaaS)这一模式,并借此获得了大量直接性收益:我们能够允许用户单纯通过访问网站的方式试用我们的产品; 我们能够在一天之内发布数十项功能与修复方案; 我们亦能够确保每位用户皆具备同样的受控使用体验。不过更重要的是,要交付业务产品,我们过去必须在起步时即承担沉重的资本支出。但在AWS的帮助下,我们无需此类初始成本即可让SaaS成为一种可行的发展选择,并在业务增长的同时不断扩大规模。

其次是人员招聘。AWS提供Amazon关系数据库服务(简称Amazon RDS),这是一项托管数据库服务,意味着我们不再需要雇用数据库管理员即可将该服务直接交付开发者使用(且使用英特尔至强E5处理器,代表性能质量亦可得到保证)。另外,AWS还拥有Elastic Beanstalk,这项服务允许我们更为轻松地在AWS之上部署自有应用程序,从而为前端及后端服务器设置独立环境并以一键式操作对其分别加以扩展。再有,AWS的托管NoSQL数据库服务Amazon DynamoDB使得我们不再需要四名全职工程师专门负责数据库的连接与运转。我们拥有TB级别的实时数据,可在个位数毫秒之内完成响应,而且在我个人看来该服务完全能够实现自我维护。在此基础之上,我的团队能够专注于考量如何推动业务发展,而不再需要为保持系统正常运作而分神。

第三项为规划。如果大家仍然生活在以马匹作为主要交通工具的时代,那么资源采购模式无疑是根据自身能力尽可能多地进行设备买入,直到您清楚地发现当前资本支出已经超过企业的承受能力。另外,大家需要研究各类新型设备、联系供应商、投入大量资金、等待设备发货、进行现场安装,并在其性能无法满足需求时尝试转售以收回一点成本。但在汽车时代下,如果我认为企业需要更多设备资源,则可在很短时间之内申请一项实例,并按小时为这一立即可用的资源支付成本。在相关任务完成之后,我可以关闭该实例并不再承担任何后续成本。更重要的是,实例本身的具体规模并不重要——我们完全可以根据需求申请与之匹配的资源容量。

最后,我想聊聊速度这个话题。由于我们选择在AWS之上建立自己的解决方案,因此我们得以拥有一支敏捷、能够快速交付资源并主要关注项目本身而非被迫思考系统维护工作的团队。我们不仅能够在业务范围内的项目进行快速转换,同时亦可以低成本方式实现探索性思路的实验性实施。每个新项目既可能中途失败,亦可能成为我们的下一款百万美元级产品——且二者在初始阶段完全相同,包括建立设想、克隆现有环境、建立项目分支、以实验性方式向客户交付并在获得好评后全面推向市场。

我们最近发现系统聚合部分的处理速度比预期更慢,因此我们开始尝试将其转移至Amazon Redshift。为了实现这一目标,我们首先申请了一个小型Redshift实例(注:未进行规划),并在完成初步测试之后将整体生产数据库复制到Redshift当中(注:研发速度)。“生产”性实验证明这一举措确实能够带来可观收益,因此我们为自己的系统建立起一整套辅助Amazon Kinesis-Redshift托管通道(注:尽管新增系统,但未招聘任何额外人员),而此举最终让我们获得了此前根本无法想象的新产品研发能力。那么这一切在传统模式下需要耗费多少成本?需要采取怎样的执行方式?项目中的各项因素能否拥有受控规模以保证不致造成巨大损失?我们总是从小笔投入着手,而正是这一点让我们能够保持所在业务领域的领导地位。

毫无疑问,未来的竞争对手必然同样借助汽车作为业务基础——在这样的历史背景下,单凭马匹如何在对抗中取胜?

欲了解更多关于CrowdTangle公司的信息,请点击此处参阅我们的官方网站。

Amazon EBS弹性卷修改实践

by AWS Team | on |

简介

在应用飞速的更新换代、数据量高速增长的今天,AWS的客户对EC2的块存储需求是随时间而改变的,很可能会多次需求增加容量或改变性能特性。在当今的24×7(全天候不间断)操作模式下,服务器没有停机的余地。因此,客户希望在应用不离线或不影响正常操作的情况下进行更改。换句话说,我们的客户希望他们的EBS卷更有弹性!

在2017年2月13日,AWS全球推出了一个新的EBS功能,称为弹性卷(Elastic Volumes),并使其适用于当前所有EC2实例可生成的EBS卷。在2017年2月17日,AWS中国区可以使用这项新功能。通过这一项功能,可以在EBS卷正在使用时增加卷的大小,调整性能或更改卷类型,并能在这些更改生效之前继续使用应用程序等运行在EC2实例上的程序功能。这一新功能的更新将大大简化企业或个人用户的许多规划管理,可以通过简单的API调用来及时更改存储基础架构,取代传统的需要几周或几个月的配置周期。

使用场景

1. 卷类型更改。在项目初期,为了更快部署应用,您初步设置块存储使用通用SSD卷(General Purpose SSD volumes),在获得一些使用经验后,发现吞吐量优化卷(Throughput Optimized volumes)是更好的选择,这时您只需要更改卷的类型就能够轻松解决问题。

2. IOPS性能调整。假设您在IOPS卷中运行一个关系型数据库,并设置它处理正常范围内的数据读写,由于每个月最后几天数据读写突增到正常水平的10倍,您只需要通过弹性卷短时间内获取更强大的读写配置来处理每月最高的数据读写,然后回调至正常配置来处理正常范围内的数据读写。

3. 卷存储增加。您获取了一个卷使用警告,提示您当前使用存储空间超过90%,这时您可以增加卷的大小,并扩展文件系统来匹配,弹性卷将以完全自动化的方式处理请求而不用停止EC2实例。

适用范围

AWS全部区域,包括海外和中国北京区域。

修改限制

所有卷大小的修改只能增加卷的大小!为了保护所有EBS卷中的数据,弹性卷修改仅允许增加卷的大小。如果您想将当前卷大小改小,可以先通过数据迁移工具将EBS卷中的数据移动到较小的卷,再将原来的卷删除。

1. 通用SSD卷:卷大小最小为1GiB,最大为16384GiB(16TiB);IOPS性能无法修改,最小为100,最大为10000,在最大最小值范围内为卷大小的3倍(卷大小单位为GiB),IOPS超频可达到3000。

2. 预配置IOPS SSD (io1):卷大小最小为4GiB,最大为16384GiB;IOPS性能可以修改,最小为100,最大为20000,在最大最小值范围内最大可调整至卷大小的50倍(卷大小单位为GiB)。

3. Cold HDD (sc1):卷大小最小为500GiB,最大为16384GiB;Cold HDD (sc1) 卷提供低成本的磁性存储,该存储以吞吐量而不是 IOPS 定义性能。此处无法做任何更改。

4. 吞吐量优化卷:卷大小最小为500GiB,最大为16384GiB;吞吐量优化卷提供低成本的磁性存储,该存储以吞吐量而不是IOPS定义性能。

5. 旧版磁介质卷:无法修改。磁介质是上一代卷。对于新应用程序,我们建议使用较新的卷类型。

数据截至至2017年2月17日,具体数据以AWS实时数据为准。更多有关EBS卷的相关信息,请查阅Amazon EBS卷类型

操作指南

您能通过AWS管理控制台、API调用或从AWS命令行界面(CLI)管理使用所有功能。下面将介绍AWS管理控制台对弹性卷修改的操作指南,获取更多API调用及命令行界面的操作方式,请访问AWS文档

修改本身不收取任何费用,您只需按实际使用量付费。更多定价信息,请访问EBS定价

一、引导卷(根分区)修改

登陆AWS中国区,并选择服务EC2,打开EC2面板后,鼠标左击点选左侧导航栏的“卷”。

打开卷面板后,选择您要调整的卷,点选“操作”打开下拉菜单,在下拉菜单中点选“Modify Volume”。

然后可以对卷类型、大小和预配置的IOPS(如果适用的话)进行任何符合需求的更改,修改检查完后,点击Modify按钮。

注意卷大小不能减小

注意预配置IOPS SSD卷的IOPS值不能大于卷大小的50倍(卷大小单位GiB)

在修改确认页面点击“Yes”按钮。

卷修改正在进行,请稍等一会儿。

卷修改完成。

卷修改验证。

二、未绑定到EC2实例卷修改

三、已绑定到EC2实例卷(未建立文件系统使用)修改

四、已绑定EC2到实例卷(建立文件系统并正在使用)修改

应用卷修改前。

应用卷修改后。

注意,卷的大小修改后,下一步是扩展文件系统,以便可以利用额外的存储空间。要了解如何执行此操作,请阅读在Linux上扩展EBS卷的存储空间或在Windows上扩展EBS卷的存储空间

注意事项

1.   在某些情况下,卷需要与EC2实例分离或停止实例才能进行修改。如果您在尝试对EBS卷应用修改时遇到错误消息,或者如果要修改附加到上一代实例类型的EBS卷,请执行以下步骤之一:

  • 对于非引导卷,先将卷从实例中分离,再应用修改,最后重新附加卷。
  • 对于引导卷,先停止实例,再应用修改,最后重新启动实例。

2.   弹性卷修改方法不支持上一代磁性卷。但是,您可以通过拍摄快照,并将快照还原到其他配置的EBS卷。

3.   不支持减小EBS卷的大小。但是,您可以通过创建较小的卷,利用应用程序级工具(如robocopy)进行数据转移。

4.   修改卷后,您需要等待至少六个小时,才能再对同一卷进一步更改,建议修改属性的时候,类型,IOPS,大小参数一次性完整设定。

5.   许多Linux AMI如今使用MBR方案,它只支持最多2047GiB的引导卷。如果您的实例未使用2TiB或更大的引导卷进行引导,则引导卷的大小被限制为2047GiB。

6.   在2016年11月1日之前附加到当前生成实例的卷需要执行以下操作之一,来初始化修改支持(这是一次性要求):

  • 停止并重新启动实例(重启前请一定备份卷数据!)。
  • 分离并重新附加卷。

7.   m3.medium实例被视为当前一代。m3.large,m3.xlarge和m3.2xl实例被视为上一代。更多有关上一代实例的内容,请参考实例类型

引导卷(根分区)操作实践:


卷修改前检查:

1.  确保最近一次卷修改在6小时之前。

2.  确认卷类型,如果为上一代磁性卷,您无法修改卷的类型及大小。您可以先将磁性卷中的数据拍摄快照并迁移至其余四种卷类型,再做更改。

3.  确认实例类型,如果为上一代实例,请先分离卷(非引导卷)或停止实例(引导卷)后再进行卷修改。

4.  确认实例上一次停止时间,如果在2016年11月1日之前,请先分离卷(非引导卷)或停止实例(引导卷)后再进行卷修改。

5.  一次性完整设定需要修改的卷类型,IOPS,大小参数,并等待卷修改完成。

参考

Amazon EBS Update–New Elastic Volumes Change Everything

作者介绍:

王元恺

AWS实习解决方案架构师,上海交通大学学生,有数年C++程序开发以及一年PHP前后端开发经验,同时致力于AWS云服务在国内的应用和推广。熟悉网站架设与网络应用开发,对于TCP/IP及网络协议有自己的理解和实践经验。

 

利用Mycat中间件实现RDS MySQL的分库分表及读写分离功能

by AWS Team | on |

随着移动互联网的兴起和大数据的蓬勃发展,系统的数据量正呈几何倍数增长,系统的压力也越来越大,这时最容易出现的问题就是服务器繁忙,我们可以通过增加服务器及改造系统来缓解压力,然后采用负载均衡、动静分离、缓存系统来提高系统的吞吐量。然而,当数据量的增长达到一定程度的时候,增加应用服务器并不能明显地提高系统的效率,因为所有压力都会传导到数据库层面,而大多数系统都是用一个数据库来存储和管理系统数据的,因而一个支持高性能、高并发并且易于扩展的数据库系统变的尤为重要。

Amazon RDS是AWS上托管的关系型数据库服务,目前支持业界主流的MySQL、Oracle、SQL Server、PostgreSQL、MariaDB引擎及AWS提供的Aurora,通过多可用区主备及读副本等技术,能够支持绝大部分的应用场景。

对于更大容量的数据库,可以使用Amazon Aurora,Aurora是一个关系型数据库引擎,结合了高端商用数据库的速度和可用性,同时还具有开源数据库的简单性和成本效益。Amazon Aurora 的设计与 MySQL 5.6 及PostgreSQL 9.6.1兼容,它提供的性能比同一硬件上运行的标准 MySQL 最多高达五倍,比PostgreSQL最多高达二倍。

下表是单个数据库实例能够支持的存储容量大小:

RDS数据库引擎 存储容量
MySQL 6TB
Oracle 6TB
PostgreSQL 6TB
MariaDB 6TB
SQL Server 4TB
Aurora 64TB

不过由于Aurora目前并未在所有region提供,比如中国北京,同时支持的引擎有限,对于中国区用户及使用其他数据库引擎的用户,不得不考虑其他的解决方案。随着近年来海量数据存储、并行计算、异构数据互联等一系列新技术在市场上不断出现。相信数据库行业的很多从业者都对传统关系型数据库的单点故障及容量问题头疼不已,而数据库分库分表也早已成为解决此类问题的基础。

本文要介绍的Mycat是一款面向企业级应用的开源数据库中间件产品,支持事务、ACID,能够对接Oracle、MySQL、DB2、SQL Server、MongoDB、SequoiaDB等数据库,支持透明的读写分离机制,支持各种MySQL集群,包括标准的主从异步集群、MySQL Galera Cluster多主同步集群等,通过大表水平分片方式支持100亿级大表的分布式存储和秒级的并行查询能力,内建数据库集群故障切换机制,实现自动切换,可满足大部分应用的高可用性要求。

配置步骤:

第一步 创建RDS数据库实例

创建一个RDS将会使用的参数组mycat

在分库分表的情况下,Mycat可以通过如下几种方式保证自增主键的全局唯 一:

1. 本地文件方式

在sequence_conf.properties文件中设置主键的当前值,最小值和最大值

2. 数据库方式

在其中一个 MySQL 节点中建立一张表,存放 sequence 的名称,当前值,步长 等信息,并通过存储过程修改更新信息
3. 本地时间戳方式

4. 注解方式

本例使用第二种方式,为了使存储过程能够顺利执行,需要修改参数组的log_bin_trust_function_creators为1

此外,可以按需设置时区及大小写不敏感

接着创建两台 RDS MySQL 实例,注意需要在创建的时候选择 mycat 参数组

本例使用 MySQL 5.6.34 版本,开启 Multi-AZ 及自动备份功能,并且为每个 MySQL RDS实例创建一个读副本做读写分离

数据库 endpoint 如下:

mysql1

mysql1.cbqbpwftrsrj.rds.cn-north-1.amazonaws.com.cn

mysql1-read-replica

mysql1-read-replica.cbqbpwftrsrj.rds.cn-north-1.amazonaws.com.cn

mysql2

mysql2.cbqbpwftrsrj.rds.cn-north-1.amazonaws.com.cn

mysql2-read-replica

mysql2-read-replica.cbqbpwftrsrj.rds.cn-north-1.amazonaws.com.cn

第二步 安装配置 Mycat

本例使用 Cento 6.7 创建 EC2

1. 安装epel及mysql源

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh https://repo.mysql.com//mysql57-community-release-el6-9.noarch.rpm

2. 修改/etc/yum.repos.d/mysql-community.repo如下

3. 安装相关软件包

yum update -y
yum install mysql-server java-1.8.0-openjdk.x86_64 vim wget -y

4. 下载并安装Mycat

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

5. 配置Mycat中间件

5.1 vim mycat/conf/server.xml
该配置文件主要用于创建 mycat 用户及 mycat 的系统参数设置,这里只列出保证mycat正常工作的参数配置,其中还有很多优化项需要读者根据需要自行修改,具体可以参考文末的参考书及链接

其中 sequenceHandlerType 为1表示使用数据库方式实现自增主键

5.2 vim mycat/conf/schema.xml

该配置文件主要用于配置逻辑库、表、分配规则、分配节点及数据源,同样这里的配置并不包括参数优化在内

上面配置有几个地方需要注意

1. 分片dn1和dn2分别对应于mysql1中的db1和mysql2中的db2,需要事先登入这两台 RDS 实例,并分别创建 db1 和 db2 数据库

2. user表会在两台RDS实例中分片,基于id字段,使用mod-long算法进行分片

3. orders 表作为 user 表的子表,使用 ER 关系表进行分片,是 Mycat 中避免跨库join 的其中一种方式,适用于有父子关系的两张表,这里 orders 表中的user_id 字段对应于 user 表中的 id 字段,当需要对 orders 表进行插入操作的时候,Mycat 会对 user_id 应用父表的 mod-long 算法找到具体的分片并插入,这样 order 表和user 表基于user.id=orders.user_id 的 join 操作可以在每个分片中进行,无需跨库

4. country表的type为global,设置为全局表,也就是在每个RDS实例中均有完整的 country 表信息,是 Mycat 中另外一种避免跨库 join 的方法,适用于内容较为固定,数据量不大的字典表

5. dataHost标签中的balance为3,实现读请求完全到readHost上进行

6. dataHost标签中的switchType为-1,意思是当writeHost故障的时候不进行切换,这是针对 RDS 特有的配置,由于 RDS 已经启用了 Multi-AZ 的功能,主库故障会自动切换到 standby 实例,无需 Mycat 切换到某台readHost

7. user,password为具体RDS实例的登入用户账号

8. user表和orders表设置了autoIncrement=true主键自增

9. mycat_sequence表用于存储其他表的自增主键信息

5.3 vim mycat/conf/rule.xml

该配置文件主要用于定义分片算法,由于本例使用两台 RDS实例,需要将 mod-long 分片算法的 data nodes 参数设成 2

5.4 vim mycat/conf/sequence_db_conf.properties

该配置文件用于设置主键自增表的自增信息,这里将 user 表和 orders 表的自增信息存到 dn1,也就是 RDS mysql1 中,注意这里的 USER,ORDERS 需要大写

5.5 启动 Mycat,并建表

./mycat/bin/mycat start &
mysql –h 127.0.0.1 –u root –p –P 8066

show databases 可以看到定义的逻辑库 test

下面是具体的建表语句

下面设置 user 表及 orders 表的自增主键的当前值为0,自增步长为1

5.6 配置实现主键自增的存储过程
存储过程需要在具体的 RDS 实例上创建,在这里是 RDS mysql1
mysql –h mysql1.cbqbpwftrsrj.rds.cn-north-1.amazonaws.com.cn -u root –p

第三步 功能验证

1. 登入Mycat

mysql –h 127.0.0.1 –u root –p –P 8066 use test;

2. 验证主键自增

3. 验证user表在两台RDS实例中分片

4. 验证country表为全局表,并且能够和user表做join

在两台 RDS 实例上可以看到 country 表的全部内容

5. 验证 orders 表的分片规则关联父表 user 表,即 orders 表中的 user_id 与 user 表中 id字段相等的行存储在同一个 RDS 实例中,并且两张表能够 join

在两台 RDS 上查看到 user 表与 orders 表的存储关系

6. 验证使用ShareJoin实现分片join

如上两种方式本质上是通过全局表或者相同的分片规则规避分片 join,SQL语句经过 Mycat 分发到各个 RDS 节点本地 join,然后在Mycat 中进行结果的汇聚,如果两张表都比较大,不适合作为全局表并且表与表之间没有类似的父子关系时,有两种方式解决

1. 增加冗余列,即人为在两张表中构建相同的两列,比如上例的 user.id 和orders.user_id,然后基于这两列来分片

2. 通过ShareJoin注解,ShareJoin本质上是将一条join语句拆分成单表的SQL语句,然后把各个节点的数据汇集
登入 RDS mysql1,对 orders 表人为插入一条 user_id 为奇数的信息,使得 orders 表的分片规则与 user 表的出现

此时再使用 join 语句将会丢失刚刚插入的那一行,因为 RDS mysql1 在本地执行 join 语句时,本地 user 表中并没有 user.id=1 的条目

通过在 SQL 语句前加上 ShareJoin 的注解,实现跨分片 join 功能

笔者在实际使用过程中发现,ShareJoin 并不是总能够正常工作,怀疑可能是 bug 或者语句限制,不到万不得已,建议使用上面的两种方式来规避跨库 join,比如上面的语句如果只是取出某几列,ShareJoin 并不总能正确输出

另外还有一种 Mycat 支持的跨分片join技术是 catlet,也叫做人工智能(HBT), 主要是参考了数据库中的存储过程的实现方式,需要用户根据系统提供的 API 接口在代码中实现跨分片 join,具体可以参考文末的参考书中的内容

7. 验证读写分离

修改 RDS 参数组 mycat,开启 general log

注意:开启 general log 会影响数据库的性能并占用存储空间,不建议在常规时间开启,这里只是用于验证
登入 Mycat,执行如下语句,可以看到在15:42:09-15:42:29的时间段内,一共执行了两次对 country 表的全表扫描,一次 user 表的全表扫描,和三次 user 表的单行查询,需要验证的结果如下:

1. 由于country表是全局表,只会在一台实例上执行,所以两台read-replica中一共可以看到两条语句

2. user表是分片表,所以全表扫描会在每台read-replica中看到一条语句

3. user表的单行扫描会按照Mycat的分片规则分配到相应的read-replica中执行

4. 所有语句不会出现在mysql1和mysql2写库的日志中

分别登入 mysql1,mysql2,mysql1-read-replica,mysql2-readreplica 执行 select * from mysql.general_log,查看 15:42:09-15:42:29 时间段内的日志

mysql1,mysql2 中没有执行的语句日志
mysql1-read-replica 中,可以看到两条 country 的全表扫描,一条 user 的全表扫描和user 表 id 为 2 的查询语句,其中全表扫描的 limit 100 为 Mycat 自动添 加,可以通过配置修改

mysql2-read-replica 中,可以看到一条 user 的全表扫描和 user 表 id 为 1,3 的查询语句,其中全表扫描的 limit 100 为 Mycat 自动添加,可以通过配置修改

第四步 配置 Mycat 的冗余

1. 设置Mycat开机自启动

vim /etc/rc.local,添加如下启动指令

sh /home/centos/mycat/bin/mycat start

2. 根据需要设置iptables防火墙策略

3. 创建 AMI,通过 AWS autoscaling-group,实现 Mycat 冗余及高可用,应用层对两台MyCat的负载均衡可以在应用层实现或者使用负载均衡器,由于这部分配置比较基础,此处不做详细介绍

最终拓扑图如下:

第五步 使用 Mycat-web 实现监控(可选)

Mycat-web为 Mycat 提供了一个基于 Web 的监控平台,功能非常丰富,可以对 Mycat实例,Mycat 所在机器的 JVM 以及具体的 MySQL 节点进行监控

1. 安装启动Mycat-web

本例使用一台独立的 EC2 安装,使用 Centos 6.7,配置 internet 可以访问

Mycat-web 依赖 zookeeper,需要先安装 zookeeper
wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper- 3.4.9.tar.gz
cd zookeeper-3.4.9/conf
mv zoo_sample.cfg zoo.cfg
cd ../bin
./zkServer.sh start &
安装 Mycat-web
wget http://dl.mycat.io/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT- 20170102153329-linux.tar.gz
cd ~/mycat-web/WEB-INF/classes
vim mycat.properties
zookeeper=localhost:2181(默认已经修改)
cd ~/mycat-web
./start.sh &

2. 配置Mycat-web

通过浏览器访问 mycat-web

添加 Mycat 节点

添加 JVM 节点

添加 MySQL 节点

接下来就可以通过 Mycat-web 查看系统的各项参数

目前有一个问题,Mycat-web 只能够收集到 read 的操作,所有 insert/delete/update 等写操作无法收集

通过 Mycat 服务端口 8066 登入一台 Mycat,执行一系列 select 及 insert 读写操作,退出后通过管理端口 9066 登入,查看日志发现所有 insert 写操作并未记录到日志中,因此可以确定不是 Mycat-web 的问题,而是可能由于 Mycat 本身配置不当或者由于 bug 导致写操作没有记录到日志中,已经在 github 上提交 issue,等待答复中

参考内容:

《分布式数据库架构及企业实践:基于Mycat中间件》

Mycat 自增主键配置:

http://deweing.github.io/2016/06/29/mycat-auto-increment.html

https://my.oschina.net/bodi666/blog/797277

作者介绍:

余骏

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。

使用AWS控制台或命令行将AWS IAM角色附加到现有的Amazon EC2实例中

by AWS Team | on |

简介

AWS IAM(身份和访问管理服务)中的角色使您的应用程序在Amazon EC2上能够使用临时的安全凭证自动实现AWS服务的创建,发布和内容修改。使用这样的临时凭证是IAM的最佳做法,因为您不再需要在实例上维护一个或多个长期密钥。对EC2使用IAM角色也无需再使用必须手动或以编程方式管理的长期AWS访问密钥。

例如,应用程序必须通过AWS证书签署API请求。因此,如果您是应用程序开发人员,您需要一个策略来为EC2实例上运行的应用程序管理证书。您可以安全地将您的AWS证书分配至实例,从而允许这些实例上运行的应用程序使用您的证书签署请求,并保护其免受其他用户的影响。但是,要将凭证安全地分配至每项实例有一定难度,尤其是AWS以您的名义创建的实例,例如竞价型实例或Auto Scaling组中的实例。当您更换AWS证书时,您还必须能够更新每项实例上的证书。IAM角色能够委托授权以发出API请求,而不用创建并分配您的AWS证书。详细解决方案,请查阅文档适用于Amazon EC2的IAM角色

之前,IAM角色只能在实例创建设置时添加,这导致了过去创建的实例和忘记添加IAM角色的实例无法使用IAM角色操作实例,从而被迫重新部署实例及应用程序。从现在开始,您可以通过将IAM角色附加到现有的尚未被角色附加的EC2实例,来使用AWS提供的临时安全证书操作EC2实例,您还可以随时替换附加到现有EC2实例的IAM角色。

适用范围

文中的操作步骤已于2017年2月23日验证通过,其中AWS CLI版本1.11.48,在AWS全球和AWS中国区均能正常使用。

解决方案

1.   创建IAM角色

2.   将IAM角色附加给现有EC2实例(最初没有IAM角色附加)

3.   更换附加到Amazon EC2的IAM角色

4.   移除附加到Amazon EC2的IAM角色

本文假设您具有创建IAM角色的权限,并具有调用EC2 API的权限。

AWS命令行操作步骤中所有出现的占位符{Some Words},都应该替换为实际资源名称。

AWS控制台操作步骤

1.  打开EC2控制面板,并选择左侧边栏的“实例”。

2.  选择您的实例,依次点击上方的操作->实例设置->Attach/Replace IAM role

3.  打开IAM role下拉菜单,选择您想要附加给当前EC2的IAM角色,No Role代表不附加角色,选好后点击右侧的Apply按钮。选择并应用的过程实际上包含了:将IAM角色附加给现有EC2实例(最初没有IAM角色附加);更换附加到Amazon EC2的IAM角色;移除附加到Amazon EC2的IAM角色。

4.  如果您选择了No Rule(即移除EC2上的IAM角色),会显示如下页面:

5.  如果您未作出有效的修改,会显示如下页面:

6.  如果您的修改有效,会显示如下页面:

AWS命令行操作步骤

开始操作之前,请确保您的CLI版本大于等于1.11.48。如果您对当前自己的CLI版本有疑问,可以在命令行中执行以下命令进行版本查询:

$aws --version

如果您已经有 pip 和支持的 Python 版本,则可以使用以下命令安装 AWS CLI:

# pip install --upgrade --user awscli

一、创建IAM角色

在从AWS CLI创建IAM角色之前,必须先创建角色信任策略。信任策略允许AWS服务(如EC2)代表您的应用程序承担IAM角色。

要创建信任策略,请复制以下策略,并将其粘贴到使用名称{YourNewRole}-Trust-Policy.json保存的文本文件中,注意后缀名为.json:

♦AWS中国区

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Principal": {

"Service": "ec2.amazonaws.com.cn"

},

"Action": "sts:AssumeRole"

}

]

}

♦AWS全球

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Principal": {

"Service": "ec2.amazonaws.com"

},

"Action": "sts:AssumeRole"

}

]

}

 

现在您已成功创建信任策略,接下来创建IAM角色{YourNewRole}:

1.  基于信任策略创建IAM角色{ourNewRole},打开命令行并执行以下命令:

$aws iam create-role --role-name {YourNewRole} --assume-role–policy-document file://{FilePath}/{YourNewRole}-Trust-Policy.json

注意:  file:// 不能省略,策略路径可以是当前相对路径也可以是全路径。

例如:

相对路径: file://TestRole-Trust-Policy.json

全路径:

Windows:file://C:/test/TestRole-Trust-Policy.json

Linux: file:///data/test/TestRole-Trust-Policy.json

2.  给予此IAM角色访问帐户中资源的权限。在本示例中,我假设您的应用程序需要只读访问您帐户中的所有Amazon S3存储桶和存储桶中的对象。因此,您将使用AmazonS3ReadOnlyAccess AWS托管策略。有关AWS托管策略的详细信息,请参阅使用托管策略。在命令行中执行以下命令:

$aws iam attach-role-policy --role-name {YourNewRole} --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

3.  创建IAM实例配置文件{YourNewRole-Instance-Profile}。实例配置文件允许EC2将IAM角色{YourNewRole}传递给EC2实例。要了解更多信息,请参阅使用实例配置文件。在命令行中执行以下命令:

  $aws iam create-instance-profile --instance-profile-name {YourNewRole-Instance-Profile}

  $aws iam add-role-to-instance-profile --role-name {YourNewRole} --instance-profile-name {YourNewRole-Instance-Profile}

至此,您已成功创建IAM角色{YourNewRole}。

 

二、将IAM角色附加给现有EC2实例(最初没有IAM角色附加)

您现在可以将IAM角色{YourNewRole}附加到EC2实例{YourInstanceId}:

1.  获取现有EC2实例详细信息(记录InstanceId)。在命令行中执行以下命令:

$aws ec2 describe-instances

2.  将新创建的IAM角色{YourNewRole}的实例配置文件{YourNewRole-Instance-Profile} 附加到您的EC2实例{YourInstanceId}。在命令行中执行以下命令:

$aws ec2 associate-iam-instance-profile --instance-id {YourInstanceId} --iam-instance-profile Name={YourNewRole-Instance-Profile}

3.  验证IAM角色是否已附加到实例。在命令行中执行以下命令:

$aws ec2 describe-iam-instance-profile-associations

4.  打开AWS EC2控制台,查看实例的描述信息:

5.  进入EC2实例内,查看实例IAM角色具体信息:

$curl http://169.254.169.254/latest/meta-data/iam/security-credentials/{YourNewRole}

至此,您可以使用IAM角色访问AWS资源来更新应用程序,并把实例中的长期密钥删除。

三、更换附加到Amazon EC2的IAM角色

如果角色的使用需求发生改变,并且您希望通过修改IAM角色来授予EC2实例权限,则可以更换换附加到EC2的IAM角色。但是,这也将修改使用此IAM角色的其他EC2实例的权限。

可以采用调用replace-iam-instance-profile-association调用替换IAM角色命令, 将当前附加的IAM角色{YourNewRole}更换为另一个IAM角色{YourReplacementRole}(例如:EC2role2),而不终止您的EC2实例:

步骤:

1.  创建新的IAM实例配置文件{YourReplacementRole-Instance-Profile}指向新的IAM角色{YourReplacementRole},例如EC2Role。创建命令参考上节内容。

2.  获取现有EC2实例IAM附加信息(记录AssociationId)。在命令行中执行以下命令:

$aws ec2 describe-iam-instance-profile-associations

使用过滤条件和控制查询输出内容,获取指定EC2实例的

$aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-79dxxxx --query

    'IamInstanceProfileAssociations[*].{InstanceId:InstanceId,AssociationId:AssociationId}' --output table

3.  更换IAM角色。在命令行中执行以下命令:

$aws ec2 replace-iam-instance-profile-association --association-id {YourCurrentAssociationId}

    --iam-instance-profile Name={YourReplacementRole-Instance-Profile}

4.  根据AssociationId的值看出,IAM角色的更改已生效。打开AWS EC2控制台,查看实例的描述信息:

四、移除附加到Amazon EC2的IAM角色

在实际使用过程中,您的EC2可能不再需要通过角色使用AWS资源。这时候您可以选择移除附加在EC2上的IAM角色。

可以采用调用disassociate-iam-instance-profile调用移除IAM角色命令:

步骤:

1.  获取现有EC2实例IAM附加信息(记录AssociationId)。获取IAM信息命令参考上一节所述

2.  移除IAM角色。在命令行中执行以下命令:

$aws ec2 disassociate-iam-instance-profile --association-id {YourCurrentAssociationId }

3.  根据第二次查询现有EC2实例IAM附加信息为空可以看出,当前实例的IAM角色已被移除。

而在上述所有操作的过程中,均未影响EC2的运行状态。

总结:

做为安全最佳实践,让我们现在就行动起来,将所有需要使用AWS资源的Amazon EC2上添加对应的角色。

参考

[1]New! Attach an AWS IAM Role to an Existing Amazon EC2 Instance by Using the AWS CLI

[2]AWS命令行参考手册

[3]Demo脚本下载

 

作者介绍:

王元恺

AWS实习解决方案架构师,上海交通大学学生,有数年C++程序开发以及一年PHP前后端开发经验,同时致力于AWS云服务在国内的应用和推广。熟悉网站架设与网络应用开发,对于TCP/IP及网络协议有自己的理解和实践经验。

陈琳涛

AWS解决方案架构师。拥有超过15年的IT行业以及软件开发领域的工作经验。2000年投身互联网大潮,创办过自己的公司。长期从事网络相关研发和管理工作,热爱DevOps实践。随后,投身游戏行业,参与多个项目的研发,运维,上线工作。致力于使用云计算来帮助更多的创业者迈向成功。