Amazon Glacier的Scala客户端

晋俊贤
2023-12-01

Amazon Glacier是一项安全,耐用且成本极低的云存储服务,用于数据归档和长期备份。 Glacier提供了一种冷藏数据存档解决方案,这意味着已存储的数据不可立即检索。 您首先需要请求检索数据,访问时间可能从几分钟到几小时不等,具体取决于您选择的服务级别。

冷藏库乍一看可能很麻烦,但它也有其优点。 没有人能够不小心修改重要的存档文件。 如果需要,也可以完全防止删除。

Glacier设计用于不经常且异常的检索的用例,并且数据将被长时间存储。

概念

如果您以前从未使用过AWS服务或Glacier,则首先学习一些概念会有所帮助:

AWS区域 –同一地理区域中的一组命名的AWS资源。 区域彼此完全隔离,因此当您查看资源时,只会看到与指定区域相关联的资源。 用Glacier术语来说,存储的数据绑定到特定区域。 冰川存储价格因地区而异。

保管库 –用于以存档形式存储数据的容器。 保管库中可以存储无限数量的档案。 保管库及其内容仅在创建它们的区域中可用。 访问权限,通知和合规性控件在Vault级别上配置。

存档 –存档可以是任何数据,例如照片,视频或文档,并且是Amazon Glacier中存储的基本单位。 每个档案都有唯一的ID和可选的描述。 您可以上传一个文件作为存档,但是如果您汇总数据,则费用会更低。 存储在Amazon Glacier中的档案是不可变的,即可以上传,下载和删除档案,但不能像Dropbox这样的服务进行编辑或覆盖。

(库)清单 – AWS控制台将显示一个库清单,但不显示库内容或清单清单。 需要单独请求库存以进行检索,而完成该请求可能需要几个小时。

作业 –检索档案或保管库存(档案列表)是Amazon Glacier中的异步操作。 您首先启动任务,然后在Amazon Glacier完成任务后下载任务输出。 使用Amazon Glacier,您的数据检索请求将排队,并且作业将需要数小时才能完成。

通知配置 –由于作业需要时间才能完成,因此Amazon Glacier支持通知机制,以在作业完成时通知您。 您可以配置保管库,以在作业完成时将通知发送到Amazon Simple Notification Service(Amazon SNS)主题。 您可以在通知配置中为每个保管库指定一个SNS主题。

可以在以下位置找到有关这些概念的更多信息: Amazon Glacier数据模型

冰川客户

Amazon Glacier可以与Amazon AWS CLI一起使用,但是使用起来非常笨拙,尤其是对于档案上传。 一些备份工具支持基于Glacier的存储,但是我遇到的那些备份工具似乎不适合服务器端备份或编程用途。 Amazon AWS Console允许您例如创建和配置保管库,但不支持存档操作。

Glacier客户端是我创建的用于与Amazon Glacier一起使用的简单工具。 它旨在支持交互式使用(与Scala REPL一起使用)以及与Scala或Java一起以编程方式使用。 非常适合服务器端使用。 Glacier客户端基于适用于Java的Amazon AWS开发工具包构建。

该代码可以在GitHub上找到: https : //github.com/marko-asplund/glacier-client

设置冰川

AWS配置

要使用Glacier,您需要首先在AWS Console中设置AWS用户帐户和权限,如下所示:

  • 在AWS IAM中创建用户帐户(身份和访问管理)
  • 向用户授予以下权限:AmazonGlacierFullAccess,授予AmazonSQSFullAccess,AmazonSNSFullAccess
  • 创建访问密钥

某些操作(例如创建文件库清单或准备要下载的存档)是异步执行的。 设置通知将对这些操作有所帮助。 您需要在Vault上启用通知并在AWS Console中配置相应的SNS主题。

Glacier客户端设置

设置AWS凭证

设置Glacier客户端授权的最简单方法是配置“默认凭证配置文件”,如使用AWS凭证中所述

个人档案文件是一种具有简单文件格式的文本文件,因此您可以按照上述页面上的说明,仅使用文本编辑器进行设置。

您还可以通过使用AWS CLI调用“ aws configure”命令来设置默认凭证文件来设置文件,如AWS CLI configure options中所述

获取冰川客户

要运行glacier-client,您需要安装Git,sbt和Java JRE。

git clone https://github.com/marko-asplund/glacier-client.git
cd glacier-client

基本操作

使用sbt启动Scala REPL

~/glacier-backup-cli (master ✔) ᐅ sbt console

[info] Loading settings from plugins.sbt ...
[info] Loading project definition from /Users/marko/glacier-backup-cli/project
[info] Loading settings from build.sbt ...
[info] Set current project to glacier-backup-cli (in build file:/Users/marko/glacier-backup-cli/)
[info] Starting scala interpreter...
Welcome to Scala 2.11.11 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151).
Type in expressions for evaluation. Or try :help.

列出可用的AWS区域的名称

scala> fi.markoa.glacier.GlacierClient.regions
res0: Array[String] = Array(us-gov-west-1, us-east-1, us-east-2, us-west-1, us-west-2, eu-west-1, eu-west-2, eu-central-1, ap-south-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2, sa-east-1, cn-north-1, ca-central-1)

创建连接到us-west-2区域的Glacier客户

scala> val c = fi.markoa.glacier.GlacierClient("us-west-2")
c: fi.markoa.glacier.GlacierClient = fi.markoa.glacier.GlacierClient@11b6e34a

创建新的保管库。 返回新创建的保管库的ID(或ARN)。

scala> c.createVault("test-vault-1")
res1: String = /429963740182/vaults/test-vault-1

列出该地区的所有保管库。 返回一个保管库对象序列,在这种情况下,它仅包含我们上面创建的保管库。 请注意,使用Vault操作时,结果将立即可见。

scala> c.listVaults
res2: Seq[fi.markoa.glacier.Vault] = ArrayBuffer(Vault(arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,test-vault-1,2017-11-19T08:18:38.990Z,None,0,0))

现在,我们准备将档案上传到Vault中:

scala> c.uploadArchive("test-vault-1", "my backup archive", "my-backup.zip")
TransferStarted: transfer started
TransferProgress: transfer progress: 5% (bytes: 516096)
TransferProgress: transfer progress: 10% (bytes: 1024000)
TransferProgress: transfer progress: 15% (bytes: 1540096)
TransferProgress: transfer progress: 20% (bytes: 2048000)
TransferProgress: transfer progress: 25% (bytes: 2564096)
TransferProgress: transfer progress: 30% (bytes: 3072000)
...
TransferProgress: transfer progress: 90% (bytes: 9216000)
TransferProgress: transfer progress: 95% (bytes: 9732096)
TransferProgress: transfer progress: 100% (bytes: 10240000)
TransferCompleted: transfer completed
res3: fi.markoa.glacier.Archive = Archive(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw,Some(my-backup.zip),0c5dc86251d157e29cfadb04ac615426600a4e1177a8ac2c1134d895378b3acd,10240000,Some(my backup archive))

请注意,Glacier不会维护最新的列表保管库内容-需要明确请求内容列表,并且准备过程可能会花费很长时间。 因此,Glacier客户端会为每个保管库存储本地档案目录。 保管箱内容可以列出如下:

scala> c.catListArchives("test-vault-1")
res4: Seq[fi.markoa.glacier.Archive] = ArraySeq(Archive(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw,Some(my-backup.zip),0c5dc86251d157e29cfadb04ac615426600a4e1177a8ac2c1134d895378b3acd,10240000,Some(my backup archive)))

在提取档案之前需要准备档案,准备工作可能需要几个小时。 因此,异步检索它们通常更为方便:1)请求归档检索,而Glacier完成归档准备后,您可以2)下载。

scala> c.prepareArchiveRetrieval("test-vault-1", "WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw")
res1: Option[String] = Some(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv)

归档检索已添加到Vault的作业列表中。 您可以列出未完成的作业,如下所示:

scala> c.listJobs("test-vault-1")
res4: Seq[fi.markoa.glacier.Job] = ArrayBuffer(Job(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv,arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,ArchiveRetrieval,null,2017-11-19T09:00:34.339Z,InProgress,null,None,Some(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw)))

注意正在进行的状态。 存档准备工作完成后,作业列表将如下所示:

scala> c.listJobs("test-vault-1")
res8: Seq[fi.markoa.glacier.Job] = ArrayBuffer(Job(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv,arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,ArchiveRetrieval,null,2017-11-19T09:00:34.339Z,Succeeded,Succeeded,Some(2017-11-19T12:52:38.363Z),Some(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw)))

设置通知使您不必定期轮询作业完成状态,而不必接收通知。 可以通过AWS控制台设置通知。

然后可以使用检索作业ID从Glacier下载准备好的档案:

scala> c.downloadPreparedArchive("test-vault-1", "h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv", "my-backup-restored.zip")
TransferStarted: transfer started
TransferProgress: transfer progress: 5% (bytes: 520869)
TransferProgress: transfer progress: 10% (bytes: 1025701)
TransferProgress: transfer progress: 15% (bytes: 1547941)
TransferProgress: transfer progress: 20% (bytes: 2052773)
TransferProgress: transfer progress: 25% (bytes: 2575013)
TransferProgress: transfer progress: 30% (bytes: 3079845)
...
TransferProgress: transfer progress: 90% (bytes: 9228965)
TransferProgress: transfer progress: 95% (bytes: 9736869)
TransferProgress: transfer progress: 100% (bytes: 10240000)
TransferCompleted: transfer completed

基本操作就是这样!

Glacier客户端让您执行的其他一些任务包括删除保管库,请求保管库清单(保管库包含的档案列表),下载清单和删除档案。

翻译自: https://www.javacodegeeks.com/2017/11/scala-client-amazon-glacier.html

 类似资料: