Amazon Simple Storage Service
開発者ガイド (API バージョン 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 トピックの 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. キューにアタッチされたアクセスポリシーを次のポリシーに置き換えます (SQS コンソールでキューを選択し、[Permissions (アクセス許可)] タブで [Edit Policy Document (Advanced) (ポリシードキュメントの編集 (アドバンスド))] をクリックします)。

    { "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 キューのサーバー側の暗号化 (SSE) が有効になっている場合、次のポリシーを関連するカスタム AWS Key Management Service (AWS KMS) カスタマーマスターキー (CMK) に追加します。カスタム CMK にポリシーを追加する理由は、Amazon SQS のデフォルトの AWS マネージド CMK が変更できないためです。AWS KMS による Amazon SQS の SSE の詳細については、「サーバー側の暗号化 (SSE) と AWS KMS を使用したデータの保護」を参照してください。

    { "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": "*" } ] }
  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 がテストメッセージを投稿し、それをメールで受け取ります。

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

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

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

// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-s3-developer-guide/blob/master/LICENSE-SAMPLECODE.) 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 java.io.IOException; import java.util.EnumSet; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; 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 EnableNotificationOnABucket { public static void main(String[] args) throws IOException { String bucketName = "*** Bucket name ***"; String clientRegion = "*** Client 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 開発者ガイドの「使用開始」セクション の「メッセージの受信」を参照してください。