使用 Amazon 软件开发工具包将文件存档到 Amazon S3 Glacier,获取通知并启动任务 - Amazon S3 Glacier
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

如果您不熟悉 Amazon Simple Storage Service (Amazon S3) 中的归档存储功能,建议您先详细了解 Amazon S3 中的 S3 Glacier 存储类、S3 Glacier 即时检索S3 Glacier 灵活检索S3 Glacier 深度归档。有关更多信息,请参阅 Amazon S3 用户指南中的 S3 Glacier 存储类和用于存档对象的存储类。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon 软件开发工具包将文件存档到 Amazon S3 Glacier,获取通知并启动任务

以下代码示例展示了如何:

  • 创建 Amazon S3 Glacier 文件库。

  • 配置文件库,将通知发布到 Amazon SNS 主题。

  • 将档案文件上传到文件库。

  • 启动档案检索任务。

Python
适用于 Python (Boto3) 的 SDK
注意

还有更多相关信息 GitHub。在 Amazon 代码示例存储库中查找完整示例,了解如何进行设置和运行。

创建一个包装 S3 Glacier 操作的类。

import argparse import logging import os import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) class GlacierWrapper: """Encapsulates Amazon S3 Glacier API operations.""" def __init__(self, glacier_resource): """ :param glacier_resource: A Boto3 Amazon S3 Glacier resource. """ self.glacier_resource = glacier_resource def create_vault(self, vault_name): """ Creates a vault. :param vault_name: The name to give the vault. :return: The newly created vault. """ try: vault = self.glacier_resource.create_vault(vaultName=vault_name) logger.info("Created vault %s.", vault_name) except ClientError: logger.exception("Couldn't create vault %s.", vault_name) raise else: return vault def list_vaults(self): """ Lists vaults for the current account. """ try: for vault in self.glacier_resource.vaults.all(): logger.info("Got vault %s.", vault.name) except ClientError: logger.exception("Couldn't list vaults.") raise @staticmethod def upload_archive(vault, archive_description, archive_file): """ Uploads an archive to a vault. :param vault: The vault where the archive is put. :param archive_description: A description of the archive. :param archive_file: The archive file to put in the vault. :return: The uploaded archive. """ try: archive = vault.upload_archive( archiveDescription=archive_description, body=archive_file ) logger.info( "Uploaded %s with ID %s to vault %s.", archive_description, archive.id, vault.name, ) except ClientError: logger.exception( "Couldn't upload %s to %s.", archive_description, vault.name ) raise else: return archive @staticmethod def initiate_archive_retrieval(archive): """ Initiates an archive retrieval job. Standard retrievals typically complete within 3—5 hours. When the job completes, you can get the archive contents by calling get_output(). :param archive: The archive to retrieve. :return: The archive retrieval job. """ try: job = archive.initiate_archive_retrieval() logger.info("Started %s job with ID %s.", job.action, job.id) except ClientError: logger.exception("Couldn't start job on archive %s.", archive.id) raise else: return job @staticmethod def list_jobs(vault, job_type): """ Lists jobs by type for the specified vault. :param vault: The vault to query. :param job_type: The type of job to list. :return: The list of jobs of the requested type. """ job_list = [] try: if job_type == "all": jobs = vault.jobs.all() elif job_type == "in_progress": jobs = vault.jobs_in_progress.all() elif job_type == "completed": jobs = vault.completed_jobs.all() elif job_type == "succeeded": jobs = vault.succeeded_jobs.all() elif job_type == "failed": jobs = vault.failed_jobs.all() else: jobs = [] logger.warning("%s isn't a type of job I can get.", job_type) for job in jobs: job_list.append(job) logger.info("Got %s %s job %s.", job_type, job.action, job.id) except ClientError: logger.exception("Couldn't get %s jobs from %s.", job_type, vault.name) raise else: return job_list def set_notifications(self, vault, sns_topic_arn): """ Sets an Amazon Simple Notification Service (Amazon SNS) topic as a target for notifications. Amazon S3 Glacier publishes messages to this topic for the configured list of events. :param vault: The vault to set up to publish notifications. :param sns_topic_arn: The Amazon Resource Name (ARN) of the topic that receives notifications. :return: Data about the new notification configuration. """ try: notification = self.glacier_resource.Notification("-", vault.name) notification.set( vaultNotificationConfig={ "SNSTopic": sns_topic_arn, "Events": [ "ArchiveRetrievalCompleted", "InventoryRetrievalCompleted", ], } ) logger.info( "Notifications will be sent to %s for events %s from %s.", notification.sns_topic, notification.events, notification.vault_name, ) except ClientError: logger.exception( "Couldn't set notifications to %s on %s.", sns_topic_arn, vault.name ) raise else: return notification

调用包装器类上的函数,以创建文件库并上传文件,然后将文件库配置为发布通知并启动检索档案的任务。

def upload_demo(glacier, vault_name, topic_arn): """ Shows how to: * Create a vault. * Configure the vault to publish notifications to an Amazon SNS topic. * Upload an archive. * Start a job to retrieve the archive. :param glacier: A Boto3 Amazon S3 Glacier resource. :param vault_name: The name of the vault to create. :param topic_arn: The ARN of an Amazon SNS topic that receives notification of Amazon S3 Glacier events. """ print(f"\nCreating vault {vault_name}.") vault = glacier.create_vault(vault_name) print("\nList of vaults in your account:") glacier.list_vaults() print(f"\nUploading glacier_basics.py to {vault.name}.") with open("glacier_basics.py", "rb") as upload_file: archive = glacier.upload_archive(vault, "glacier_basics.py", upload_file) print( "\nStarting an archive retrieval request to get the file back from the " "vault." ) glacier.initiate_archive_retrieval(archive) print("\nListing in progress jobs:") glacier.list_jobs(vault, "in_progress") print( "\nBecause Amazon S3 Glacier is intended for infrequent retrieval, an " "archive request with Standard retrieval typically completes within 3–5 " "hours." ) if topic_arn: notification = glacier.set_notifications(vault, topic_arn) print( f"\nVault {vault.name} is configured to notify the " f"{notification.sns_topic} topic when {notification.events} " f"events occur. You can subscribe to this topic to receive " f"a message when the archive retrieval completes.\n" ) else: print( f"\nVault {vault.name} is not configured to notify an Amazon SNS topic " f"when the archive retrieval completes so wait a few hours." ) print("\nRetrieve your job output by running this script with the --retrieve flag.")

有关 S Amazon DK 开发者指南和代码示例的完整列表,请参阅将 S3 Glacier 与 Amazon SDK 结合使用。本主题还包括有关入门的信息以及有关先前的 SDK 版本的详细信息。