연습: 알림용 버킷 구성(SNS 주제 또는 SQS 대기열) - Amazon Simple Storage Service

연습: 알림용 버킷 구성(SNS 주제 또는 SQS 대기열)

Amazon Simple Notification Service(Amazon SNS) 또는 Amazon Simple Queue Service(Amazon SQS)를 통해 Amazon S3 알림을 받을 수 있습니다. 이 연습에서는 Amazon SNS 주제 및 Amazon SQS 대기열을 사용하여 버킷에 알림 구성을 추가합니다.

연습 요약

이 연습은 다음을 수행하는 데 도움이 됩니다.

  • Amazon SQS 대기열에 s3:ObjectCreated:* 유형의 이벤트를 게시합니다.

  • Amazon SNS 주제에 s3:ReducedRedundancyLostObject 유형의 이벤트를 게시합니다.

알림 구성에 대한 자세한 내용은 이벤트 알림 활성화 단원을 참조하세요.

콘솔을 사용하면 코드를 생성하지 않고도 이러한 모든 단계를 수행할 수 있습니다. 또한, AWS for Java/.NET을 사용하는 코드 예제가 제공되므로 프로그래밍 방식으로 알림 구성을 추가할 수 있습니다.

이 절차에는 다음 단계가 포함됩니다.

  1. Amazon SQS 대기열 생성

    Amazon SQS 콘솔을 사용하여 SQS 대기열을 만듭니다. 프로그래밍 방식으로 Amazon S3이 대기열로 전송하는 모든 메시지에 액세스할 수 있습니다. 그러나 이 안내에서는 콘솔에서 알림 메시지를 확인합니다.

    대기열에 액세스 정책을 연결하여 메시지를 게시할 수 있는 권한을 Amazon S3에 부여합니다.

  2. Amazon SNS 주제 생성

    Amazon SNS 콘솔을 사용하여 SNS 주제를 만들고 이 주제를 구독하면 해당 주제에 게시된 모든 이벤트가 전송됩니다. 통신 프로토콜로 이메일을 지정합니다. 주제를 생성하면 Amazon SNS에서 이메일을 전송합니다. 이메일에 포함된 링크를 사용하여 주제 구독을 확인해야 합니다.

    주제에 액세스 정책을 연결하여 메시지를 게시할 수 있는 권한을 Amazon S3에 부여합니다.

  3. 버킷에 알림 구성을 추가합니다.

1단계: Amazon SQS 대기열 생성

단계에 따라 Amazon Simple Queue Service(Amazon SQS) 대기열을 생성하고 구독합니다.

  1. Amazon SQS 콘솔을 사용하여 대기열을 생성합니다. 자세한 내용은 Amazon Simple Queue Service 개발자 안내서Amazon SQS 시작하기를 참조하세요.

  2. 대기열에 연결된 액세스 정책을 다음 정책으로 교체합니다.

    1. Amazon SQS 콘솔의 대기열 목록에서 대기열 이름을 선택합니다.

    2. 액세스 정책 탭에서 편집을 선택합니다.

    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. 저장을 선택합니다.

  3. (선택 사항) AWS Key Management Service(AWS KMS)를 사용하여 Amazon SQS 대기열 또는 Amazon SNS 주제에 서버 측 암호화가 사용되어 있는 경우 연결된 대칭 고객 관리형 키에 다음 정책을 추가합니다.

    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": "*", "Condition":{ "StringEquals":{ "aws:SourceAccount":"source-account-id" }, "ArnLike":{ "aws:SourceARN": "arn:aws:s3:::source-bucket-name" } } } ] }

    AWS KMS에서 Amazon SQS 및 Amazon SNS용 SSE를 사용하는 방법에 대한 자세한 내용은 다음을 참조하세요.

    • Amazon Simple Notification Service 개발자 안내서키 관리

    • Amazon Simple Queue Service 개발자 안내서키 관리

  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 개발자 안내서에서 Amazon SNS 주제 생성을 참조하세요.

  2. 주제를 구독합니다. 이 실습에서는 통신 프로토콜로 전자 메일을 사용합니다. 자세한 내용은 Amazon Simple Notification Service 개발자 안내서에서 Amazon SNS 주제 구독을 참조하세요.

    주제 구독을 확인하도록 요청하는 전자 메일이 전송되면 구독을 확인합니다.

  3. 주제에 연결된 액세스 정책을 다음 정책으로 교체합니다. SNS 주제 ARN, 버킷 이름 및 버킷 소유자의 계정 ID를 제공하여 정책을 업데이트해야 합니다.

    { "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SNS:Publish" ], "Resource": "SNS-topic-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" }, "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에 요청하는 알림 구성을 추가합니다.

  • Amazon SQS 대기열에 모든 객체 생성 이벤트 유형의 이벤트를 게시합니다.

  • Amazon SNS 주제에 RRS 객체 손실 유형의 이벤트를 게시합니다.

알림 구성을 저장하면 Amazon S3이 테스트 메시지를 게시하고 이메일을 통해 이 테스트 메시지가 전송됩니다.

지침은 Amazon S3 콘솔을 사용하여 이벤트 알림 활성화 및 구성 섹션을 참조하세요.

옵션 B: AWS SDK를 사용하여 버킷에 대한 알림 사용

.NET

다음 C# 코드 예제는 버킷에 알림 구성을 추가하는 전체 코드를 제공합니다. 이 코드를 업데이트하여 버킷 이름과 SNS 주제 ARN을 제공해야 합니다. 실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .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

다음 예제에서는 버킷에 알림 구성을 추가하는 방법을 보여줍니다. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 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 개발자 안내서의 '시작하기' 섹션에서 메시지 수신을 참조하세요.