メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

チュートリアル例 1: バケットを通知用に設定する(メッセージの宛先: SNS トピックおよび SQS キュー)

チュートリアルの概要

このチュートリアルでは、バケットに通知設定を追加して、Amazon S3 に次のことをリクエストします。

  • s3:ObjectCreated:* タイプのイベントを Amazon SQS キューに発行する。

  • s3:ReducedRedundancyLostObject タイプのイベントを Amazon SNS トピックに発行する。

通知設定の情報については、「 Amazon S3 イベント通知の設定」を参照してください。

コンソールを使用して、コードを記述することなく、これらの手順をすべて実行できます。また、通知設定をプログラムで追加できるように、AWS SDK for Java および .NET を使用したコード例も提供しています。

このチュートリアルでは、次の作業を行います。

  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:s3:*:*:bucket-name" } } } ] }
  4. トピックの ARN を書き留めておきます。

    作成した SNS トピックは、AWS アカウント内の別のリソースであり、一意の Amazon リソースネーム(ARN)があります。この ARN は次のステップで必要になります。ARN は次のような形式になります。

    Copy
    arn:aws: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:s3:*:*:bucket-name" } } } ] }
  3. キューの ARN を書き留めておきます。

    作成した SQS キューは、AWS アカウント内の別のリソースであり、一意の Amazon リソースネーム (ARN) があります。この ARN は次のステップで必要になります。ARN は次のような形式になります。

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

ステップ 3: 通知設定をバケットに追加する

Amazon S3 コンソールを使用するか、プログラムで AWS SDK を使用して、バケットの通知を有効にすることができます。バケットでの通知を設定するオプションのいずれかを選択します。このセクションでは、AWS SDK for Java および AWS SDK for .NET を使用するコード例を示します。

ステップ 3(オプション a): コンソールを使用してバケットの通知を有効にする

Amazon S3 コンソールを使用して、通知設定を追加し、Amazon S3 に次のことをリクエストします。

  • s3:ObjectCreated:* タイプのイベントを Amazon SQS キューに発行する。

  • s3:ReducedRedundancyLostObject タイプのイベントを Amazon SNS トピックに発行する。

通知設定を保存すると、Amazon S3 がテストメッセージを投稿し、それをメールで受け取ります。

手順については、「S3 バケットのイベント通知を有効化および設定する方法」(Amazon Simple Storage Service コンソールユーザーガイド) を参照してください。

ステップ 3(オプション b): AWS SDK for .NET を使用してバケットの通知を有効にする

次の 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): AWS SDK for Java を使用してバケットの通知を有効にする

次の 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 開発者ガイドの「使用開始」セクションの「メッセージの受信」を参照してください。