Access Logging
Access Logging이란?
Access Logging은 Object Storage 버킷에 수행된 요청에 대해서 상세한 레코드를 기록하는 서비스입니다. Access Log는 보안 및 액세스 감사, 버킷에 대한 클라이언트 요청 분석에 대한 목적으로 사용할 수 있습니다.
Access Logging을 설정하는 방법은 액세스 로그 설정에서 자세히 설명합니다.
Access Log의 각 레코드는 하나의 요청
을 의미하고, 각 필드는 공백
으로 구분하며, 데이터가 없거나 알수 없는 경우는 -
로 표현하고 있습니다.
각 필드는 로그 레코드 필드에서 자세히 설명합니다.
버킷에 요청이 오면 몇 시간 내로 로그를 기록하고 대상 버킷에 로그를 저장합니다.
버킷 로깅 상태가 변경되었을 때, 일정 시간에 걸쳐서 단계적으로 로그를 저장하며, 스토리지 사용 환경에 따라 완벽한 전송을 보장하지 않는 경우가 발생할 수 있습니다.
로그 전송을 위한 버킷의 역할 권한
출발지 버킷에서 대상 버킷으로 로그를 전송하기 위해 Object Storage Agent 서비스 계정의 크리덴셜을 사용해 로그를 저장하게 됩니다.
대상 버킷에 Object Storage Agent 서비스 계정이 Object Storage 역할의 storage.buckets.get
, storage.buckets.update
권한을 가지고 있어야 정상적으로 로그를 저장할 수 있습니다.
Object Storage Agent 계정은 서비스 계정이며 IAM 프로젝트 멤버 역할을 가지고 있습니다.
버킷을 생성하면 기본적으로 IAM 프로젝트 멤버 그룹은 스토리지 편집자 역할 권한을 가지고 있어 별도의 설정 없이도 로그 전송이 가능합니다.
그러나, 대상 버킷의 역할에서 프로젝트 멤버 그룹을 권한에서 삭제 한다면 프로젝트 멤버 그룹에 속해있는 Object Storage Agent계정은 스토리지 편집자 권한이 없어져 로그를 저장할 수 없습니다.
이런 경우 아래와 같이 수동으로 Object Storage Agent 서비스 계정을 스토리지 편집자 이상의 역할로 추가 해야합니다.
Object Storage Agent 역할 추가
로그 객체 키 형식
Access Log의 객체 키는 다음 형식을 사용하여 로그를 생성할 수 있습니다.
- SimplePrefix :
DestinationPrefix
YYYY
-MM
-DD
-hh
-mm
-ss
-UniqueString
- PartitionedDateSource:
DestinationPrefix
SourceAccountId
/SourceRegion
/SourceBucket
/YYYY
/MM
/DD
/YYYY
-MM
-DD
-hh
-mm
-ss
-UniqueString
- 객체 키 포맷에 대한 상세한 설명은 아래와 같습니다.
YYYY
,MM
,DD
,hh
,mm
,ss
: 년,월,일,시,분,초 (협정 세계시(UTC))DestinationPrefix
: 대상 접두사ProjectID
: 프로젝트 IDSourceRegion
: 리전명SourceBucket
출발지 버킷UniqueString
: 객체 키 식별 문자열
UniqueString
은 로그가 덮어씌여지는 것을 방지하기 위한 구분 값입니다.
로그 레코드 필드
다음은 Access Log에 기록되는 로그 필드 레코드에 대한 설명입니다.
1.도메인 ID (domain_id)
고객의 도메인 ID 값입니다.
예) 327373ec52974577a79a5e26b26c27e9
2.프로젝트 ID (project_id)
고객의 도메인 하위의 프로젝트 ID 값입니다.
예) ca7f6c731a004091a32d4eb97ec17271
3.버킷 이름 (bucket)
요청에서 처리하는 버킷의 이름입니다.
예) Kakao-bucket
4.버킷 소유자 ID (bucket_owner)
출발지 버킷의 소유자 ID입니다.
예) 54ba02ba408d4968a35686e48db85ea8
5.시간 (time)
버킷에 요청 시간입니다. [%d/%B/%Y:%H:%M:%S %z] 포맷을 사용합니다. %d: 두 자리 일(day) %b: 약식 월(month) 이름 (예: May) %Y: 네 자리 연(year) %H: 두 자리 시(hour) %M: 두 자리 분(minute) %S: 두 자리 초(second) %z: UTC 오프셋 이 날짜 및 시간은 협정 세계시(UTC)로 표시됩니다.
예) 16/May/2024:08:20:05 +0000
6.원격 IP (remote_ip)
버킷에 요청을 수행한 클라이언트 IP입니다.
예) 127.0.0.1
7.요청자 ID (user_id)
버킷에 요청한 요청자 ID 입니다. 퍼블릭에서 별도의 인증 토큰 없이 접속 하는 경우는 [-]으로 표기됩니다.
예) 0e26ca49d2ca4bbfbd85e5901545c796
8.요청 ID (request_id)
요청을 식별하기 위해 생성한 ID입니다.
예) tx000008b923132a7716acd-0065795106-8fb2f-kr-central-2
9.작업 (operation)
여기에 나열된 작업은 [REST.{HTTP_method}.{resource_type}
]으로 선언됩니다. Lifecycle 정책에 의해 삭제된 객체에 대해서는 로깅되지 않습니다.
예) REST.POST.OBJECT
10.객체 키 (key)
요청한 객체 키입니다.
예) /Image/kakaocloud/ryan.jpg
11.요청-URI (request_uri)
HTTP 요청 메시지의 Request-URI입니다.
예) /v1/1b5e24ba80104e9f9aecd2bcfeb7da2/object-reg-test-1/mulit-object?uploads
12.HTTP 상태 (http_status)
응답의 HTTP 상태 코드입니다.
예) 200
13.에러 코드 (error_code)
Object Storage의 에러 코드입니다. 에러가 없을 경우 [-]으로 표기됩니다. (S3 API 호출의 경우에만 기록됩니다.)
예) -
14.요청 바이트 (request_body_size)
받은 요청 바이트 수입니다.
예) 2662992
15.응답 바이트 (response_body_size)
HTTP 프로토콜 오버헤드를 제외하고 전송된 응답 바이트 수입니다.
예) 5432290
16.객체 크기 (object_size)
객체의 전체 크기입니다.
예) 7452918
17.총시간 (total_time)
Object Storage가 사용자 요청에 소비한 시간입니다. milliseconds로 표현합니다. 요청의 byte가 수신된 시간부터 응답의 마지막 byte가 전송된 시간까지 측정됩니다.
예) 253.507608ms
18.HTTP Referer (http_referer)
HTTP 리퍼러 해더값입니다. 없을 경우 [-]으로 표기됩니다. HTTP 사용자 Agent(브라우저)는 일반적으로 요청 시 이 헤더를 링크 또는 포함 페이지의 URL로 설정합니다.
예) http://www.example.com/webservices
19.User-Agent (user_agent)
HTTP 사용자 에이전트 해더값입니다.
예) Apache-httpClient/4.5.14 (java/17.0.9)
20.버전 ID (version_id)
복사 되는 객체의 버전 ID입니다. 값이 없을 경우 [-]으로 표기됩니다. (현재는 버전 ID를 지원하지 않습니다.)
예) -
21.호스트 ID (host_id)
요청을 수행한 호스트 머신 id입니다. 암호화된 값으로 기록합니다.
예) s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234=
22.Protocol (protocol)
요청한 Object Storage API Protocol입니다. [S3] API, [Swift] API를 지원합니다.
예) S3
23.인증 유형 (authentication_type)
사용되는 요청 인증 유형으로 인증 헤더의 경우 [AuthHeader], 쿼리 문자열 (미리 서명된 URL)인 경우 [QueryString], 인증되지 않은 요청의 경우는 [-]입니다.
예) AuthHeader
24.호스트 헤더 (host)
Object Storage의 엔드포인트입니다.
예) objectstorage.kr-central-2.kakaocloud.com