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

チュートリアル: 通知 (SNS トピックまたは SQS キュー) のバケットを設定する

Amazon S3 通知は、Amazon Simple Notification Service (Amazon SNS) または Amazon Simple Queue Service (Amazon SQS) を使用して受信できます。このチュートリアルでは、Amazon SNS トピックと Amazon SQS キューを使用して、バケットに通知設定を追加します。

注記

Amazon Simple キューサービス FIFO (先入れ先出し) キューは、Amazon S3 イベント通知の送信先としてサポートされていません。Amazon S3 イベントの通知を Amazon SQS FIFO キューに送信するには、Amazon EventBridge を使用できます。詳細については、「Amazon EventBridge を有効にします」を参照してください。

チュートリアルの概要

このチュートリアルは、以下を行う際に役立ちます。

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

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

通知設定の情報については、Amazon SQS、Amazon SNS、Lambda を使用します を参照してください。

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

この手順には、以下のステップが含まれます。

  1. Amazon SQS キュー を作成する。

    Amazon SQS コンソールを使用して、SQS キューを作成します。Amazon S3 がそのキューにプログラムで送信するどのメッセージにもアクセスできます。ただし、このチュートリアルでは、コンソールで通知メッセージを確認します。

    キューにアクセスポリシーをアタッチして、メッセージを発行するための Amazon S3 アクセス許可を付与します。

  2. Amazon SNS トピックを作成する。

    Amazon SNS コンソールを使用して、SNS トピックを作成し、トピックにサブスクライブします。これにより、そこに投稿されたすべてのイベントが配信されます。通信プロトコルとして E メールを指定します。トピックを作成すると、Amazon SNS から E メールが送信されます。E メール内のリンクを使用して、トピックのサブスクリプションを確認します。

    トピックにアクセスポリシーをアタッチして、メッセージを発行するための Amazon S3 アクセス許可を付与します。

  3. 通知設定をバケットに追加します。

ステップ 1: Amazon SQS キューを作成する

次の手順に従い、Amazon Simple Queue Service (Amazon SQS) キューを作成し、このキューにサブスクライブします。

  1. Amazon SQS コンソールを使用して、キューを作成します。手順については、「Amazon Simple Queue Service デベロッパーガイド」の「Getting Started with Amazon SQS」を参照してください。

  2. キューに添付したアクセスポリシーを次のポリシーに置き換えます。

    1. Amazon SQS コンソールの [Queues] (キュー) リストで、キューの名前を選択します。

    2. [Access policy] (アクセスポリシー) タブで [Edit] (編集) をクリックします。

    3. キューに添付されているアクセスポリシーを置き換えます。その中で、Amazon SQS ARN、ソースバケット名、バケット所有者アカウント ID を提供します。

      { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SQS:SendMessage" ], "Resource": "SQS-queue-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:awsexamplebucket1" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
    4. [Save] を選択します。

  3. (オプション) Amazon SQS キューまたは Amazon SNS トピックで、AWS Key Management Service (AWS KMS) によるサーバー側の暗号化が有効になっている場合は、次のポリシーを関連する対称暗号化カスタマーマネージドキーに追加します。

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

    { "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

ステップ 2: Amazon SNS トピックを作成する

手順に従って、Amazon SNS トピックを作成してサブスクライブします。

  1. Amazon SNS コンソールを使用してトピックを作成します。詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Creating an Amazon SNS topic」を参照してください。

  2. トピックを受信します。この演習では、通信プロトコルとしてメールを使用します。手順については、Amazon Simple Notification Service デベロッパーガイドAmazon SNS トピックへのサブスクライブを参照してください。

    トピックのサブスクリプションの確認を求めるメールがお客様宛てに送信されます。サブスクリプションを確認します。

  3. トピックにアタッチされたアクセスポリシーを次のポリシーに置き換えます。その中で、SNS トピックの ARN、バケット名、バケット所有者のアカウント ID を提供します。

    { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "Example SNS topic policy", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SNS:Publish" ], "Resource": "SNS-topic-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:amzn-s3-demo-bucket" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
  4. トピックの ARN を書き留めておきます。

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

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

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

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

オプション A: コンソールを使用してバケットの通知を有効にする

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

  • [All object create events (すべてのオブジェクト作成イベント)] タイプのイベントを Amazon SQS キューに発行する。

  • [Object in RRS lost (RRS オブジェクトの紛失)] タイプのイベントを Amazon SNS トピックに発行する。

通知設定を保存すると、Amazon S3 からテストメッセージが発行され、このメッセージが E メールで送信されます。

手順については、Amazon S3 コンソールを使用したイベント通知の有効化と設定 を参照してください。

オプション B: AWS SDK を使用してバケットの通知を有効にする

.NET

次の C# のコード例では、バケットに通知設定を追加する完全なコードのリストを示します。コードを更新して、バケット名と SNS トピックの ARN を提供する必要があります。コード例を設定および実行する方法の詳細については、「AWS SDK for .NET デベロッパーガイド」の「AWS SDK for .NET の開始方法」 を参照してください。

using Amazon; 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); } } } }
Java

次の例では、バケットに通知設定を追加する方法を示します。作業サンプルの作成方法およびテスト方法については、「AWS SDK for 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 デベロッパーガイドの開始方法」セクションメッセージの受信を参照してください。