연습: 버킷에 알림 구성(SNS 주제 또는 SQS 대기열)
연습: 버킷에 알림 구성(SNS 주제 또는 SQS 대기열)
Amazon Simple Notification Service(Amazon SNS)나 Amazon Simple Queue Service(Amazon SQS)를 사용해 Amazon S3 알림을 받을 수 있어요. 이 연습에서는 Amazon SNS 주제와 Amazon SQS 대기열을 사용해 버킷에 알림 구성을 추가해요.
출처: Walkthrough: Configuring a bucket for notifications (SNS topic or SQS queue)
Amazon SQS FIFO(First-In-First-Out) 대기열은 Amazon S3 이벤트 알림 대상으로 지원되지 않아요. Amazon S3 이벤트에 대한 알림을 Amazon SQS FIFO 대기열로 보내려면 Amazon EventBridge를 사용하면 돼요. 자세한 내용은 Amazon EventBridge 활성화를 참고하세요.
본문
연습 요약(Walkthrough summary)
이 연습은 다음을 수행하도록 도와줘요.
s3:ObjectCreated:*유형의 이벤트를 Amazon SQS 대기열에 게시하기.s3:ReducedRedundancyLostObject유형의 이벤트를 Amazon SNS 주제에 게시하기.
알림 구성에 대한 정보는 Amazon SQS, Amazon SNS, Lambda 사용을 참고하세요.
이 모든 단계를 콘솔에서 코드 작성 없이 할 수 있어요. 또한 Java와 .NET용 AWS SDK를 사용한 코드 예제도 제공되어 알림 구성을 프로그래밍 방식으로 추가하는 데 도움을 줘요. 절차는 다음 단계로 구성돼요.
- Amazon SQS 대기열 생성 – Amazon SQS 콘솔을 사용해 SQS 대기열을 만들어요. Amazon S3가 대기열로 보내는 메시지에 프로그래밍 방식으로 액세스할 수 있지만, 이 연습에서는 콘솔에서 알림 메시지를 확인해요. 대기열에 액세스 정책을 연결해 Amazon S3가 메시지를 게시할 권한을 부여해요.
- Amazon SNS 주제 생성 – Amazon SNS 콘솔을 사용해 SNS 주제를 만들고 주제에 구독해요. 그래야 주제에 게시된 이벤트가 사용자에게 전달돼요. 통신 프로토콜로 이메일을 지정해요. 주제를 만든 뒤 Amazon SNS가 이메일을 보내요. 이메일의 링크를 사용해 주제 구독을 확인해요. 주제에 액세스 정책을 연결해 Amazon S3가 메시지를 게시할 권한을 부여해요.
- 버킷에 알림 구성 추가.
1단계: Amazon SQS 대기열 생성
Amazon Simple Queue Service(Amazon SQS) 대기열을 만들고 구독하는 단계를 따르세요.
-
Amazon SQS 콘솔을 사용해 대기열을 만듭니다. 지침은 Amazon Simple Queue Service 개발자 안내서의 Amazon SQS 시작하기를 참고하세요.
-
대기열에 연결된 액세스 정책을 다음 정책으로 교체합니다.
- Amazon SQS 콘솔의 대기열(Queues) 목록에서 대기열 이름을 선택합니다.
- 액세스 정책(Access policy) 탭에서 편집(Edit) 을 선택합니다.
- 대기열에 연결된 액세스 정책을 교체합니다. 여기에 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": " arn:aws:sqs:us-west-2:111122223333:s3-notification-queue ", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*: awsexamplebucket1 " }, "StringEquals": { "aws:SourceAccount": " bucket-owner-123456789012 " } } } ] }- 저장(Save) 을 선택합니다.
-
(선택) 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를 사용하는 방법에 대한 자세한 내용은 다음을 참고하세요.
-
대기열 ARN을 기록해 둡니다. 만든 SQS 대기열은 AWS 계정의 또 다른 리소스예요. 고유한 Amazon 리소스 이름(ARN)을 가져요. 다음 단계에서 이 ARN이 필요해요. ARN 형식은 다음과 같아요.
arn:aws:sqs: aws-region : account-id : queue-name
2단계: Amazon SNS 주제 생성
Amazon SNS 주제를 만들고 구독하는 단계를 따르세요.
-
Amazon SNS 콘솔을 사용해 주제를 만듭니다. 지침은 Amazon Simple Notification Service 개발자 안내서의 Amazon SNS 주제 생성을 참고하세요.
-
주제를 구독합니다. 이 연습에서는 통신 프로토콜로 이메일을 사용합니다. 지침은 Amazon Simple Notification Service 개발자 안내서의 Amazon SNS 주제 구독을 참고하세요. 주제 구독 확인을 요청하는 이메일을 받게 돼요. 구독을 확인하세요.
-
주제에 연결된 액세스 정책을 다음 정책으로 교체합니다. 여기에 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": " arn:aws:sns:us-west-2:111122223333:s3-notification-topic ", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*: awsexamplebucket1 " }, "StringEquals": { "aws:SourceAccount": " bucket-owner-123456789012 " } } } ] } -
주제 ARN을 기록해 둡니다. 만든 SNS 주제는 AWS 계정의 또 다른 리소스이고 고유한 ARN을 가져요. 다음 단계에서 이 ARN이 필요해요. ARN 형식은 다음과 같아요.
arn:aws:sns: aws-region : account-id : topic-name
3단계: 버킷에 알림 구성 추가
Amazon S3 콘솔을 사용하거나 AWS SDK로 프로그래밍 방식으로 버킷 알림을 활성화할 수 있어요. 버킷에 알림을 구성하는 옵션 중 하나를 선택하세요. 이 섹션에서는 Java와 .NET용 AWS SDK를 사용한 코드 예제를 제공해요.
옵션 A: 콘솔을 사용해 버킷에서 알림 활성화 – Amazon S3 콘솔을 사용해 알림 구성을 추가해서 Amazon S3에 다음을 요청하세요.
- 모든 객체 생성 이벤트(All object create events) 유형의 이벤트를 Amazon SQS 대기열에 게시하기.
- RRS 객체 손실(Object in RRS lost) 유형의 이벤트를 Amazon SNS 주제에 게시하기.
알림 구성을 저장하면 Amazon S3가 테스트 메시지를 게시하고, 이메일로 받게 돼요. 지침은 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 – Java용 AWS SDK로 버킷 알림을 구성하는 예제는 Amazon S3 API Reference의 S3 이벤트 알림 처리를 참고하세요.
4단계: 설정 테스트
이제 버킷에 객체를 업로드하고 Amazon SQS 콘솔에서 이벤트 알림을 확인해 설정을 테스트할 수 있어요. 지침은 Amazon Simple Queue Service 개발자 안내서의 "Getting Started" 섹션의 메시지 수신을 참고하세요.