Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

示例演练 1:为存储桶配置通知 (消息目标:SNS 主题和 SQS 队列)

演练摘要

在此演练中,您在存储桶上添加请求 Amazon S3 执行以下操作的通知配置:

  • s3:ObjectCreated:* 类型的事件发布到 Amazon SQS 队列。

  • s3:ReducedRedundancyLostObject 类型的事件发布到 Amazon SNS 主题。

有关通知配置的信息,请参阅 配置 Amazon S3 事件通知

您可以使用控制台执行这些步骤,无需编写任何代码。此外,还提供了使用适用于 Java 和 .NET 的 AWS 开发工具包的代码示例,因此您可以通过编程方式添加通知配置。

您将在此演练中执行以下操作:

  1. 创建一个 Amazon SNS 主题。

    您可使用 Amazon SNS 控制台创建 SNS 主题并订阅该主题,以便发布到此主题的所有事件都传送给您。您将指定电子邮件作为通信协议。在创建主题后,Amazon SNS 会发送电子邮件。您必须单击电子邮件中的链接以确认订阅主题。

    您可将访问策略附加到此主题以授予 Amazon S3 发布消息的权限。

  2. 创建 Amazon SQS 队列。

    使用 Amazon SQS 控制台,可创建 SQS 队列。您可以通过编程方式访问 Amazon S3 发送到此队列的所有消息。但对于此演练,您将在控制台中验证通知消息。

    您可将访问策略附加到此主题以授予 Amazon S3 发布消息的权限。

  3. 将通知配置添加到存储桶。

步骤 1:创建 Amazon SNS 主题

按照以下步骤创建并订阅 Amazon Simple Notification Service (Amazon SNS) 主题。

  1. 使用 Amazon SNS 控制台创建主题。有关说明,请参阅 Amazon Simple Notification Service 开发人员指南 中的创建主题

  2. 订阅至主题。对于此练习,请使用电子邮件作为通信协议。有关说明,请参阅 Amazon Simple Notification Service 开发人员指南 中的订阅主题

    您将收到电子邮件要求您确认订阅该主题。确认订阅.

  3. 使用以下策略替换附加到主题的访问策略。您必须通过提供您的 SNS 主题 ARN 和存储桶名称来更新策略。:

    Copy
    { "Version": "2008-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "AWS":"*" }, "Action": [ "SNS:Publish" ], "Resource": "SNS-topic-ARN", "Condition": { "ArnLike": {         "aws:SourceArn": "arn:aws-cn:s3:*:*:bucket-name" } } } ] }
  4. 记录主题 ARN。

    您创建的 SNS 主题是您的 AWS 账户中的另一项资源,它有唯一的 Amazon 资源名称 (ARN)。在下一步骤中,您需要用到此 ARN。ARN 格式如下:

    Copy
    arn:aws-cn:sns:aws-region:account-id:topic-name

步骤 2:创建 Amazon SQS 队列

按照以下步骤创建并订阅 Amazon Simple Queue Service (Amazon SQS) 队列。

  1. 使用 Amazon SQS 控制台创建队列。有关说明,请参阅 Amazon Simple Queue Service 开发人员指南 中的 Amazon SQS 入门

  2. 使用以下策略替换附加到队列的访问策略 (在 SQS 控制台中,选择队列,然后在 Permissions 选项卡中,单击 Edit Policy Document (Advanced))。

    Copy
    { "Version": "2008-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "AWS":"*" }, "Action": [ "SQS:SendMessage" ], "Resource": "SQS-queue-ARN", "Condition": { "ArnLike": {         "aws:SourceArn": "arn:aws-cn:s3:*:*:bucket-name" } } } ] }
  3. 记录队列 ARN

    您创建的 SQS 队列是您的 AWS 账户中的另一项资源,它有唯一的 Amazon 资源名称 (ARN)。在下一步骤中,您需要用到此 ARN。ARN 格式如下:

    Copy
    arn:aws-cn:sqs:aws-region:account-id:queue-name

步骤 3:将通知配置添加到存储桶

您可以使用 Amazon S3 控制台或以编程方式使用 AWS 开发工具包启用存储桶通知。选择任何一个选项以配置存储桶通知。此部分提供使用适用于 Java 和 .NET 的 AWS 开发工具包的代码示例。

步骤 3 (选项 a) :使用控制台在存储桶上启用通知

使用 Amazon S3 控制台,添加请求 Amazon S3 执行以下操作的通知配置:

  • s3:ObjectCreated:* 类型的事件发布到您的 Amazon SQS 队列。

  • s3:ReducedRedundancyLostObject 类型的事件发布到您的 Amazon SNS 主题。

在您保存通知配置后,Amazon S3 将发布测试消息,您将通过电子邮件收到该消息。

有关说明,请参阅如何为 S3 存储桶启用和配置事件通知? (在 Amazon Simple Storage Service 控制台用户指南 中)。

步骤 3 (选项 b) :使用适用于 .NET 的 AWS 开发工具包在存储桶上启用通知

下面的 C# 代码示例提供一个完整的代码列表,用于为存储桶添加通知配置。您需要更新该代码,提供您的存储桶名称和 SNS 主题 ARN。有关如何创建和测试有效示例的信息,请参阅 运行 Amazon S3 .NET 代码示例

Copy
using System; using System.Collections.Generic; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class EnableNotifications { static string bucketName = "***bucket name***"; static string snsTopic = "***SNS topic ARN***"; static string sqsQueue = "***SQS queue ARN***"; static string putEventType = "s3:ObjectCreated:Put"; static string rrsObjectLostType = "s3:ObjectCreated:Copy"; public static void Main(string[] args) { using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { Console.WriteLine("Enabling Notification on a bucket"); EnableNotification(client); } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } static void EnableNotification(IAmazonS3 client) { try { List<Amazon.S3.Model.TopicConfiguration> topicConfigurations = new List<TopicConfiguration>(); topicConfigurations.Add(new TopicConfiguration() { Event = rrsObjectLostType, Topic = snsTopic }); List<Amazon.S3.Model.QueueConfiguration> queueConfigurations = new List<QueueConfiguration>(); queueConfigurations.Add(new QueueConfiguration() { Events = new List<string> { putEventType }, Queue = sqsQueue }); PutBucketNotificationRequest request = new PutBucketNotificationRequest { BucketName = bucketName, TopicConfigurations = topicConfigurations, QueueConfigurations = queueConfigurations }; PutBucketNotificationResponse response = client.PutBucketNotification(request); } catch (AmazonS3Exception amazonS3Exception) { if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity"))) { Console.WriteLine("Check the provided AWS Credentials."); Console.WriteLine( "To sign up for service, go to http://aws.amazon.com/s3"); } else { Console.WriteLine( "Error occurred. Message:'{0}' when enabling notifications.", amazonS3Exception.Message); } } } } }

步骤 3 (选项 c) :使用适用于 Java 的 AWS 开发工具包在存储桶上启用通知

下面的 Java 代码示例提供一个完整的代码列表,用于为存储桶添加通知配置。您需要更新该代码,提供您的存储桶名称和 SNS 主题 ARN。有关如何创建和测试有效示例的说明,请参阅 测试 Java 代码示例

Copy
import java.io.IOException; import java.util.Collection; import java.util.EnumSet; import java.util.LinkedList; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.BucketNotificationConfiguration; import com.amazonaws.services.s3.model.TopicConfiguration; import com.amazonaws.services.s3.model.QueueConfiguration; import com.amazonaws.services.s3.model.S3Event; import com.amazonaws.services.s3.model.SetBucketNotificationConfigurationRequest; public class NotificationConfigurationOnABucket { private static String bucketName = "*** bucket name ***"; private static String snsTopicARN = "*** SNS Topic ARN ***"; private static String sqsQueueARN = "*** SQS Queue ARN ***"; public static void main(String[] args) throws IOException { AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); try { System.out.println("Setting notification configuration on a bucket.\n"); BucketNotificationConfiguration notificationConfiguration = new BucketNotificationConfiguration(); notificationConfiguration.addConfiguration( "snsTopicConfig", new TopicConfiguration(snsTopicARN, EnumSet .of(S3Event.ReducedRedundancyLostObject))); notificationConfiguration.addConfiguration( "sqsQueueConfig", new QueueConfiguration(sqsQueueARN, EnumSet .of(S3Event.ObjectCreated))); SetBucketNotificationConfigurationRequest request = new SetBucketNotificationConfigurationRequest(bucketName, notificationConfiguration); s3client.setBucketNotificationConfiguration(request); } catch (AmazonS3Exception ase) { System.out.println("Caught an AmazonServiceException, which " + "means your request made it " + "to Amazon S3, but was rejected with an error response" + " for some reason."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); System.out.println("Error XML" + ase.getErrorResponseXml()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which " + "means the client encountered " + "an internal error while trying to " + "communicate with S3, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); } } }

步骤 4:测试设置

现在,您可以通过将对象上传到存储桶来测试设置,并在 Amazon SQS 控制台中验证事件通知。有关说明,请参阅 《Amazon Simple Queue Service 开发人员指南》的“开始使用”部分 中的接收消息