S3 Object Expiration 설정법
Q. S3 오브젝트의 수명주기를 태그 속성에 따라서 Expiration Days 값을 설정하는 방법에 대해서 설명해주세요.
제 유스케이스는 S3 오브젝트의 수명주기가 맞을 것 같아요. 아래 태그 속성에 따라서 Expiration Days 값을 아래와 같이 설정하고 싶어요.
{
"Rules": [
{
"ID": "DeleteTaggedPremium",
"Status": "Enabled",
"Filter": {
"Tag": {
"Key": "isPremium",
"Value": "false"
}
},
"Expiration": {
"Days": 30
}
}
]
}
A. ChatGPT4o
네, 정확하게 방향 잘 잡으셨어요! 말씀하신 유즈케이스는 S3 Lifecycle Rule + Tag 기반 조건 삭제에 딱 맞습니다. 지금 설정하신 Rule은 isPremium=false
태그가 붙은 오브젝트에 대해 30일 후 자동 삭제되도록 설정하는 것이고, 완벽하게 작동합니다. 다만 몇 가지 주의사항과 확장 아이디어를 추가로 드릴게요.
✅ 정리: 사용하고자 하는 설정
🔖 태그 기준으로 S3 오브젝트 만료 설정
{
"Rules": [
{
"ID": "DeleteTaggedPremium",
"Status": "Enabled",
"Filter": {
"Tag": {
"Key": "isPremium",
"Value": "false"
}
},
"Expiration": {
"Days": 30
}
}
]
}
의미:
isPremium=false
태그가 붙은 오브젝트 → 30일 후 자동 삭제isPremium=true
태그가 붙은 오브젝트 → 이 룰의 대상이 아님 (즉, 보존)
📦 파일 업로드 시 Tag 적용 방법
▶️ AWS SDK (Node.js 예시)
import { PutObjectCommand } from '@aws-sdk/client-s3';
await s3Client.send(new PutObjectCommand({
Bucket: 'your-bucket',
Key: 'uploads/example.txt',
Body: yourFileStream,
Tagging: 'isPremium=false',
}));
Tagging
필드는key=value
형식으로 전달됩니다. 여러 태그는&
로 구분 (foo=bar&baz=qux
).
▶️ Presigned URL 사용 시
Presigned URL에도 Tagging
파라미터를 명시해주어야 합니다.
import { PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const command = new PutObjectCommand({
Bucket: 'your-bucket',
Key: 'uploads/example.txt',
Tagging: 'isPremium=false'
});
const url = await getSignedUrl(s3Client, command, { expiresIn: 300 });
클라이언트는 이 URL을 사용해서 PUT 요청을 보내면 Tag
가 자동 적용됩니다.
🚨 주의사항
1. Lifecycle Rule이 적용되기까지 지연 시간 존재
- 보통 1일 단위로 체크되므로, 정확히 30일 + 몇 시간 정도 뒤에 삭제됩니다.
2. Tagging이 적용되지 않으면 Rule은 작동 안 함
- 반드시
Tagging
을 포함해서 업로드해야 함. - 확인은 S3 콘솔에서 오브젝트 클릭 → 태그 확인 가능
3. 다른 Tag Value 또는 Tag Key를 추가해 확장 가능
예:
deleteAfter=7
→ 7일 삭제isTemporary=true
→ 1일 삭제- 복수 Rule을 정의해 세분화된 정책 관리 가능
📌 확장 예시: deleteAfter=7
같은 Tag 값으로 유연한 수명 설정
Rule 1: deleteAfter=7 → 7일 후 삭제
{
"ID": "DeleteAfter7",
"Status": "Enabled",
"Filter": {
"Tag": {
"Key": "deleteAfter",
"Value": "7"
}
},
"Expiration": {
"Days": 7
}
}
이런 식으로 다양한 수명 정책을 tag로 분기 처리할 수 있어요.