Herunterladen eines Tresorinventars in Amazon S3 Glacier mitAWS SDK for .NET - Amazon S3 Glacier

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Herunterladen eines Tresorinventars in Amazon S3 Glacier mitAWS SDK for .NET

Nachfolgend werden die Schritte zum Abrufen eines Tresorinventars mithilfe der Low-Level-API für AWS SDK for .NET beschrieben. Die High-Level-API unterstützt das Abrufen von Tresorinventar nicht.

  1. Erstellen einer Instance der AmazonGlacierClient-Klasse (Client).

    Sie müssen einAWSRegion, in der sich der Tresor befindet. Alle Operationen, die Sie mit diesem Client durchführen, gelten fürAWSRegion :

  2. Initiieren Sie durch Ausführen der InitiateJob-Methode einen Auftrag zum Abrufen des Inventars.

    Sie stellen Stelleninformationen in einemInitiateJobRequest-Objekt. Amazon S3 Glacier (S3 Glacier) gibt als Antwort eine Auftrags-ID zurück. Die Antwort ist in einer Instance der InitiateJobResponse-Klasse verfügbar.

    AmazonGlacierClient client; client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2); InitiateJobRequest initJobRequest = new InitiateJobRequest() { VaultName = vaultName, JobParameters = new JobParameters() { Type = "inventory-retrieval", SNSTopic = "*** Provide Amazon SNS topic arn ***", } }; InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest); string jobId = initJobResponse.JobId;
  3. Warten Sie, bis der Auftrag abgeschlossen wurde.

    Sie müssen warten, bis die Ausgabe des Auftrags zum Download bereit ist. Wenn Sie entweder eine Benachrichtigungskonfiguration auf dem Tresor unter Angabe eines Amazon Simple Notification Service (Amazon SNS) -Thema eingerichtet haben oder während der Initiierung einer Aufgabe ein Amazon SNS-Thema angegeben haben, sendet S3 Glacier nach Abschluss der Aufgabe eine Nachricht an das betreffende Thema. Im Codebeispiel im folgenden Abschnitt wird Amazon SNS for S3 Glacier verwendet, um eine Nachricht zu veröffentlichen.

    Sie können den S3 Glacier auch abfragen, indem Sie dieDescribeJob-Methode zum Ermitteln des Aufgabenabschlussstatus. Allerdings wird die Verwendung von Amazon SNS SNS-Themen für Benachrichtigungen empfohlen.

  4. Laden Sie die Auftragsausgabe (Tresorinventardaten) herunter, indem Sie die GetJobOutput-Methode ausführen.

    Sie erstellen eine Instance der GetJobOutputRequest-Klasse, um Ihre Konto-ID, den Tresornamen und die Auftrags-ID bereitzustellen. Wenn Sie keine Konto-ID angeben, wird die Konto-ID übernommen, die den Anmeldeinformationen zugeordnet ist, die Sie zum Signieren der Anforderung verwenden. Weitere Informationen finden Sie unter Verwendung derAWS SDK for .NETmit Amazon S3 Glacier .

    Die Ausgabe, die S3 Glacier zurückgibt, ist imGetJobOutputResponse-Objekt.

    GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest() { JobId = jobId, VaultName = vaultName }; GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest); using (Stream webStream = getJobOutputResponse.Body) { using (Stream fileToSave = File.OpenWrite(fileName)) { CopyStream(webStream, fileToSave); } }

    Anmerkung

    Informationen zu der REST-API, die dem Auftrag zugrunde liegt, finden Sie unter Auftragsoperationen.

Beispiel: Abrufen eines Tresorinventars mit der Low-Level-API desAWS SDK for .NET

Im folgenden C#-Codebeispiel wird das Tresorinventar vom angegebenen Tresor abgerufen.

Das Beispiel führt die folgenden Aufgaben durch:

  • Richten Sie ein Amazon SNS SNS-Thema ein.

    S3 Glacier sendet nach Abschluss der Aufgabe eine Benachrichtigung an dieses Thema.

  • Richten Sie eine Amazon SQS SQS-Warteschlange ein.

    Im Beispiel wird der Warteschlange eine Richtlinie angefügt, um dem Amazon SNS SNS-Thema das Veröffentlichen von Nachrichten zu ermöglichen.

  • Initiieren Sie einen Auftrag zum Herunterladen des angegebenen Archivs.

    In der Aufgabenanforderung im Beispiel wird das Amazon SNS SNS-Thema angegeben, damit S3 Glacier nach Abschluss der Aufgabe eine Nachricht senden kann.

  • Überprüfen Sie regelmäßig die Amazon SQS SQS-Warteschlange auf Nachrichten.

    Ist eine Nachricht vorhanden, parsen Sie das JSON und prüfen Sie, ob der Auftrag erfolgreich abgeschlossen wurde. Wenn eine Nachricht enthalten ist, laden Sie das Archiv herunter. Im Codebeispiel wird die JSON.NET-Bibliothek (siehe JSON.NET) zum Analysieren von JSON verwendet.

  • Bereinigen Sie das Gerät, indem Sie das Amazon SNS SNS-Thema und die von ihm erstellte Amazon SQS SQS-Warteschlange löschen.

using System; using System.Collections.Generic; using System.IO; using System.Threading; using Amazon.Glacier; using Amazon.Glacier.Model; using Amazon.Glacier.Transfer; using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; using Amazon.SQS; using Amazon.SQS.Model; using Newtonsoft.Json; namespace glacier.amazon.com.docsamples { class VaultInventoryJobLowLevelUsingSNSSQS { static string topicArn; static string queueUrl; static string queueArn; static string vaultName = "*** Provide vault name ***"; static string fileName = "*** Provide file name and path where to store inventory ***"; static AmazonSimpleNotificationServiceClient snsClient; static AmazonSQSClient sqsClient; const string SQS_POLICY = "{" + " \"Version\" : \"2012-10-17\"," + " \"Statement\" : [" + " {" + " \"Sid\" : \"sns-rule\"," + " \"Effect\" : \"Allow\"," + " \"Principal\" : {\"AWS\" : \"arn:aws:iam::123456789012:root\" }," + " \"Action\" : \"sqs:SendMessage\"," + " \"Resource\" : \"{QuernArn}\"," + " \"Condition\" : {" + " \"ArnLike\" : {" + " \"aws:SourceArn\" : \"{TopicArn}\"" + " }" + " }" + " }" + " ]" + "}"; public static void Main(string[] args) { AmazonGlacierClient client; try { using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) { Console.WriteLine("Setup SNS topic and SQS queue."); SetupTopicAndQueue(); Console.WriteLine("To continue, press Enter"); Console.ReadKey(); Console.WriteLine("Retrieve Inventory List"); GetVaultInventory(client); } Console.WriteLine("Operations successful."); Console.WriteLine("To continue, press Enter"); Console.ReadKey(); } catch (AmazonGlacierException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } finally { // Delete SNS topic and SQS queue. snsClient.DeleteTopic(new DeleteTopicRequest() { TopicArn = topicArn }); sqsClient.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl }); } } static void SetupTopicAndQueue() { long ticks = DateTime.Now.Ticks; // Setup SNS topic. snsClient = new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.USWest2); sqsClient = new AmazonSQSClient(Amazon.RegionEndpoint.USWest2); topicArn = snsClient.CreateTopic(new CreateTopicRequest { Name = "GlacierDownload-" + ticks }).TopicArn; Console.Write("topicArn: "); Console.WriteLine(topicArn); CreateQueueRequest createQueueRequest = new CreateQueueRequest(); createQueueRequest.QueueName = "GlacierDownload-" + ticks; CreateQueueResponse createQueueResponse = sqsClient.CreateQueue(createQueueRequest); queueUrl = createQueueResponse.QueueUrl; Console.Write("QueueURL: "); Console.WriteLine(queueUrl); GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest(); getQueueAttributesRequest.AttributeNames = new List<string> { "QueueArn" }; getQueueAttributesRequest.QueueUrl = queueUrl; GetQueueAttributesResponse response = sqsClient.GetQueueAttributes(getQueueAttributesRequest); queueArn = response.QueueARN; Console.Write("QueueArn: ");Console.WriteLine(queueArn); // Setup the Amazon SNS topic to publish to the SQS queue. snsClient.Subscribe(new SubscribeRequest() { Protocol = "sqs", Endpoint = queueArn, TopicArn = topicArn }); // Add the policy to the queue so SNS can send messages to the queue. var policy = SQS_POLICY.Replace("{TopicArn}", topicArn).Replace("{QuernArn}", queueArn); sqsClient.SetQueueAttributes(new SetQueueAttributesRequest() { QueueUrl = queueUrl, Attributes = new Dictionary<string, string> { { QueueAttributeName.Policy, policy } } }); } static void GetVaultInventory(AmazonGlacierClient client) { // Initiate job. InitiateJobRequest initJobRequest = new InitiateJobRequest() { VaultName = vaultName, JobParameters = new JobParameters() { Type = "inventory-retrieval", Description = "This job is to download a vault inventory.", SNSTopic = topicArn, } }; InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest); string jobId = initJobResponse.JobId; // Check queue for a message and if job completed successfully, download inventory. ProcessQueue(jobId, client); } private static void ProcessQueue(string jobId, AmazonGlacierClient client) { ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest() { QueueUrl = queueUrl, MaxNumberOfMessages = 1 }; bool jobDone = false; while (!jobDone) { Console.WriteLine("Poll SQS queue"); ReceiveMessageResponse receiveMessageResponse = sqsClient.ReceiveMessage(receiveMessageRequest); if (receiveMessageResponse.Messages.Count == 0) { Thread.Sleep(10000 * 60); continue; } Console.WriteLine("Got message"); Message message = receiveMessageResponse.Messages[0]; Dictionary<string, string> outerLayer = JsonConvert.DeserializeObject<Dictionary<string, string>>(message.Body); Dictionary<string, object> fields = JsonConvert.DeserializeObject<Dictionary<string, object>>(outerLayer["Message"]); string statusCode = fields["StatusCode"] as string; if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_SUCCEEDED, StringComparison.InvariantCultureIgnoreCase)) { Console.WriteLine("Downloading job output"); DownloadOutput(jobId, client); // Save job output to the specified file location. } else if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_FAILED, StringComparison.InvariantCultureIgnoreCase)) Console.WriteLine("Job failed... cannot download the inventory."); jobDone = true; sqsClient.DeleteMessage(new DeleteMessageRequest() { QueueUrl = queueUrl, ReceiptHandle = message.ReceiptHandle }); } } private static void DownloadOutput(string jobId, AmazonGlacierClient client) { GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest() { JobId = jobId, VaultName = vaultName }; GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest); using (Stream webStream = getJobOutputResponse.Body) { using (Stream fileToSave = File.OpenWrite(fileName)) { CopyStream(webStream, fileToSave); } } } public static void CopyStream(Stream input, Stream output) { byte[] buffer = new byte[65536]; int length; while ((length = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, length); } } } }