AWS EventBridge 를 통해서 S3 객체에 태그 작업 하기

Jaewoong2·2024년 2월 17일
1

aws

목록 보기
2/10

선요약

???: S3 에서 이벤트 알림으로 Lambda를 걸어도 되는데 왜 Event Bridge 를 거쳐야 하죠?

하나의 Lambda 만을 이용해서 다른 모든 S3 버킷에 같은 작업을 두기 위해서 Event Bridge를 사용 합니다.


개요 / 진행

팀에서 S3 수명주기 관리를 하자는 요구가 생기게 되었고, 객체에 대한 관리를 포함하여 수명주기 관리를 위해서 객체에 태극 추가하는 작업을 진행 하게 되었습니다.

개발된 코드에 대해서 객체를 넣을 때 마다 태그를 붙이는 코드로 수정 하는 것에 리소스가 많이 들어 갈 것이라 생각하여 다른 방법을 생각 하였습니다.

  • 코드 변경 시간..
  • 코드를 왜 변경 해야 하는지 설명하는 시간..
  • S3 버킷에 PUT 하는 API가 10개는 넘을 텐데..

S3 버킷에 객체를 넣을 때 자동으로 이벤트를 가져와서 태그를 넣어주면 어떨까 하고 S3 -> EventBridge -> Lambda 라는 아키텍쳐를 구상 하였습니다.

물론, S3에서 이벤트를 Lambda로 바로 넣어줄 수는 있지만, 이경우 1:1 매핑이 되기 때문에 많은 S3 버킷에 동일한 Lambda를 통해 태그 작업을 하려면 EventBridge를 사용 해야 했습니다.

장단점 분석

장점은 많은 버킷에도 하나의 Lambda를 걸 수 있고 EventBridge에 다수의 람다를 또 걸 수 있음으로서 확장성이 뛰어나다는 장점이 있습니다.

단점: Amazon EventBridge을 추가로 사용 해야 한다는 점이 있습니다.

구현

S3 설정

  1. AWS S3 설정
    • [탭] 속성 > 이벤트 알림 > Amazon EventBridge

AWS Lambda 설정

  1. 람다 생성

  2. 코드 작성 및 Deploy

     // Import the required AWS SDK clients and commands for Node.js
     import { S3Client, GetObjectTaggingCommand, PutObjectTaggingCommand }  from "@aws-sdk/client-s3";
    
     // Initialize the S3 client
     const s3Client = new S3Client();
    
     // Define your tagsets and functions as per the Python code
     const tagset = {
         "prlc/images": ["이미지"], // Adjusted to match JavaScript object syntax
     };
    
     function generateTagset(usage, permanent) {
         return [{ Key: "용도", Value: "이미지" }]; // Adjusted to match JavaScript object syntax
     }
    
     function getBucketDirectory(bucketKey) {
         return bucketKey.split("/").slice(0, -1).join("/");
     }
    
     function getTagset(fullBucketDirectory) {
         for (const key in tagset) {
             if (fullBucketDirectory.startsWith(key)) {
                 return generateTagset(...tagset[key]);
             }
         }
    
         // Assuming 'unset' is a placeholder for default values or handling missing keys
         // Ensure to define what 'unset' should default to or handle this case appropriately.
         return generateTagset("unset", false); // Adjust as necessary
     }
    
     export const handler = async (event, context) => {
    
         const bucketName = event.detail.bucket.name;
         const bucketKey = event.detail.object.key;
         const bucketDirectory = getBucketDirectory(bucketKey);
         const tag = getTagset(bucketName + "/" + bucketDirectory);
    
         console.log("PUT OBJECT TAGGING START");
         console.log("event: ", event);
         console.log("bucket_name: ", bucketName);
         console.log("bucket_key: ", bucketKey);
         console.log("bucket_directory: ", bucketName + "/" + bucketDirectory);
         console.log("bucket_tag: ", tag);
    
         // Get the existing object tags
         const getTaggingCommand = new GetObjectTaggingCommand({
             Bucket: bucketName,
             Key: bucketKey,
         });
    
         try {
             const previousTagset = await s3Client.send(getTaggingCommand);
    
             if (previousTagset && previousTagset.TagSet) {
                 tag.push(...previousTagset.TagSet);
             }
    
             // Put the new object tags
             const putTaggingCommand = new PutObjectTaggingCommand({
                 Bucket: bucketName,
                 Key: bucketKey,
                 Tagging: { TagSet: tag },
             });
    
             await s3Client.send(putTaggingCommand);
    
             console.log("PUT OBJECT TAGGING END");
    
             return true;
         } catch (error) {
             console.error("Error in tagging object: ", error);
             throw error;
         }
     };
  3. 람다 구성

    1. 일반 구성 제한 시간 변경

    2. IAM 역할 설정 (S3 권한 부여)

      활성화된 **S3_Tagging_Function-role-uxdz7hyy 역할을 확인** 을 클릭

      • S3 권한 부여 → 인라인 정책연결

        JSON 을 통한 정책 설정

        {
        	"Version": "2012-10-17",
        	"Statement": [
        		{
        			"Sid": "Statement1",
        			"Effect": "Allow",
        			"Action": [
        				"s3:*"
        			],
        			"Resource": [
        				"*"
        			]
        		}
        	]
        }
        • Action , Resource 는 연습용 이기 때문에 모든 권한을 설정

AWS EventBridge 설정

  1. Event Bridge 규칙 설정

    1. 이벤트 패턴이 있는 규칙 을 S3 이벤트 알림으로 설정

    2. 대상은 방금 만든 람다로 설정

최종 확인

이미지 업로드 후 태그에 아래와 같이 설정된 것을 확인.

profile
DFF (Development For Fun)

0개의 댓글