如何帮EC2摸到S3上的数据
一般来说,因为s3的存储成本优势,我们都会把数据如bcl,fastq,bam,sam等全部丢到s3上长期保存,然后需要分析的时候,开启一台服务器EC2,拷贝这些数据到EC2连接的EBS/EFS上,再进行下一步的分析,那么问题来了,我怎么才能帮EC2摸到s3上的数据呢?
-- D.C
你该知道的
- EC2的AMI实际上保存在S3上,AMI是为了快速启动几十上百台同样分析环境的机器
- EBS的snapshot实际上也保存在S3上,snapshot可以让我们快速恢复数据,如数据库,分析流程,还可以作为模板,快速创建同样类型的磁盘,如预置好特定IOPS的io1型EBS。
- S3上的每个文件都是一个object对象,桶是这个对象最高的命名空间(namespace),类似于访问internet的域名,如果开通了ICP备案白名单,并将这个对象和所在桶的访问权限开放,那么这个对象就可以用http的URL (Uniform Resource Locator)进行访问,比如:
http://aws-s3-bucket1.s3.amazonaws.com/photos/mygarden.jpg
你该掌握的
-
如何创建虚拟机EC2
-
如何用CLI登录EC2
-
如何上传数据到S3
方式1 - GET 或 wget
这两个命令我们一定不陌生吧,wget是HTTP和FTP客户端的常用下载方式,默认在Amazon Linux中都安装好的。所以如果我们知道要下载对象的URL,就可以用这个命令下载:
wget https://my_bucket.s3.amazonaws.com/path-to-file
需要注意:
- 要先登录到EC2上
- S3已经开了ICP备案的白名单(联系aws)
- 访问的对象包括对象所在的桶权限是公开的,否则会收到错误信息“ERROR 403: Forbidden”
方式2 - AKSK访问
什么是AKSK? 简单来说,我们在aws账户下新建user的时候,都会给我们一个csv格式文件,里面保存的就是AKSK两个key,在向云端发起访问时向它证明你就是你。
通过配置EC2上的AWS CLI 访问S3上的桶和文件,AWS CLI默认都在EC2上装好的。在这台EC2上配置好CLI的AKSK信息,就可以向S3进行数据交互了,而且无须申请S3的ICP备案 白名单,缺点是每台EC2都要配置一次AKSK密钥信息,不太安全。
$ aws configure
AWS Access Key ID [****************xxxx]: # 输入你的AK key
AWS Secret Access Key [****************xxxx]: # 输入你的SK key
Default region name [cn-northwest-1]: # 宁夏:cn-northwest-1,北京:cn-north-1
Default output format [json]: # 默认json
配置完之后利用aws cli中的S3模块命令进行数据拷贝:
- 将一个对象从 Amazon S3 复制到EC2:
aws s3 cp s3://my_bucket/my_folder/my_file.ext my_copied_file.ext
- 将一个对象从您的实例复制到 Amazon S3:
aws s3 cp my_copied_file.ext s3://my_bucket/my_folder/my_file.ext
- 将S3上的桶/文件夹同步到EC2:
aws s3 sync s3://remote_S3_bucket ./
aws s3 sync s3://remote_S3_bucket/myfolder ./myfolder
- 将EC2上的文件夹复制到S3:
aws s3 sync myfolder s3://remote_S3_bucket/myfolder
方式3 - IAM角色设置(推荐)
以上两种方式有利有弊,用IAM角色来控制EC2的权限是官方推荐的最佳实践 哦。
什么是AWS IAM?全称AWS Identity and Access Management ,用于集中管理用户、访问密钥等安全凭证,以及控制用户和应用程序可以访问哪些 AWS 资源的权限。(这里仅作简要介绍,后面会开专贴详解)
- 登录aws control console,搜索IAM,点击进入
- 选择左侧角色(Roles),然后选择创建角色(Create role)
- 选择AWS 服务(AWS service),下方选择EC2,点击下一步
- 在搜索框内搜索
s3
, 选中AmazonS3FullAccess这条策略,点击下一步
- 给这个角色添加一些备注,请记住,不要对自己的记性过度自信:),点击下一步
- 给这个角色命个名:
ec2accs3full
, 点击创建角色,弹窗消失,可以看到角色列表里已经有我们刚刚创建的角色了。
- 回到EC2的控制台,选中你的EC2,点击上方的操作 菜单(Action),选择附加/替换 IAM角色 。
- 选中我们刚刚创建的策略
ec2accs3full
, 点击Apply 。
- 登录这台EC2,尝试看看S3上的东西,可以看到,报错了!
aws s3 ls
An error occurred (InvalidToken) when calling the ListBuckets operation: The provided token is malformed or otherwise invalid.
why ??? 很简单,我们知道,s3的桶名必是同区域内唯一的,但不同区域内的桶名是有可能相同的,所以,虽然我们给了EC2访问S3的权限,但是AWS全球那么多区域,它怎么知道去哪个区找你的s3呢?
$ aws configure
AWS Access Key ID [None]: # 不需要输入,直接回车
AWS Secret Access Key [None]: # 不需要输入,直接回车
Default region name [None]: cn-northwest-1 # 告诉它在哪个区域
Default output format [None]: json
再试试...#_#
$ aws s3 ls
2020-01-02 13:28:47 91porn
2020-01-09 13:15:15 athena
接下来,我们就可以用aws s3 cp
或是aws s3 sync
来和S3的数据进行交互了!不需要输入任何密钥,也不需要ICP备案白名单。以后再创建新的ec2服务器,直接attach我们创建好的角色 (Role)给它,再配置一次aws configure
就可以了!
道路千万条,安全第一条。