???: S3 에서 이벤트 알림으로 Lambda를 걸어도 되는데 왜 Event Bridge 를 거쳐야 하죠?
하나의 Lambda 만을 이용해서 다른 모든 S3 버킷에 같은 작업을 두기 위해서 Event Bridge를 사용 합니다.
팀에서 S3 수명주기 관리를 하자는 요구가 생기게 되었고, 객체에 대한 관리를 포함하여 수명주기 관리를 위해서 객체에 태극 추가하는 작업을 진행 하게 되었습니다.
개발된 코드에 대해서 객체를 넣을 때 마다 태그를 붙이는 코드로 수정 하는 것에 리소스가 많이 들어 갈 것이라 생각하여 다른 방법을 생각 하였습니다.
S3 버킷에 객체를 넣을 때 자동으로 이벤트를 가져와서 태그를 넣어주면 어떨까 하고 S3 -> EventBridge -> Lambda
라는 아키텍쳐를 구상 하였습니다.
물론, S3에서 이벤트를 Lambda로 바로 넣어줄 수는 있지만, 이경우 1:1 매핑이 되기 때문에 많은 S3 버킷에 동일한 Lambda를 통해 태그 작업을 하려면 EventBridge를 사용 해야 했습니다.
장점은 많은 버킷에도 하나의 Lambda를 걸 수 있고 EventBridge에 다수의 람다를 또 걸 수 있음으로서 확장성이 뛰어나다는 장점이 있습니다.
단점: Amazon EventBridge을 추가로 사용 해야 한다는 점이 있습니다.
람다 생성
코드 작성 및 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;
}
};
람다 구성
일반 구성 제한 시간 변경
IAM 역할 설정 (S3 권한 부여)
활성화된 **S3_Tagging_Function-role-uxdz7hyy 역할을 확인
** 을 클릭
S3 권한 부여 → 인라인 정책연결
JSON 을 통한 정책 설정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
]
}
]
}
Action
, Resource
는 연습용 이기 때문에 모든 권한을 설정Event Bridge 규칙 설정
이벤트 패턴이 있는 규칙 을 S3 이벤트 알림으로 설정
대상은 방금 만든 람다로 설정
이미지 업로드 후 태그에 아래와 같이 설정된 것을 확인.