Amazon Glacier 的 Scala 客户端

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(104)   2024-04-21 16:20:54

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

虽然冷库一开始可能会让人觉得很麻烦,但它也有它的优势。没有人能够意外修改重要的存档文件。如果需要,也可以完全防止删除。

Glacier 专为检索不频繁且异常的用例而设计,并且数据将存储很长时间。

概念

如果您之前没有使用过 AWS 服务或 Glacier,那么首先学习一些概念会很有帮助:

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

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

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

(Vault) Inventory – AWS 控制台将向您显示一个保险库列表,但不会显示一个保险库内容列表或库存。需要单独请求库存以进行检索,并且完成请求可能需要几个小时。

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

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

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

冰川客户端

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

Glacier 客户端是我为使用 Amazon Glacier 而创建的一个简单工具。它旨在支持交互式使用(使用 Scala REPL)以及使用 Scala 或 Java 进行编程。它非常适合服务器端使用。 Glacier 客户端基于 Amazon AWS SDK for Java 构建。

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

设置冰川

亚马逊配置

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

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

某些操作(例如创建保管库清单或准备下载档案)是异步执行的。设置通知将有助于这些操作。您需要在保管库上启用通知并在 AWS 控制台中配置相应的 SNS 主题。

冰川客户端设置

设置 AWS 凭证

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

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

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

获取冰川客户端

要运行 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 对象,在本例中它仅包括我们在上面创建的 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))

现在我们准备好将档案上传到保险库中:

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)

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

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)))

注意 InProgress 状态。存档准备完成后,作业列表将如下所示:

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 客户端让您执行的其他一些任务包括删除保管库、请求保管库清单(保管库包含的档案列表)、下载清单和删除档案。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-scala-client-amazon-glacier.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...