引言

做上游做多了,总有从 sra 数据 dump 不出来需要的东西的情况,有时候是缺一端的匹配数据,有时候是上传的 bam, 有时候是少 l1 文件,总之总有奇奇怪怪的理由不能用 sra, 这时候就需要使用 Amazon S3 下载原始数据。

Amazon S3 是一个对象存储服务,提供了高可用性和可扩展性,适合存储和检索大量数据。对于生物信息学领域,S3 是 NCBI 指定的数据交付手段。缺点:要钱。但第一年免费。

过程

注册帐号

https://portal.aws.amazon.com/billing/signup#/start/email

注册一个 AWS 帐号,注意需要绑定信用卡。

创建 S3 存储桶

地区我选的 us-east-1.

  1. 登录 AWS 管理控制台。
  2. 在服务列表中选择 S3。
  3. 点击“创建存储桶”。
  4. 输入存储桶名称(必须唯一)和区域。
  5. 配置存储桶设置(如版本控制、加密等)。
  6. 点击“创建存储桶”。

Use Cloud Data Delivery[3]

Deliver Data页面点击Choose data to deliver in Run Selector按钮选取数据集。

会跳转到https://www.ncbi.nlm.nih.gov/Traces/study/页面。

Choose destination bucket中选择刚才创建的 S3 存储桶。

Select one or more source file types中选择你需要的数据类型 (也就是除了 SRA Run 和 SRA Lite 以外的类型)。

发送!

下载数据

我很懒,所以使用了 Use Cloud Data Delivery 之后下载全部就完事了,然后等下载完成后删除,这样下次就还是全新的数据全下就好。

使用 AWS CLI 下载数据

第一,安装 AWS CLI:https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

第二,配置 AWS CLI:

1
aws configure

输入你的 AWS Access Key ID、Secret Access Key、默认区域和输出格式。

第三,使用以下命令下载数据:

1
aws s3 cp s3://your-bucket-name/path/to/your/file /local/path/to/save
1
aws s3 cp --recursive s3://datsra ./

增强下载工具

跳过下载失败文件

使用 aws s3 sync 命令:

aws s3 sync 命令会比较本地文件和 S3 上的对象的大小和最后修改时间,仅下载新增或已更改的文件。如果某些文件在之前的下载中失败,sync 命令会尝试重新下载这些文件。

1
aws s3 sync s3://datsra ./

请注意,sync 命令并不支持断点续传,如果下载过程中断,重新执行命令会从头开始下载整个文件。

如果不放心他下载什么可以使用--dryrun查看接下来要运行的动作,但并不会实际运行,完整命令是aws s3 sync s3://datsra ./ --dryrun.

使用支持断点续传的工具

我实际没有实验但是看起来还行。

由于 AWS CLI 不支持断点续传,您可以考虑使用支持该功能的工具,如 s5cmd。s5cmd 是一个高性能的 S3 和本地文件系统之间的文件传输工具,支持并发操作和断点续传,适合处理大量文件的下载任务。

安装 s5cmd(以 macOS 和 conda 为例):

1
2
brew install s5cmd
conda install s5cmd

使用 s5cmd 下载 S3 存储桶中的所有文件:

1
s5cmd sync s3://datsra/ ./

s5cmd 会自动跳过已成功下载的文件,并重新尝试下载失败的文件,支持断点续传,适合在网络不稳定的环境下使用。

账单查看

网页一天就失效而且那个验证码太难了吧…

还好命令行也能看。

1
2
3
4
aws ce get-cost-and-usage \
--time-period Start=2025-06-01,End=2025-06-02 \
--granularity DAILY \
--metrics "BlendedCost"

如果权限不够就是没添加权限策略 (An error occurred (AccessDeniedException) when calling the GetCostAndUsage operation: User: ** is not authorized to perform: ce:GetCostAndUsage on resource: arn:aws:ce:us-east-1:637423541882:/GetCostAndUsage because no identity-based policy allows the ce:GetCostAndUsage action)。

您遇到的错误提示表明,当前 IAM 用户(arn:aws:iam::637423541882:user/lev)未被授权执行 ce:GetCostAndUsage 操作。这通常是由于缺少相应的 IAM 策略所致。

要解决此问题,您需要为该 IAM 用户添加允许执行 ce:GetCostAndUsage 操作的权限。以下是一个示例策略,授予对 AWS Cost Explorer 的完全访问权限[4]:

1
2
3
4
5
6
7
8
9
10
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ce:*",
"Resource": "*"
}
]
}

您可以通过以下步骤将此策略附加到 IAM 用户:

  1. 登录到 AWS 管理控制台。
  2. 导航到 IAM 服务。
  3. 在左侧导航栏中,选择 用户,然后点击您的用户名(例如,lev)。
  4. 选择 权限 标签页。
  5. 点击 添加权限
  6. 选择 附加现有策略直接
  7. 点击 创建策略,然后选择 JSON 选项卡。
  8. 粘贴上述策略 JSON。
  9. 点击 下一步:标签,然后点击 下一步:查看
  10. 为策略命名,例如 CostExplorerFullAccess,然后点击 创建策略
  11. 返回到 添加权限 页面,刷新策略列表,搜索并选择刚创建的策略。
  12. 点击 下一步:查看,然后点击 添加权限。([Stack Overflow][1])

然后关于资费,我实际测试发送到云 100g 大约是 0.3 美元,也就是 2 人民币,然后下载网上说从美国东部 S3 存储桶下载数据到日本或台湾的互联网用户,属于“数据传出到互联网”,费用通常为每 GB $0.09 美元,也就是 6 毛左右。

结论

这技能做时间长了肯定用得上…

引用

  1. AWS S3 下载数据集必学入门教程 - 蓝鹰博客
  2. 新手 AWS S3 下载数据集必学入门教程-CSDN 博客
  3. Cloud Data Delivery Service
  4. user is not authorized to perform: ce:GetCostAndUsage - stackoverflow