チュートリアル: 通知用のバケットを設定する (SNS トピックおよび SQS キュー) - Amazon Simple Storage Service

チュートリアル: 通知用のバケットを設定する (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 トピックを作成し、そのトピックにサブスクライブして、そこに投稿されたすべてのイベントが配信されるようにします。通信プロトコルとして E メールを指定します。トピックを作成すると、Amazon SNS は E メールを送信します。メール内のリンクをクリックして、トピックのサブスクリプションを確認する必要があります。

    トピックにアクセスポリシーをアタッチして、メッセージを発行するためのアクセス許可を 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 トピックの Amazon リソースネーム (ARN) とバケット名を指定して、ポリシーを更新する必要があります。

    { "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 は次のような形式になります。

    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. キューにアタッチされたアクセスポリシーを次のポリシーに置き換えます(Amazon SQS コンソールで、キューを選択し、[アクセス許可] タブで [ポリシードキュメントの編集 (高度)] を選択します)。

    { "Version": "2012-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. (オプション) Amazon SQS キューまたは Amazon SNS トピックで、AWS Key Management Service (AWS KMS) によるサーバー側の暗号化が有効になっている場合は、次のポリシーを関連するカスタマー管理の対称 AWS KMS CMK に追加します。

    Amazon SQS または Amazon SNS の AWS マネージド CMK は変更できないため、カスタマー管理 CMK にポリシーを追加する必要があります。

    { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" } ] }

    AWS KMS により Amazon SQS および Amazon SNS で SSE を使用する方法の詳細については、次を参照してください。

  4. キューの ARN をメモします。

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

    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 からテストメッセージが発行され、それを E メールで受け取ります。

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

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

次の C# のコード例では、バケットに通知設定を追加する完全なコードのリストを示します。コードを更新して、バケット名と SNS トピックの ARN を指定する必要があります。有効なサンプルを作成してテストする方法については、「Amazon S3 .NET コード例の実行」を参照してください。

using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class EnableNotificationsTest { private const string bucketName = "*** bucket name ***"; private const string snsTopic = "*** SNS topic ARN ***"; private const string sqsQueue = "*** SQS topic ARN ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableNotificationAsync().Wait(); } static async Task EnableNotificationAsync() { try { PutBucketNotificationRequest request = new PutBucketNotificationRequest { BucketName = bucketName }; TopicConfiguration c = new TopicConfiguration { Events = new List<EventType> { EventType.ObjectCreatedCopy }, Topic = snsTopic }; request.TopicConfigurations = new List<TopicConfiguration>(); request.TopicConfigurations.Add(c); request.QueueConfigurations = new List<QueueConfiguration>(); request.QueueConfigurations.Add(new QueueConfiguration() { Events = new List<EventType> { EventType.ObjectCreatedPut }, Queue = sqsQueue }); PutBucketNotificationResponse response = await client.PutBucketNotificationAsync(request); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' ", e.Message); } catch (Exception e) { Console.WriteLine("Unknown error encountered on server. Message:'{0}' ", e.Message); } } } }

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

次の例では、バケットに通知設定を追加する方法を示します。作業サンプルを作成およびテストする方法については、「Amazon S3 Java コード例のテスト」を参照してください。

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.io.IOException; import java.util.EnumSet; public class EnableNotificationOnABucket { public static void main(String[] args) throws IOException { String bucketName = "*** Bucket name ***"; Regions clientRegion = Regions.DEFAULT_REGION; String snsTopicARN = "*** SNS Topic ARN ***"; String sqsQueueARN = "*** SQS Queue ARN ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); BucketNotificationConfiguration notificationConfiguration = new BucketNotificationConfiguration(); // Add an SNS topic notification. notificationConfiguration.addConfiguration("snsTopicConfig", new TopicConfiguration(snsTopicARN, EnumSet.of(S3Event.ObjectCreated))); // Add an SQS queue notification. notificationConfiguration.addConfiguration("sqsQueueConfig", new QueueConfiguration(sqsQueueARN, EnumSet.of(S3Event.ObjectCreated))); // Create the notification configuration request and set the bucket notification configuration. SetBucketNotificationConfigurationRequest request = new SetBucketNotificationConfigurationRequest( bucketName, notificationConfiguration); s3Client.setBucketNotificationConfiguration(request); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }

ステップ 4: セットアップをテストする

この時点で、セットアップをテストするために、バケットにオブジェクトをアップロードし、Amazon SQS コンソールでイベント通知を確認できます。手順については、Amazon Simple Queue Service 開発者ガイドの「使用開始」セクション の「メッセージの受信」を参照してください。