Category: 存储


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

将大规模数据由内部环境迁移至云端往往是业务转移工作中的最大挑战——但这种挑战本不必存在。即使配合高速传输连接,将PB甚至EB规模的影片库、财务记录、卫星图像或者科学数据通过互联网进行转移仍然需要耗时数年甚至数十年。从商业角度来看,添置新型网络或者升级现有连接显然并不现实,特别是考虑到转移完成后数据中心将不再需要这样奢侈的网络资源。

去年我们公布了AWS Snowball服务(具体请参阅AWS Snowball——利用Amazon提供的存储设备在一周内迁移1 PB数据)作为大规模数据迁移的一种可行方案。凭借着80 TB高存储容量,这些设备能够很好地解决大多数客户面临的难题,而且其目前已经得到广泛采用。

然而,对于拥有EB级别内部存储规模的客户,这80 TB容量仍然显得相当可怜。通过计算,他们发现要完成全部数据的迁移需要大量设备,并且需要解决令人头痛的大规模物流寄送问题。

AWS Snowmobile介绍

为了满足此类客户的实际需求,我们在AWS re:Invent 2016上公布了Snowmobile服务。这一安全数据存储车可容纳高达100 PB数据,从而帮助大家在数周之内将EB级别数据迁移至AWS当中(如果必要,您还可以使用多辆存储车)。其设计目标在于帮助来自金融服务、媒体及娱乐、科学乃至其它行业的客户解决问题。Snowmobile可接入您的网络并作为本地NFS挂载式分卷使用。大家可利用现有备份与归档工具将需要上传至Amazon简单存储服务(简称S3)或者Amazon Glacier的数据导入其中。

从物理结构来看地,Snowmobile采用一款坚固耐用且难于侵入的,尺寸为45英尺长、9.6英尺高、8英尺宽海运集装箱作为外壳。Snowmobile具备防水防恶劣天气设计,能够随意停靠在您现有数据中心附近。每台Snowmobile需要使用350千瓦交流电源; 如果大家现场不具备充足电力,我们还可提供发电机供其运作。

在安全层面,Snowmobile将包括从监管追踪到视频监控在内的多个逻辑与物理保护层,并加以结合。用户的数据利用AWS密钥管理服务(简称KMS)提供的密钥进行加密,而后才会被写入设备当中。每套集装箱都配备有GPS追踪,其利用蜂窝或者卫星连接与AWS方面进行通信。我们将在Snowmobile行进过程中安排一辆安保车全程保护。在Snowmobile处于您的内部基础设施附近时,我们还可以提供专门的安保人员进行配合。

每台Snowmobile中包含一根网络线缆,连接在一台高速交换机上,能够通过多条40 Gb/S的连接以1 Tb/S的速率传输数据,从而实现高速数据交换能力。假定大家的现有网络能够在传输速度上达到这一水平,则可在约10天时间内装满一台Snowmobile。

Snowmobile的运作

我个人手头没有EB级别数据中心,我当然也没有足够的空间容纳这一45英尺长的大型集装箱。不过为了帮助大家更好地理解Snowmobile的运作流程,我决定使用自己的乐高组装台,并借此建立起一套缩小模型。我希望大家能够喜欢这种以小见大的解释方式!

下面从客户的数据中心起步。其之前就已经构建完成,而且已经颇有年头。机架中塞满了不同年份的磁盘与磁带驱动器,每一台都包含有珍贵的关键性业务数据。而您和您的同事则不得不将大量时间投入到规划楼层面积、追踪线路排布以及尽可能压榨性能方面:

而管理者则越来越沮丧,不知道这样勉强为之的作法还能持续多久:

幸运的是,一位同事每天都在关注博客,而她借此找到了解决问题的办法:

在与AWS进行通话之后,双方很快安排了一次会议:

大家齐聚AWS办公室,希望了解更多与Snowmobile以及迁移计划相关的细节信息:

大家围在Snowmobile微缩模型周边,连小狗也来凑热闹。管理者则拍下了照片:

一辆Snowmobile出现在您的数据中心附近:

AWS Professional Services(专业服务)帮助大家将其与设施对接,从而开始进行数据传输:

Snowmobile重新驶回AWS,而您的数据亦按照指定要求导入至云端!

Snowmobile在 DigitalGlobe的表现

作为我们的合作伙伴,DigitalGlobe公司利用Snowmobile将100 PB卫星图像数据迁移至AWS当中。以下为Jay Littlepage(前Amazon员工,现任DigitalGlobe公司基础设施与运营副总裁)对于这项服务的评论:

与多数大型企业一样,我们也在努力将IT运营负载由自有数据中心迁移至AWS。我们的地理空间大数据平台GBDX自建立以来始终以AWS作为运行基础。但我们的高分辨率卫星影像已经拥有16年的收集历史,其覆盖地球表面60亿平方公里面积且始终存放在自有设施之内。我们虽然已经开始将归档逐步迁移至AWS,但整个过程缓慢且效率低下。我们的卫星每年都在生成更多地球拍摄影像(10 PB),而其总量甚至超过了以往迁移能力的上限。

我们需要一套解决方案,能够把我们现有的100 PB归档快速迁移至AWS环境当中,但在Snowmobile出现之后并无可行的途径可用。DigitalGlobe公司目前能够将全部原始影像归档直接通过一辆Snowmobile转移至Amazon Glacier存储库内。AWS Snowmobile运营人员提供极为出色的定制化服务,他们协助进行了配置、监控与物流追踪。利用Snowmobile强大的数据传输能力,我们得以越来越快地将影像归档导入至AWS端,这使得我们的客户及合作伙伴能够快速获取海量数据集。通过在GBDX当中使用AWS的弹性计算平台,我们将能够运行分布式图像分析、以前所未有的速度揭示全球范围内的环境变化速度与格局发展趋势,并以较内部设施更具成本效益的方式获得洞察结论。如果没有Snowmobile,我们无法在这么短的时间内传递如此庞大的数据集或者为客户创造新的商业机遇。Snowmobile已经成为真正的游戏规则改变者!

需要了解的情况

以下为大家应当了解的,与Snowmobile相关的一些情况:

数据导出——这项服务的最初目标在于实现面向AWS的数据导入。但我们很清楚,也有一部分客户希望借此实现数据导出,从而建立起更为快速高效的灾难恢复用例。

推出时间——Snowmobile目前已经在全部AWS服务区正式上线。正如在以上章节中所提到,其并不属于自助服务型产品。大家可以同AWS方面的销售人员讨论实际需求以及需要进行导入的具体数据类型与规模。

价格——目前还无法公布确切的定价信息。然而,我们可以保证Snowmobile在速度与实施成本上优于基于网络的数据传输模式。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/aws-snowmobile-move-exabytes-of-data-to-the-cloud-in-weeks/

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

背景介绍

Amazon S3是互联网存储解决方案,能让所有开发人员访问同一个具备可扩展性、可靠性、安全性和快速价廉的数据存储基础设施。Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 互联网上的任何位置存储和检索任何数量的数据。开发人员可以利用Amazon提供的REST API接口,命令行接口或者支持不同语言的SDK访问S3服务。

对于原来使用本地目录访问数据的应用程序,比如使用本地磁盘或网络共享盘保存数据的应用系统,如果用户希望把数据放到S3上,则需要修改数据的访问方式,比如修改为使用AWS SDK 或CLI访问S3中存储的数据。为了让用户原来的应用系统能在不做修改的情况下直接使用Amazon S3服务,需要把S3存储桶作为目录挂载到用户服务器的本地操作系统上。常用的挂载工具有S3fs和SubCloud等。本文主要介绍如何利用S3fs将S3存储桶挂载到Amazon EC2 Linux实例上。

S3fs介绍

S3fs是基于FUSE的文件系统,允许Linux和Mac Os X 挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式。关于S3fs的详细介绍,请参见:https://github.com/s3fs-fuse/s3fs-fuse

利用S3fs挂载S3存储桶

一、准备

  1. 使用拥有足够权限的IAM账号登录AWS控制台。
  2. 创建S3存储桶,给存储桶命名如“s3fs-mount-bucket”(如果使用已有存储桶,本步骤可略过)。

     3. 创建具有该S3存储桶访问权限的 IAM 用户,并为该IAM用户创建访问密钥。

a) 关于如何创建IAM用户,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console

b) 关于如何为IAM用户创建访问密钥,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html

c) 关于如何为IAM用户设置权限策略,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html

https://aws.amazon.com/cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/

4. 创建并启动Amazon EC2 Linux实例

具体过程请参见:http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/launching-instance.html

二、安装和配置S3fs

  1. 安装s3fs

a) 使用Amazon EC2默认用户“ec2-user”和对应的私钥文件登录启动的Linux实例(请注意将下边例子中的私钥文件和ec2实例域名替换为用户自己的值)

ssh -i /path/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com

b) 安装必要的软件包

sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

c) 下载,编译并安装s3fs

git clone https://github.com/s3fs-fuse/s3fs-fuse.git

cd s3fs-fuse

./autogen.sh

./configure

make

sudo make install

d) 检查s3fs是否安装成功

[ec2-user@ip-172-31-23-148 s3fs-fuse]$ s3fs

s3fs: missing BUCKET argument.

Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

 

[ec2-user@ip-172-31-23-148 ~]$ which s3fs

/usr/local/bin/s3fs

2. 创建IAM用户访问密钥文件

  • IAM用户访问密钥内容可以写入当前用户默认密钥文件比如“/home/ec2-user/.passwd-s3fs”或者用户自己创建的文件。
  • 命令格式:echo [IAM用户访问密钥ID]:[ IAM用户访问密钥] >[密钥文件名]
  • 命令举例:下面的例子将在当前用户默认路径创建密钥文件

echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /home/ec2-user/.passwd-s3fs

请注意:访问海外AWS S3服务和中国 S3服务使用的是不同的IAM账号,对应不同的密钥。

3. 设置密钥文件只能够被当前用户访问

  • 命令格式:chmod 600  [密钥文件名]
  • 命令举例:下面的例子将设置密钥文件只能被当前用户访问

chmod 600 /home/ec2-user/.passwd-s3fs

三、手动挂载S3存储桶

S3fs挂载存储桶使用的命令是s3fs

s3fs的命令格式是:

  • s3fs BUCKET MOUNTPOINT [OPTION]…
  • s3fs [S3存储桶名] [本地目录名] [OPTION]
  • OPTION是可选项,格式是 –o <option_name>=<option_value>,常用的options有:
     名称 含义 缺省值
    passwd_file 指定挂载的密钥文件
    connect_timeout 设置超时连接等待的时间,单位秒 300
    url 设置访问s3的url http://s3.amazonaws.com
    endpoint 设置s3存储桶的endpoint us-east-1
    allow_other 设置allow_other允许所有用户访问挂载点目录,设置这个选项需要在 /etc/fuse.conf 文件添加user_allow_other选项

手动挂载AWS海外区域S3存储桶

  • 命令格式:s3fs [S3存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o endpoint=[区域名]

命令举例:下面的例子将名为“s3fs-mount-bucket”的新加坡区域S3存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”。

s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o endpoint=ap-northeast-1

手动挂载AWS中国北京区域S3存储桶

  • 命令格式:s3fs [S3存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1
  • 命令举例:下面的例子将名为“s3fs-mount-bucket”的北京区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”。

s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1

检查挂载结果

  • 挂载操作执行结束后,可以使用Linux “df”命令查看挂载是否成功。出现类似下面256T的s3fs文件系统即表示挂载成功。用户就可以进入本地挂载目录去访问存储在S3存储桶中的对象。

[ec2-user@ip-172-31-23-148 ~]$ df -h

文件系统        容量  已用  可用 已用% 挂载点

devtmpfs        488M   56K  488M    1% /dev

tmpfs           498M     0  498M    0% /dev/shm

/dev/xvda1      7.8G  1.2G  6.6G   15% /

s3fs            256T     0  256T    0% /home/ec2-user/s3mnt

 

[ec2-user@ip-172-31-23-148 ~]$ cd /home/ec2-user/s3mnt

[ec2-user@ip-172-31-23-148 s3mnt]$ ls -l

总用量 1

-rw-rw-r-- 1 ec2-user ec2-user 19 10月 18 07:13 a.txt

[ec2-user@ip-172-31-23-148 s3mnt]$

卸载挂载的S3存储桶

  • 如果不再需要通过挂载方式访问S3存储桶,可以使用Linux “umount”命令卸载。

[ec2-user@ip-172-31-23-148 ~]$ sudo umount /home/ec2-user/s3mnt

[ec2-user@ip-172-31-23-148 ~]$ df -h

文件系统        容量  已用  可用 已用% 挂载点

devtmpfs        488M   56K  488M    1% /dev

tmpfs           498M     0  498M    0% /dev/shm

/dev/xvda1      7.8G  1.2G  6.6G   15% /

调试

如果遇到手动挂载不成功的问题,请尝试在执行的命令后面添加下面的参数,并检查输出日志中的错误提示信息:

  • 命令格式:[完整的s3fs挂载命令] -d -d -f -o f2 -o curldbg
  • 命令举例:下面的例子试图将名为“s3fs-mount-bucket”的S3存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”下,并输出挂载过程详细调试日志。

[ec2-user@ip-172-31-23-148 ~]$ s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1 -d -d -f -o f2 -o curldbg

[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [CRT] to [INF]

[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [INF] to [DBG]

[INF]     s3fs.cpp:set_moutpoint_attribute(4196): PROC(uid=500, gid=500) - MountPoint(uid=500, gid=500, mode=40775)

FUSE library version: 2.9.4

nullpath_ok: 0

nopath: 0

utime_omit_ok: 0

四、设置开机自动挂载S3存储桶

A. 创建全局IAM用户访问密钥文件

切换Linux系统用户账号到“root”用户,把IAM用户访问密钥内容写入/etc/passwd-s3fs文件中,并限制该文件的访问权限。“/etc/passwd-s3fs”文件是s3fs保存IAM用户访问密钥的全局默认路径。

请注意:访问海外AWS S3服务和中国 S3服务使用的是不同的IAM账号,对应不同的密钥。

sudo su

echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /etc/passwd-s3fs

chmod 600 /etc/passwd-s3fs

B. 修改/etc/fstab文件

编辑/etc/fstab文件,添加后面的自动挂载命令。

vi /etc/fstab

B.1 自动挂载海外区域S3存储桶

  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse _netdev,allow_other,endpoint=[区域名] 0 0
  • 命令举例:添加下面的语句到/etc/fstab后,Linux系统启动后将自动把名为“s3fs-mount-bucket”的新加坡区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”,并允许其它操作系统用户(非root用户)访问。

/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse _netdev,allow_other,endpoint=ap-northeast-1 0 0

B.2 自动挂载中国北京区域S3存储桶

  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0  0
  • 命令举例:添加下面的语句到/etc/fstab后,Linux系统启动将自动把名为“s3fs-mount-bucket”的北京区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”下,并允许其它操作系统用户(非root用户)访问。

/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0  0

局限性

利用S3fs可以方便的把S3存储桶挂载在用户本地操作系统目录中,但是由于S3fs实际上是依托于Amazon S3服务提供的目录访问接口,所以不能简单的把S3fs挂载的目录和本地操作系统目录等同使用。用户使用S3f3挂载S3存储桶和直接访问S3服务有类似的使用场景。适用于对不同大小文件对象的一次保存(上传),多次读取(下载)。不适用于对已保存文件经常做随机修改,因为每次在本地修改并保存文件内容都会导致S3fs上传新的文件到Amazon S3去替换原来的文件。从访问性能上来说,通过操作系统目录方式间接访问Amazon S3存储服务的性能不如直接使用SDK或CLI接口访问效率高。以本地配置文件方式保存访问密钥的安全性也不如使用EC2 IAM角色方式高。

关于S3fs使用时候需要注意的更多细节,请参考下面s3fs官网内容:

 

“Generally S3 cannot offer the same performance or semantics as a local file system. More specifically:

  • random writes or appends to files require rewriting the entire file
  • metadata operations such as listing directories have poor performance due to network latency
  • eventual consistency can temporarily yield stale data
  • no atomic renames of files or directories
  • no coordination between multiple clients mounting the same bucket
    no hard links ”

通常S3不能提供与本地文件系统相同的性能或语义。进一步来说:

  • 随机写入或追加到文件需要重写整个文件
  • 元数据操作比如列出目录会因为网络延迟原因导致性能较差
  • 最终一致性设计可能临时导致过期数据
  • 没有对文件或目录的原子重命名功能
  • 挂载相同存储桶的多个客户端之间没有相互协调机制
  • 不支持硬链接

总结

利用S3fs可以把共享的Amazon S3存储桶直接挂载在用户服务器本地目录下,应用不需要做修改就可以直接使用Amazon S3存储服务,这种方式可以作为临时解决方案将传统应用快速迁移到AWS平台。

在已经提供了Amazon EFS(Elastic File System)服务的AWS区域,建议用户优先考虑使用Amazon EFS服务,因为它具有更高的性能。在目前还没有提供EFS服务的AWS区域,用户可以先暂时使用S3fs实现快速业务迁移。然后逐步调整S3数据访问实现方式,最终修改为使用AWS SDK或CLI方式高效并更加安全地访问S3存储服务。

 

作者介绍:

蒙维

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构咨询和设计,有超过十年以上电信行业和移动互联网行业复杂应用系统架构和设计经验,主要擅长分布式和高可用软件系统架构设计,移动互联网应用解决方案设计,研发机构DevOps最佳实施过程。

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

As a managed database service, Amazon RDS takes care of the more routine aspects of setting up, running, and scaling a relational database. We first launched support for SQL Server in 2012. Continuing our effort to add features that have included SSL support, major version upgrades, transparent data encryption, enhanced monitoring and Multi-AZ, we have now added support for SQL Server native backup/restore.

SQL Server native backups include all database objects: tables, indexes, stored procedures and triggers. These backups are commonly used to migrate databases between different SQL Server instances running on-premises or in the cloud. They can be used for data ingestion, disaster recovery, and so forth. The native backups also simplify the process of importing data and schemas from on-premises SQL Server instances, and will be easy for SQL Server DBAs to understand and use.

Support for Native Backup/Restore

You can now take native SQL Server database backups from your RDS instances and store them in an Amazon S3 bucket. Those backups can be restored to an on-premises copy of SQL Server or to another RDS-powered SQL Server instance.  You can also copy backups of your on-premises databases to S3 and then restore them to an RDS SQL Server instance. SQL Server Native Backup/Restore with Amazon S3 also supports backup encryption using AWS Key Management Service (Note) across all SQL Server editions. Storing and transferring backups in and out of AWS through S3 provides you with another option for disaster recovery.

You can enable this feature by adding the SQL_SERVER_BACKUP_RESTORE option to an option group and associating the option group with your RDS SQL Server instance. This option must also be configured with your S3 bucket information and can include a KMS key to encrypt the backups.

Start by finding the desired option group:

Then add the SQL_SERVER_BACKUP_RESTORE option, specify (or create) an IAM role to allow RDS to access S3, point to a bucket, and (if you want) specify and configure encryption:

After you have set this up,  you can use SQL Server Management Studio to connect to the database instance and invoke the following stored procedures (available within the msdb database) as needed:

  • rds_backup_database – Back up a single database to an S3 bucket.
  • rds_restore_database – Restore a single database from S3.
  • rds_task_status – Track running backup and restore tasks.
  • rds_cancel_task – Cancel a running backup or restore task.

To learn more, take a look at Importing and Exporting SQL Server Data.

Note
Key Management Service is not currently available in AWS China (BJS) region, operated by SINNET. You may go to other AWS regions to deploy this service.

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

1.S3上传文件介绍

使用亚马逊云的朋友经常需要上传文件到S3存储,亚马逊S3提供了在单个操作中上传文件和分段上传文件两种方式。使用单个操作上传,每次可以上传最大5GB的文件。如果使用分段上传来上传文件,可以 上传最大大小为5TB的文件。

2.分段上传的概念及其优势

分段上传允许将一个文件分割成多个分段 ,您可以按任意顺序上传这些文件分段。如果任意分段传输失败,可以重新传输该分段且不会影响其他分段。当对象的所有段都上传后,S3 可以使用这些分段创建对象。一般而言,如果您的文件大小达到了 100 MB,您应该考虑使用分段上传,而不是在单个操作中上传文件。

分段上传的优势主要有以下几点:

  • 提高吞吐量

如果需要上传的文件比较大,使用直接上传方式,效率很低。而使用亚马逊S3分段上传功能,通过并行上传分段以提高吞吐量,能充分利用当前的带宽,提高了上传效率。

  • 从网络问题中快速恢复

如果使用分段上传,某个分段失败了,你只需要重新上传这个分段,将上传文件时由于网络错误所产生的影响降至最低。

  •  突破S3单文件上传限制

当文件大于5GB,你只能将文件分片,然后分段上传。

3.S3分段上传的核心规范

S3分段上传的部分指标如下表所示:

4. S3分段上传的权限配置

使用S3分段上传需要适当的权限配置,相比于S3的单文件上传,S3在分段上传时需要部分额外的权限,最低的S3分段上传权限配置如下所示:

{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "s3:AbortMultipartUpload",

                "s3:GetObject",

                "s3:ListBucketMultipartUploads",

                "s3:ListMultipartUploadParts",

                "s3:PutObject"

            ],

            "Resource": [

                "*"

            ]

        }

    ]

}

具体AWS API分段上传的权限要求,请参考AWS官方文档:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuAndPermissions.html

5. 使用AWS CLI的自动分段上传

使用AWS的s3 cp命令和s3 sync等命令可以自动对要上传的大文件分片,然后上传。下面以一个视频文件myvideo.mp4为例,详细介绍如何使用s3 cp命令将文件分段上传到AWS 北京区域。

第一步:配置AWS 命令行(CLI)环境

使用命令行上传S3文件,首先要安装AWS CLI环境,AWS CLI是管理和访问AWS服务的工具,AWS CLI可以安装在Windows、OSX、Linux、Unix等多种环境上,关于如何安装CLI环境,也可以参考下面链接:

http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-welcome.html

完成CLI的安装后,首先运行下面命令配置CLI环境:

[ec2-user@ip-192-10-x-xxx mnt]$ aws configure

命令输出内容如下:

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

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

Default region name [None]:

Default output format [None]:

如上示例可以看到,运行aws configure后,需要输入下面四个参数:

AWS Access Key ID

要访问AWS的资源,需要配置用户认证信息。在AWS CLI中可以通过访问密钥来实现用户认证。本例通过访问密钥来实现认证,如果您还没有为用户生成访问密钥,可以在AWS console中,选择“用户”后,可以看到“Security Credentials”的选项,点击“Create Access Key”就可以为用户生成访问的Key ID和Access Key,你可以下载生成的Excel密钥文件,查看Access Key ID和Secret Access Key的值。另外,请确保您生成密钥的用户具有访问S3的相关权限。最低的S3分段上传权限配置在文档的前半部分已经介绍。

AWS Secret Access Key:

查看用户生成的密钥文件并输入Access Key的值。

Default region name:

默认区域名称。这是您希望默认对其进行调用的区域的名称。由于在本用例中我们需要调用北京区域的S3服务,因此请输入cn-north-1。

Default output format

默认输出格式,此格式可以是json、文本或表。如果不指定输出格式,将使用 json。这里我们使用默认的json选项。

第二步:运行复制命令

运行s3 cp命令如下:

[ec2-user@ip-192-10-x-xxx data]$ aws s3 cp myvideo.mp4 s3://multiple-upload-test/myvideo.mp4

上面我们使用cp命令将myvideo.mp4文件上传到北京区multiple-upload-test存储桶中,输出信息如下:

upload: ./myvideo.mp4 to s3://multiple-upload-test/myvideo.mp4

在命令运行过程中,你可以看到文件自动被分成多个片段然后分段上传到目标存储通,上传完成后,你就可以在目标存储桶中看到完整的文件。使用aws s3 sync也可以实现自动的分段上传。

6.使用AWS CLI的手工分段上传

在有些情况下,您可能希望手工分段上传文件到S3,下面还是以视频文件myvideo.mp4为例,介绍如何将大文件手工分段然后上传到AWS 北京区域。

第一步:配置AWS 命令行(CLI)环境

请参考上一节配置CLI环境,如果已经配置好环境,可以直接进入第二步。

第二步:将文件分割成多个分片

目前需要上传myvideo.mp4,使用ls命令查看要上传的文件,如下所示:

[ec2-user@ip-192-10-x-xxx data]$ ls -l

total 76272

-rwxrwxrwx 1 ec2-user ec2-user 78102279 Jun 24 06:51 myvideo.mp4

可以看到目前文件大概78M,使用split命令将文件分成40M大小的文件。

split -b 40m myvideo.mp4 myvideo-part-

split命令的参数说明如下:

1.   -b参数指定分割文件大小;

2.   myvideo-part-是指定生成分割文件的文件名前缀。

当运行完命令后,我们查看当前目录,即可发现生成的分割片段。

[ec2-user@ip-192-10-0-232 data]$ ls -l

total 152544

-rwxrwxrwx 1 ec2-user ec2-user 78102279 Jun 24 06:51 myvideo.mp4

-rw-rw-r-- 1 ec2-user ec2-user 41943040 Jun 24 06:57 myvideo-part-aa

-rw-rw-r-- 1 ec2-user ec2-user 36159239 Jun 24 06:57 myvideo-part-ab

可以看到split命令将myvideo.mp4分割成两个以myvideo-part-开头的分片文件。

第三步:初始化分段上传

使用AWS分段上传create-multipart-upload命令启动分段上传,运行下面命令:

aws s3api create-multipart-upload --bucket multiple-upload-test --key myvideo.mp4

其中:

bucket:要上传S3的bucket名称;

key:要上传文件的名称。

运行命令后返回信息如下:

{

    "Bucket": " multiple-upload-test",

    "UploadId": "_m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO",

    "Key": "myvideo.mp4"

}

看到返回具体的UploadId则说明初始化分段上传成功,后续我们需要使用UploadId来完成上传分段文件的各项操作,因此请妥善保管该UploadId。

启动分段上传后,可以使用list-multipart-uploads命令查看分段上传具体信息,示例如下:

aws s3api list-multipart-uploads --bucket multiple-upload-test

同样地,当中的bucket为要上传S3的bucket名称,与上述命令一致。

返回信息:

{

    "Uploads": [

        {

            "Initiator": {

                "DisplayName": "xxxxxxx",

                "ID": "arn:aws-cn:iam::xxxxxxxx:user/xxxxx"

            },

            "Initiated": "2016-06-24T07:17:28.000Z",

            "UploadId": "_m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO",

            "StorageClass": "STANDARD",

            "Key": "myvideo.mp4",

            "Owner": {

                "ID": "9ad8x098aa27467exxxf6f04d5eaxxx6e6e93d5067ba5bdd86dbb68ddb2511bd"

            }

        }

    ]

第四步:上传文件分片

首先上传第一个分片文件,命令如下:

aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 1 --body myvideo-part-aa --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

其中:

bucket:要上传S3的bucket名称;

key:要上传文件的名称。

part-number:当前上传分片文件的分段编号。(需要注意的是,上传分段时,除了指定上传 ID,还必须指定分段编号。您可以选择 1 和 10000 之间的任意分段编号。分段编号在您正在上传的数据元中唯一地识别分段及其位置。如果您使用之前上传的分段的同一分段编号上传新分段,则之前上传的分段将被覆盖。无论您何时上传分段,Amazon S3 都将在其响应中返回 ETag 标头。对于每个分段上传,您必须记录分段编号和 ETag 值。您需要在随后的请求中包括这些值以完成分段上传。这个参数很重要,当完成所有的分段上传后,S3将按照分段编号从小到大的顺序把分段拼接起来。)

body:当前上传分片文件的本地路径。

upload-id:初始化分段上传时系统返回的UploadId。

返回信息:

{

    "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\""

}

看到返回码ETag则说明上传成功。

同样地,我们继续上传第二个分片文件,命令如下:

aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 2 --body myvideo-part-ab --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

返回信息:

{

    "ETag": "\"03902e3af09f974cd406f988587d0814\""

}

上传分段文件后,可以使用list-parts命令查看上传信息:

aws s3api list-parts --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

返回信息如下:

{

    "Owner": {

        "ID": "9ad8c098aa27467ec9ef6f04d5ea97a6e6e93d5067ba5bdd86dbb68ddb2511bd"

    },

    "Initiator": {

        "DisplayName": "lanyong",

        "ID": "arn:aws-cn:iam::xxxxxxxxxx:user/xxxxxx"

    },

    "Parts": [

        {

            "LastModified": "2016-06-24T07:34:21.000Z",

            "PartNumber": 1,

            "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\"",

            "Size": 41943040

        },

        {

            "LastModified": "2016-06-24T07:39:16.000Z",

            "PartNumber": 2,

            "ETag": "\"03902e3af09f974cd406f988587d0814\"",

            "Size": 36159239

        }

    ],

    "StorageClass": "STANDARD"

}

在返回的信息中我们可以查看分段上传的所有者信息以及各分段的详细信息。在下述的完成文件组装中您需要用到各分段的ETag信息,您可以在本条命令的返回中获取。当然,在每次分段上传后也会返回ETag信息,您也可以把他们分别记录下来。

第五步:完成文件组装

所有分段都被上传后,S3需要具体分段信息来重新组装原始文件,需要的内容包括每次上传的分段序号及上传后返回的ETag。每个分段的文件序号和ETag可以从上个命令list-parts中获取。 获取的文件序号和ETag需要使用如下示例格式包装:

{

"Parts": [

        {

            "ETag": "82eba7dcefdb5dd5bc72247c3f5543ca",

            "PartNumber": 1

 

        },

        {

            "ETag": "03902e3af09f974cd406f988587d0814",

            "PartNumber": 2

        }

        ]

}

将上文本保存为文件,放于当前目录下。然后运行complete-multipart-upload命令完成文件的组装:

aws s3api complete-multipart-upload --multipart-upload file://mpustructs --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

 

当中的mpustructs为上述组装文件的文件名,用户可自定义。

返回信息:

{

    "ETag": "\"45f9fd2960aa026c44eec4618bc592a2-2\"",

    "Bucket": "multiple-upload-test",

    "Location": "https://s3.cn-north-1.amazonaws.com.cn/multiple-upload-test/myvideo.mp4",

    "Key": "myvideo.mp4"

}

完成分段上传后,Amazon S3 会按分段编号的升序顺序将各个段连接起来,从而创建对象。如果在开始分段上传请求中提供了任何数据元元数据,则 Amazon S3 会将该元数据与数据元相关联。成功完成请求后,分段将不再存在。

需要特别注意的是,启动分段上传并上传一个或多个分段之后,您必须完成或中止分段上传,才能停止收取上传的段的存储费用。只有在完成或中止分段上传之后,Amazon S3 才会释放段存储并停止向您收取段存储费用。具体的段存储费用,请参考AWS官方文档:http://aws.amazon.com/cn/s3/pricing/

为了防止用户上传分段后没有完成或中止分段所产生的不必要费用,作为最佳实践,AWS建议在分段上传操作中加入存储桶生命周期管理策略,在超过一定时间后,自动中止未完成的分段上传。具体存储桶生命周期策略的设置方法,请参考AWS官方文档:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuoverview.html#mpuploadpricing

第六步:检查您S3 bucket中的文件

上传完成后,请检查您的bucket,你就可以看到文件已成功上传并组装完成了。

7.总结

本文介绍了如何使用AWS CLI向S3分段上传大数据文件,以打破S3单文件上传的限制、提高网络吞吐量以及快速地从网络问题中得以恢复。除此之外,AWS还提供包括Java、PHP、.NET等丰富的开发工具包以实现S3分段上传大文件,用户可以根据自己的需要选择不同的接入渠道。既然一切都准备就绪,那就开始吧。相信S3分段上传将有效地解决用户的大文件上传问题,提供更好的用户体验。

作者简介

蓝勇

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在DR解决方案、数据仓库、RDS服务、企业应用、自动化运维等方面有着广泛的设计和实践经验。在加入AWS之前,在甲骨文中国担任资深售前工程师,负责售前方案咨询和架构设计,在数据库,中间件,大数据及企业应用方面有丰富经验。