S3 – SNS – Lambda을 이용한 파일 업로드 체크 알림 설정

S3 버킷에 새로운 파일이 업로드되면 알림을 받도록 설정하려고 한다.
또한, 일 단위로 파일 체크하는 파이프를 만들어서 예정된 파일이 업로드되었는지 알림을 받으려고 한다.

순서는 다음과 같다.

  • S3 버킷 알림 생성 순서

1) SNS 토픽 생성
2) 토픽의 Access Policy에서 S3 게시 권한 부여
3) 구독 생성
4) S3 버킷에 이벤트 알림 추가
5) S3에 파일 업로드하여 알림 정상 수신 확인

  • 예정 파일 업로드 확인 알림 생성 순서

1) 람다에게 부여할IAM role에 SNS:publish권한 및 S3:getObject 권한 추가
2) CloudWatch – Event에서 cron 작업 생성
3) Lambda – Function을 생성하여 CloudWatch의 cron과 연결
4) Lambda에서 S3 파일 존재여부 검사

.

.

.

1. SNS 토픽 생성

1) AWS 콘솔에서 SNS – Create topic으로 토픽을 생성한다.
토픽은 알림을 받을 각 ‘주제’이며, 토픽을 통해서 메시지를 게시하고, 알림을 구독한 구독자에게 메시지를 전송할 수 있다.

2) 토픽의 Access Policy에서 S3 게시 권한 부여
파일이 업로드될 때마다 S3가 토픽에 메시지를 게시할 수 있도록 Access 권한을 수정한다.

{
  "Version": "2008-10-17",
  "Id": "example-ID",
  "Statement": [
    {
      "Sid": "example-statement-ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "SNS:Publish",
      "Resource": "<SNS ARN>",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": [
            "<S3 버킷 ARN>"
          ]
        }
      }
    }
  ]
}

S3 버킷이 Resource(SNS)에 대해 Action(SNS:Publish)할 수 있도록 policy를 만들었다.

3) 구독을 생성하여 알림을 받을 대상을 설정한다.
알림 프로토콜을 지정할 수도 있다. 여기서는 EMAIL로 알림을 받기로 한다.

4) S3 버킷에 이벤트 알림 추가한다.
버킷 – Property – Events – Add notification에서 설정할 수 있다.

버킷 내 모든 생성 이벤트, 파일이나 폴더가 생성되면 알림이 발생하도록 설정한다.
알림을 보낼 대상은 앞에서 생성했던 SNS Topic으로 지정한다.
S3 event의 Name은 create-content로 설정했다. 만약, 지정하지 않으면 임의로 설정된다.

5) S3에 파일 업로드해서 알림이 정상 수신되는지 확인한다.

알림이 정상적으로 수신되나, 내용 자체를 한눈에 알아보긴 힘들다.
가독성을 고려한다면 Lambda 등의 추가적인 과정을 거쳐서 필요한 부분만 필터링 할 수 있다.

.

.

다음은 예정된 파일/폴더가 업로드되었는지 확인하는 알림 생성 방법이다.

1. Lambda에 권한 부여

Lambda Funcation을 통해 S3에 파일이 업로드 되었는지 체크하려고 한다.
Lambda에서 사용할 서비스에 대해 권한을 부여해서 IAM role 형태로 적용시킨다. 필요한 권한은 다음과 같다.

  • SNS:publish권한 : Function 결과에 따라 SNS에 알림 게시
  • S3:getObject 권한 : 버킷 내 파일리스트 확인

2. CloudWatch Event 생성

일정한 주기로 파일 체크를 하기 위해서 cron 이벤트를 생성한다.
CloudWatch의 Event에서 cron 작업을 설정할 수 있다.

cron 표현식으로 실행주기를 정하고, 타겟을 설정 및 전달할 데이터형식을 설정할 수 있다.

3. Lambda Function 생성

생성한 코드는 다음과 같다.

import json
import boto3
from datetime import datetime, timedelta, timezone
import dateutil.tz

def lambda_handler(event, context):
    sns = boto3.client('sns')
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('bucketname')
    content = ''

    for obj in bucket.objects.all():
         yesterday = datetime.now(tz=timezone.utc) + timedelta(hours=9) - timedelta(1)
        fileage = obj.last_modified + timedelta(hours=9)
        
        yesterday = str(yesterday).split(' ')[0]
        fileage = str(fileage).split(' ')[0]
        
        print(yesterday)
        print(fileage)
        
        if fileage == yesterday :
            content = content + '\n' + obj.key + ' : ' + str(obj.last_modified)
        print(content)
# for end
    
    if content != '' :
        response = sns.publish(
            TargetArn='SNSARN',
            Message=content,
            Subject='Subject of Alert Mail',
            MessageStructure='string'
        )
# if end

위의 Function은 Python 3.6으로 작성되었으며,
간단하게 S3 버킷에 특정 폴더가 생성되었는지 체크하도록 해보았다.

4. 알림 확인

알림 메일에서는 test/ 폴더가 생성되지 않았음을 알려준다.

위의 S3 object creation 알림과 마찬가지로 가독성을 고려하여 양식을 수정할 수도 있다.

Tags: No tags

One Response

Add a Comment

Your email address will not be published. Required fields are marked *