본문 바로가기
서버/AWS

[AWS]16. S3 업로드 이벤트 트리거 Lambda 함수로 SNS 필터

by jamong1014 2024. 3. 13.
반응형
 

[AWS]15. OwnCloud와 S3 연동 (feat. SNS Topic)

필요하다고 느낀 점: 프로젝트를 진행할 때 서로 작업했던 내용을 합치면서 진행해야 하는데 직접 만나서 하지 못하는 경우에는 단톡방에서 파일을 첨부했다는 메시지를 계속 보내면서 작업해

jamong1014.tistory.com

S3 업로드 이벤트 발생 시 SNS 솔루션을 통해 업로드 로그 기록을 받을 수 있었다.

하지만 가독성이 너무 안좋아 필요한 정보만 뽑아서 보기 위해서는 Lambda 함수를 통해 필요한 부분만 필터링하는 것과 SNS를 보내는 코드를 작성하고 이벤트 트리거로 S3 버킷을 연동해줘야 한다. 

 

SNS 프로토콜은 SMS가 지원되는 리전으로 바꾸어서 진행하였다.

 

목차

  1. Lambda 함수 정책 생성
  2. Lambda 생성
  3. 이벤트 트리거 추가
  4. 함수 작성
  5. OwnCloud로 파일 업로드 후 결과 보기

1. Lambda 함수 정책 생성

 

먼저 Lambda 함수에서 S3와 SNS에 대해 읽기/쓰기 권한이 있어야 하기 때문에 정책을 추가해 준다.

정책 생성

 

역할 부여(방금 생성된 정책을 Lambda 서비스에 부여)


2. Lambda 생성

 

언어는 자신이 익숙한 언어를 선택하면 된다.

본인은 python을 선택

 

그리고 기존 역할 사용에서 방금 만들었던 정책을 연결시켜주면 된다.


3. 이벤트 트리거 추가

트리거 추가

 

이벤트를 적용할 버킷을 선택

 

나머지는 그대로 냅두고 밑에 동의 체크해 주고 추가해 주면 된다.


4. 함수 작성

코드 작성

import json
import boto3

def lambda_handler(event, context):
   
    sns_client = boto3.client('sns')
  
    bucket = event['Records'][0]['s3']['bucket']['name']
    ip_address = event['Records'][0]['requestParameters']['sourceIPAddress']
    file_name = event['Records'][0]['s3']['object']['key']
    
    message = f"IP: {ip_address}\nbucket: {bucket}\nFile name: {file_name}"
    
    # SMS 보내기
    sns_client.publish(
        TopicArn='< SNS 주제 ARN>', 
        Message=message
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps('Event processed successfully')
    }

 

 

추출해야 하는 리스트는 S3 이벤트 리스트 구조를 보면 알 수 있다. ↓

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "2022-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "IP_ADDRESS"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123",
        "x-amz-id-2": "EXAMPLE123/5678"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "BUCKET_NAME",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::BUCKET_NAME"
        },
        "object": {
          "key": "OBJECT_KEY",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

여기서 리스트 요소를 선택하여 필요한 데이터를 추출할 수 있다.

 

작성 후 테스트를 해보자

테스트 성공

 

Deploy를 눌러 배포


5. OwnCloud로 파일 업로드 후 결과 보기

 

UserLogin.php 파일 업로드

 

정상적으로 필터 되어서 문자로 전송 받는 걸 확인 할 수 있다.

 

반응형

댓글