Classic/VPC 환경에서 이용 가능합니다.
버킷 액세스 로그 기능을 사용하면 버킷과 객체에 대한 요청 정보를 로그 파일로 저장하여 접근 이력을 확인하고 분석할 수 있습니다. 로그는 사용자가 지정한 버킷에 저장되며, 저장된 로그 파일을 통해 요청 시각, 요청 유형, 처리 결과 등의 정보를 확인할 수 있습니다.
버킷 액세스 로그 설정
액세스 로그는 지정한 저장 버킷에 저장되며 저장된 로그 파일의 용량에 따라 스토리지 이용 요금이 발생합니다. 버킷 액세스 로그 설정 방법은 다음과 같습니다.
- 버킷 목록에서 버킷을 선택한 후 버킷 액세스 로그 설정 영역의
를 클릭해 주십시오. - 버킷 액세스 로그 설정 팝업 창에서 액세스 로그 설정을 활성화해 주십시오.
- 액세스 로그 파일을 저장할 저장 버킷을 선택해 주십시오.
- 저장 버킷 조건은 로그 저장 버킷 설정 조건 참조
- 로그 파일을 구분하여 저장할 경로의 접두사인 로그 파일 Prefix를 입력해 주십시오.
- <예시>
logs/
- <예시>
- 작성된 내용을 확인한 후 [확인] 버튼을 클릭해 주십시오.
로그 저장 버킷 설정 조건
로그 저장 버킷은 다음 조건을 충족해야 합니다.
| 항목 | 설명 |
|---|---|
| 버킷 | 이미 생성된 버킷만 지정 가능 |
| 리전 | 소스 버킷과 동일한 리전의 버킷만 지정 가능 |
| 소유자 | 소스 버킷과 소유자가 동일한 버킷만 지정 가능 |
| 저장 버킷 수 | 소스 버킷 1개당 로그 저장 버킷 1개만 지정 가능 |
| 접근 권한 | 로그 전달을 위한 별도의 권한 설정 불필요 |
여러 소스 버킷에서 하나의 로그 저장 버킷을 공통으로 사용할 수 있습니다.
- 소스 버킷과 로그 저장 버킷을 동일하게 지정하면 로그 파일 저장 요청도 다시 기록되어 로그가 지속적으로 증가할 수 있습니다. 별도의 로그 저장 버킷을 사용하는 것을 권장합니다.
- 객체 잠금(Object Lock)의 기본 보존 기간이 설정된 버킷은 로그 저장 버킷으로 사용하지 마십시오. 설정이 완료되더라도 로그 파일이 저장되지 않습니다.
로그 파일 저장 방식
액세스 로그는 요청 정보를 수집하여 로그 저장 버킷에 텍스트 파일로 전달합니다. 로그 파일은 UTF-8 형식으로 저장되며 압축되지 않습니다. 하나의 요청 정보는 한 줄로 기록됩니다.
로그 파일 이름 및 저장 경로
로그 파일의 객체 키는 설정한 Prefix와 키 형식에 따라 결정됩니다. 지원하는 키 형식은 다음과 같습니다.
| 키 형식 | 설명 |
|---|---|
| SimplePrefix | 지정한 Prefix 뒤에 로그 파일 전달 시각과 고유 문자열 추가 |
| PartitionedPrefix - EventTime | 요청 발생 날짜를 기준으로 로그 파일의 저장 경로 구분 |
| PartitionedPrefix - DeliveryTime | 로그 파일 전달 날짜를 기준으로 저장 경로 구분 |
SimplePrefix
{Prefix}YYYY-MM-DD-HH-mm-ss-{UniqueString}
PartitionedPrefix - EventTime
{Prefix}{AccountId}/{Region}/{Bucket}/YYYY/MM/DD/YYYY-MM-DD-00-00-00-{UniqueString}
PartitionedPrefix - DeliveryTime
{Prefix}{AccountId}/{Region}/{Bucket}/YYYY/MM/DD/YYYY-MM-DD-HH-mm-ss-{UniqueString}
각 항목의 의미는 다음과 같습니다.
| 항목 | 설명 |
|---|---|
| Prefix | 사용자가 설정한 로그 파일 Prefix |
| AccountId | 소스 버킷 소유자의 계정 번호 |
| Region | 소스 버킷이 속한 리전 |
| Bucket | 소스 버킷 이름 |
| YYYY/MM/DD | 요청 발생일 또는 로그 전달일 |
| UniqueString | 로그 파일을 구분하기 위한 16자리 고유 문자열 |
로그의 요청 시각과 날짜별 저장 경로는 모두 한국 표준시(KST, UTC+9)를 기준으로 기록됩니다.
- 로그 파일 Prefix는 최대 512Byte까지 입력할 수 있습니다.
- Prefix 끝에 슬래시(/)를 입력하지 않으면 Prefix와 파일 이름이 그대로 연결됩니다.
- PartitionedPrefix에서 날짜 기준을 지정하지 않으면 EventTime이 기본값으로 적용됩니다.
로그 파일 전달
액세스 로그는 실시간으로 저장되지 않으며, 요청 발생 후 일정 시간이 지나면 로그 저장 버킷에 전달됩니다.
- 로그 파일 전달에는 일반적으로 약 30분이 소요됩니다.
- 시스템 상태에 따라 로그 전달 시간이 달라질 수 있습니다.
- 로그 설정을 활성화하거나 변경 또는 해제한 경우 실제 반영까지 시간이 걸릴 수 있습니다.
- 로그 파일의 전달 순서는 요청 발생 순서와 일치하지 않을 수 있습니다.
- 액세스 로그는 Best-effort 방식으로 제공되므로 모든 요청에 대한 로그 수집이 보장되지는 않습니다. 일부 로그가 누락되거나 중복 기록될 수 있습니다.
- 소스 버킷을 삭제하면 액세스 로그 설정도 함께 삭제되며, 아직 전달되지 않은 로그가 누락될 수 있습니다.
로그가 기록되는 요청 범위
버킷 액세스 로그는 해당 버킷이 속한 리전으로 들어온 API 요청과 정적 웹사이트 호스팅 요청을 기록합니다. 요청 유형별 기록 여부는 다음과 같습니다.
| 요청 유형 | 기록 여부 | 설명 |
|---|---|---|
| REST.* | 기록 | API 요청 |
| WEBSITE.* | 기록 | 정적 웹사이트 호스팅 요청 |
| BATCH.* | 미기록 | 다중 객체 삭제 시 객체별 처리 기록 |
| S3.* | 미기록 | 수명 주기 만료 및 전환, 비동기 복원 완료 등의 시스템 작업 |
| 다른 리전으로 들어온 요청 | 미기록 | 다른 리전의 버킷을 대상으로 하는 요청 |
다음과 같은 요청도 로그에 기록되지 않을 수 있습니다.
- 버킷을 특정할 수 없는 요청
- 인증 단계에서 거부되어 버킷을 식별할 수 없는 요청
- 로그 전달 과정에서 내부적으로 수행되는 GetBucketLogging 요청
DeleteObjects를 호출하면 다중 삭제 요청 자체는 REST.POST.MULTI_OBJECT_DELETE로 기록되지만, 삭제 대상 객체별 BATCH.DELETE.OBJECT 기록은 제공되지 않습니다.
로그 파일을 저장하는 과정에서 발생하는 내부 요청도 기록될 수 있습니다. 로그 저장 버킷에 액세스 로그가 활성화되어 있다면 로그 파일 업로드 요청 등이 해당 버킷의 로그에 포함됩니다.
로그 레코드 형식
로그 파일은 27개 필드로 구성됩니다. 하나의 요청 정보가 한 줄로 기록됩니다. 각 필드는 공백으로 구분되나, 일부 필드 값에는 공백이 포함될 수 있습니다. Time 필드는 []로, Request-URI, Referer, User-Agent 필드는 ""로 묶여 기록됩니다. 로그를 분석할 때는 [] 또는 ""로 묶인 값을 하나의 필드로 처리해야 합니다. 단순히 공백을 기준으로 분리하면 필드 수가 27개와 일치하지 않을 수 있습니다.
로그 필드
로그 레코드를 구성하는 필드는 다음과 같습니다.
| 번호 | 필드 | 설명 |
|---|---|---|
| 1 | Bucket Owner | 소스 버킷 소유자의 식별자 |
| 2 | Bucket | 요청 대상 버킷 이름 |
| 3 | Time | 요청을 받은 시각(KST) |
| 4 | Remote IP | 요청자의 IP 주소 |
| 5 | Requester | 요청을 인증한 사용자 |
| 6 | Request ID | 요청별 고유 식별자 |
| 7 | Operation | 요청 작업 유형 |
| 8 | Key | 요청 대상 객체의 키 |
| 9 | Request-URI | HTTP 요청 URI |
| 10 | HTTP Status | HTTP 응답 상태 코드 |
| 11 | Error Code | 오류 발생 시 반환된 오류 코드 |
| 12 | Bytes Sent | 응답 본문의 크기 |
| 13 | Object Size | 요청 대상 객체의 크기 |
| 14 | Total Time | 요청 수신부터 응답 전송 완료까지 걸린 시간 |
| 15 | Turn-Around Time | 요청 수신 완료부터 응답 전송 시작까지 걸린 시간 |
| 16 | Referer | HTTP Referer 헤더 |
| 17 | User-Agent | HTTP User-Agent 헤더 |
| 18 | Version Id | 객체 버전 ID |
| 19 | Host Id | 요청을 처리한 서버의 식별자 |
| 20 | Signature Version | 요청에 사용된 서명 버전 |
| 21 | Cipher Suite | TLS 암호화 스위트 |
| 22 | Authentication Type | 요청 인증 방식 |
| 23 | Host Header | HTTP Host 헤더 |
| 24 | TLS Version | TLS 프로토콜 버전 |
| 25 | Access Point ARN | 액세스 포인트 ARN |
| 26 | ACL Required | ACL 평가 필요 여부 |
| 27 | Source Region | 복제 원본 리전 |
현재 다음 7개 필드는 기록되지 않으며, 값이 없는 항목을 나타내는 -로 표시됩니다. 로그 파일을 분석할 때는 해당 필드에 실제 값이 포함되지 않는다는 점을 유의해 주십시오.
- Remote IP
- Requester
- User-Agent
- Host Id
- Access Point ARN
- ACL Required
- Source Region
요청 유형별 Operation
로그 레코드의 Operation 필드에는 수행한 요청에 해당하는 작업 유형이 기록됩니다.
주요 API별 Operation은 다음과 같습니다.
| API 또는 요청 | Operation |
|---|---|
| HeadBucket | REST.HEAD.BUCKET |
| ListObjects / ListObjectsV2 | REST.GET.BUCKET |
| PutObject | REST.PUT.OBJECT |
| GetObject | REST.GET.OBJECT |
| HeadObject | REST.HEAD.OBJECT |
| DeleteObject | REST.DELETE.OBJECT |
| DeleteObjects | REST.POST.MULTI_OBJECT_DELETE |
| CopyObject | REST.COPY.OBJECT |
| PutBucketLogging | REST.PUT.LOGGING_STATUS |
| GetBucketLogging | REST.GET.LOGGING_STATUS |
| PutBucketPolicy | REST.PUT.BUCKETPOLICY |
| GetBucketPolicy | REST.GET.BUCKETPOLICY |
| PutBucketWebsite | REST.PUT.WEBSITE |
| GetBucketWebsite | REST.GET.WEBSITE |
| 웹사이트 GET | WEBSITE.GET.OBJECT |
| 웹사이트 HEAD | WEBSITE.HEAD.OBJECT |
| 웹사이트 OPTIONS | WEBSITE.OPTIONS.PREFLIGHT |
객체 복사 요청은 대상 객체의 쓰기 작업과 원본 객체의 읽기 작업이 각각 기록됩니다. 원본 객체의 읽기 작업은 REST.COPY.OBJECT_GET으로 구분됩니다.
로그 전달 실패 및 주의 사항
버킷 액세스 로그 설정이 활성화되어 있더라도 로그 저장 버킷의 상태에 따라 로그 파일이 정상적으로 전달되지 않을 수 있습니다.
| 상황 | 처리 결과 |
|---|---|
| 로그 저장 버킷 삭제 | 설정은 유지되지만 로그 전달 실패 |
| 로그 저장에 필요한 권한이 유효하지 않은 경우 | 로그 전달 실패 가능 |
| 로그 저장 버킷에 Object Lock 기본 보존 기간 설정 | 설정은 가능하지만 로그 전달 실패 |
| 소스 버킷 삭제 | 로그 설정 삭제 및 미전달 로그 누락 가능 |
로그 전달에 실패하더라도 소스 버킷의 액세스 로그 설정은 자동으로 해제되지 않으며, 별도의 실패 알림도 제공되지 않습니다. 단, 소스 버킷 자체를 삭제하면 로그 설정도 함께 삭제됩니다.
- 로그 설정이 활성화되어 있다는 사실만으로 로그가 정상적으로 저장되고 있다고 판단할 수 없습니다.
- 로그 저장 버킷을 삭제하거나 Object Lock 설정을 변경한 경우 로그 파일이 정상적으로 전달되는지 확인해 주십시오. 로그가 생성되지 않는다면 저장 버킷의 상태와 설정을 확인해야 합니다.