이 문서에서는 Cloud Storage 버킷의 사용량 로그와 스토리지 정보를 다운로드 및 검토하고 Google BigQuery를 사용하여 로그를 분석하는 방법을 설명합니다.
소개
Cloud Storage는 사용량 로그와 스토리지 로그를 다운로드하고 볼 수 있는 CSV 파일 형식으로 제공합니다. 사용량 로그는 지정된 버킷에서 수행된 모든 요청에 대한 정보를 제공하며 매시간 생성됩니다. 스토리지 로그는 마지막 날의 해당 버킷의 스토리지 사용에 대한 정보를 제공하며 매일 생성됩니다.
설정이 완료되면 사용량 로그와 스토리지 로그가 지정한 버킷의 새 객체로 자동 생성됩니다.
사용량 로그 및 스토리지 로그에는 Cloud Storage에 저장된 다른 객체와 동일한 가격이 적용됩니다.
사용량 로그 또는 Cloud 감사 로그를 사용해야 하나요?
대부분의 경우에 Cloud 감사 로그는 Cloud Storage에서 수행된 API 작업을 추적하는 로그를 생성하는 데 권장되는 방법입니다.
- Cloud 감사 로그는 발생 후 몇 초 이내에 이벤트를 제공하여 지속적으로 액세스를 추적합니다.
- Cloud 감사 로그는 사용하기 더 쉬운 로그를 생성합니다.
- Cloud 감사 로그는 Cloud Storage뿐만 아니라 다양한 Google Cloud 서비스를 모니터링할 수 있습니다.
- 필요한 경우 Cloud 감사 로그에서 자세한 요청 및 응답 정보를 로깅할 수 있습니다.
일부 경우에는 Cloud 감사 로그 사용을 대신하거나 이에 더해서 사용량 로그를 사용해야 할 수 있습니다. 대개 다음과 같은 경우 사용량 로그를 사용합니다.
- 리소스의 액세스 제어 설정에
allUsers
또는allAuthenticatedUsers
가 있는 경우(예: 정적 웹사이트로 구성한 버킷의 애셋에 대한 액세스) 발생하는 액세스를 추적하려고 합니다. - 객체 수명 주기 관리 또는 자동 클래스 기능에서 변경사항을 추적하려고 합니다.
- 인증된 브라우저 다운로드를 사용하여 버킷의 객체에 액세스하려고 합니다.
- 지연 시간 정보나 개별 HTTP 요청의 요청 크기 및 응답 크기, 전체 URL 경로, 모든 쿼리 매개변수를 로그에 포함하려고 합니다.
- 프로젝트의 특정 버킷에 대한 액세스만 추적하기를 원하므로 프로젝트의 모든 버킷에 대한 액세스를 추적하는 데이터 액세스 감사 로그를 사용 설정하지 않으려고 합니다.
사용량 로그는 매 시간별로만 생성되며 특히 요청 비율이 높은 버킷을 보고할 때 지연될 수 있습니다.
스토리지 로그 또는 Monitoring을 사용해야 하나요?
일반적으로는 스토리지 로그를 사용하면 안 됩니다. 스토리지 사용을 측정하는 데 권장되는 도구는 Monitoring입니다. 이 도구는 시각화 도구뿐만 아니라 스토리지 로그에 작성되지 않는 스토리지 사용과 관련된 추가 측정항목을 제공합니다. Monitoring 사용 방법에 대한 단계별 안내는 버킷 크기를 결정하는 콘솔 탭을 참조하세요.
로그 전송 설정
로그 전송을 설정하면 지정된 버킷에 대해 사용 로그와 스토리지 로그가 모두 생성됩니다. 다음 단계에서는 버킷의 로그 전송을 설정하는 방법을 설명합니다. 로그를 저장하는 데 사용할 버킷이 아직 없으면 버킷을 만듭니다.
명령줄
Cloud Storage에 버킷의
roles/storage.objectCreator
역할을 부여합니다.gcloud storage buckets add-iam-policy-binding gs://example-logs-bucket --member=group:cloud-storage-analytics@google.com --role=roles/storage.objectCreator
이 역할은
cloud-storage-analytics@google.com
그룹 형식으로 Cloud Storage에 로그를 만들고 새 객체로 저장할 수 있는 권한을 부여합니다.버킷에서 균일한 버킷 수준 액세스가 사용 설정되어 있지 않는 한 로그 객체에는 로그 버킷의 기본 객체 ACL이 있습니다.
--log-bucket
플래그를 사용하여 버킷에서 로깅을 사용 설정합니다.gcloud storage buckets update gs://example-bucket --log-bucket=gs://example-logs-bucket [--log-object-prefix=log_object_prefix]
필요한 경우
--log-object-prefix
플래그를 사용하여 로그 객체의 객체 프리픽스를 설정할 수 있습니다. 객체 프리픽스는 로그 객체 이름의 시작 부분을 구성합니다. 최대 900자이며 유효한 객체 이름이어야 합니다. 기본적으로 객체 프리픽스는 로그가 사용 설정된 버킷의 이름입니다.
REST API
JSON API
Cloud Storage에 버킷의
roles/storage.objectCreator
역할을 부여합니다. 버킷에 대한 추가 버킷 수준 IAM binding이 있는 경우 이를 요청에 포함해야 합니다.POST /storage/v1/b/example-logs-bucket/iam Host: storage.googleapis.com { "bindings":[ { "role": "roles/storage.objectCreator", "members":[ "group-cloud-storage-analytics@google.com" ] } ] }
이 역할은
cloud-storage-analytics@google.com
그룹 형식으로 Cloud Storage에 로그를 만들고 새 객체로 저장할 수 있는 권한을 부여합니다.버킷에서 균일한 버킷 수준 액세스가 사용 설정되어 있지 않는 한 로그 객체에는 로그 버킷의 기본 객체 ACL이 있습니다.
다음 요청을 사용하여 버킷에 로깅을 사용 설정합니다.
PATCH /storage/v1/b/example-bucket Host: storage.googleapis.com { "logging": { "logBucket": "example-logs-bucket", "logObjectPrefix": "log_object_prefix" } }
XML API
버킷에 Cloud Storage
WRITE
권한을 허용하도록 권한을 설정하여 로그를 만들고 새 객체로 저장합니다.cloud-storage-analytics@google.com
그룹에 쓰기 액세스 권한을 부여하는 버킷에 대한 ACL 항목을 추가해야 합니다. 요청에 버킷의 모든 기존 ACL과 함께 새 ACL을 포함해야 합니다.PUT /example-logs-bucket?acl HTTP/1.1 Host: storage.googleapis.com <AccessControlList> <Entries> <Entry> <Scope type="GroupByEmail"> <EmailAddress>cloud-storage-analytics@google.com</EmailAddress> </Scope> <Permission>WRITE</Permission> </Entry> <!-- include other existing ACL entries here--> </Entries> </AccessControlList>
로깅 쿼리 매개변수를 사용하여 버킷에 로깅을 사용 설정합니다.
PUT /example-bucket?logging HTTP/1.1 Host: storage.googleapis.com <Logging> <LogBucket>example-logs-bucket</LogBucket> <LogObjectPrefix>log_object_prefix</LogObjectPrefix> </Logging>
로깅 상태 확인
명령줄
buckets describe
명령어를 --format
플래그와 함께 사용하여 로깅을 확인합니다.
gcloud storage buckets describe gs://example-bucket --format="default(logging_config)"
로깅 구성을 파일에 저장할 수도 있습니다.
gcloud storage buckets describe gs://example-bucket > your_logging_configuration_file --format="default(logging_config)"
로깅이 사용 설정되면 서버가 응답으로 로깅 구성을 반환합니다.
logging: logBucket: example-logs-bucket logObjectPrefix: log_object_prefix
로깅이 사용 설정되지 않으면 다음이 반환됩니다.
null
REST API
JSON API
다음 예시와 같이 버킷의 로깅 구성에 대한 GET 요청을 전송합니다.
GET /storage/v1/b/example-bucket?fields=logging Host: storage.googleapis.com
로깅이 사용 설정되면 서버가 응답으로 구성을 전송합니다. 응답은 다음과 비슷하게 표시됩니다.
{ "logging": { "logBucket": "example-logs-bucket", "logObjectPrefix": "log_object_prefix" } }
로깅이 사용 설정되어 있지 않으면 빈 구성이 반환됩니다.
{}
XML API
다음 예시와 같이 버킷의 로깅 구성에 대한 GET 버킷 요청을 전송합니다.
GET /example-bucket?logging HTTP/1.1 Host: storage.googleapis.com
로깅이 사용 설정되면 서버가 응답으로 구성을 전송합니다. 응답은 다음과 비슷하게 표시됩니다.
<?xml version="1.0" ?> <Logging> <LogBucket> example-logs-bucket </LogBucket> <LogObjectPrefix> log_object_prefix </LogObjectPrefix> </Logging>
로깅이 사용 설정되어 있지 않으면 빈 구성이 반환됩니다.
<?xml version="1.0" ?> <Logging/>
로그 다운로드
스토리지 로그는 하루에 한 번 생성되며 전날의 스토리지 사용량을 포함합니다. 대개 오전 10시(PST) 전에 스토리지 로그가 생성됩니다.
모니터링 버킷에 보고할 활동이 있는 경우 사용량 로그가 매시간 생성됩니다. 사용량 로그는 대개 한 시간이 끝나고 15분 후에 생성됩니다.
사용량 로그와 스토리지 로그가 저장된 버킷에서 다운로드하는 가장 쉬운 방법은 Google Cloud 콘솔 또는 gcloud storage
CLI를 사용하는 것입니다. 사용량 로그는 CSV 형식이며 다음 명명 규칙을 따릅니다.
OBJECT_PREFIX_usage_TIMESTAMP_ID_v0
비슷하게 스토리지 로그의 이름은 다음 규칙에 따라 지정됩니다.
OBJECT_PREFIX_storage_TIMESTAMP_ID_v0
예를 들어 다음은 기본 객체 프리픽스를 사용하고 example-bucket
이라는 버킷의 사용량을 보고하며 2022년 6월 18일 14:00 UTC에 생성된 사용량 로그 객체의 이름입니다.
example-bucket_usage_2022_06_18_14_00_00_1702e6_v0
마찬가지로 다음은 기본 객체 프리픽스를 사용하고 동일한 버킷에서 2022년 6월 18일에 생성된 스토리지 로그 객체의 이름입니다.
example-bucket_storage_2022_06_18_07_00_00_1702e6_v0
로그를 다운로드하려면 다음 안내를 따르세요.
콘솔
- Google Cloud 콘솔에서 Cloud Storage 버킷 페이지로 이동합니다.
로그가 저장된 버킷을 선택합니다.
적절한 로그 객체를 클릭하여 로그를 다운로드하거나 열람합니다.
명령줄
다음 명령어를 실행합니다.
gcloud storage cp gs://BUCKET_NAME/LOGS_OBJECT DESTINATION
각 항목의 의미는 다음과 같습니다.
BUCKET_NAME
은 로그가 저장된 버킷의 이름입니다. 예를 들면example-logs-bucket
입니다.LOGS_OBJECT
는 다운로드할 사용량 로그 또는 스토리지 로그의 이름입니다. 예를 들면example-bucket_usage_2022_06_18_14_00_00_1702e6_v0
입니다.DESTINATION
은 로그가 다운로드되는 위치입니다. 예를 들면Desktop/Logs
입니다.
BigQuery에서 로그 분석
Cloud Storage 사용량 및 저장소 로그를 쿼리하려는 경우 추가 전용 테이블에 대해 SQL과 유사한 고속 쿼리를 제공하는 Google BigQuery를 사용할 수 있습니다. BigQuery 명령줄 도구 bq
는 명령줄에서 BigQuery에 액세스하는 데 사용할 수 있는 Python 기반 도구입니다. bq의 다운로드 및 사용에 대한 자세한 내용은 bq 명령줄 도구 참조 페이지를 확인하세요.
BigQuery에 로그 로드
기본 프로젝트를 선택합니다.
프로젝트 선택에 대한 자세한 내용은 프로젝트 다루기를 참조하세요.
새 데이터 세트를 만듭니다.
$ bq mk storageanalysis Dataset 'storageanalysis' successfully created.
프로젝트의 데이터 세트를 나열합니다.
$ bq ls datasetId
-----------------
storageanalysisload 명령어에 사용할 사용량 및 저장소 스키마를 로컬 컴퓨터에 저장합니다.
사용할 스키마는 cloud_storage_usage_schema_v0 및 cloud_storage_storage_schema_v0에서 찾을 수 있습니다. 사용량 및 스토리지 로그 형식 섹션에도 스키마가 설명되어 있습니다.
데이터 세트로 사용량 로그를 로드합니다.
$ bq load --skip_leading_rows=1 storageanalysis.usage \ gs://example-logs-bucket/example-bucket_usage_2014_01_15_14_00_00_1702e6_v0 \ ./cloud_storage_usage_schema_v0.json $ bq load --skip_leading_rows=1 storageanalysis.storage \ gs://example-logs-bucket/example-bucket_storage_2014_01_05_14_00_00_091c5f_v0 \ ./cloud_storage_storage_schema_v0.json
이들 명령어는 다음 작업을 수행합니다.
- 버킷
example-logs-bucket
에서 사용량 및 스토리지 로그를 로드합니다. - 데이터 세트
storageanalysis
에서 테이블usage
와storage
를 만듭니다. - bq 명령어가 실행되는 동일한 디렉터리에서 스키마 데이터(.json 파일)를 읽습니다.
- 열 설명이 들어 있는 각 로그 파일의 첫 행을 건너뜁니다.
이 예시에서 load 명령어를 처음으로 실행했으므로 테이블
usage
와storage
가 생성되었습니다. 다른 사용량 로그 파일 이름을 가진 후속 로드 명령어나 와일드 카드를 사용하여 이 테이블에 계속 추가할 수 있습니다. 예를 들어 다음 명령어는 'bucket_usuage_2014'로 시작하는 모든 로그의 데이터를storage
테이블에 추가합니다.$ bq load --skip_leading_rows=1 storageanalysis.usage \ gs://example-logs-bucket/bucket_usage_2014* \ ./cloud_storage_usage_schema.json
와일드 카드를 사용할 때 로그에서 데이터가 두 번 이상 업로드되지 않도록 BigQuery에 이미 업로드된 로그를 다른 디렉터리(예:
gs://example-logs-bucket/processed
)로 이동할 수 있습니다.- 버킷
BigQuery 브라우저 도구를 통해 BigQuery 기능에 액세스할 수도 있습니다. 브라우저 도구를 사용하면 테이블 작성 과정을 통해 데이터를 로드할 수 있습니다.
프로그래매틱 방식으로 데이터 로드를 비롯하여 Cloud Storage에서 데이터 로드에 대한 자세한 내용은 Cloud Storage에서 데이터 로드하기를 참조하세요.
사용량 로그 스키마 수정
사용량 로그를 BigQuery로 로드하기 전에 사전 처리하는 것이 더 유리한 경우도 있습니다. 예를 들어 BigQuery에서 쿼리를 더 쉽게 분석할 수 있게 사용량 로그에 정보를 더 추가할 수 있습니다. 이 섹션에서는 각 스토리지 사용량 로그의 파일 이름을 로그에 추가하는 방법을 보여줍니다. 이 작업을 수행하려면 기존 스키마와 각 로그 파일을 수정해야 합니다.
아래와 같이 기존 스키마인 cloud_storage_storage_schema_v0을 수정하여 파일 이름을 추가합니다. 원래 스키마와 구별하기 위해 새 스키마에 새 이름(예: cloud_storage_storage_schema_custom.json)을 지정합니다.
[ {"name": "bucket", "type": "string", "mode": "REQUIRED"}, {"name": "storage_byte_hours","type": "integer","mode": "REQUIRED"}, {"name": "filename","type": "string","mode": "REQUIRED"} ]
스토리지 사용량 로그를 BigQuery로 로드하기 전에 새 스키마를 기준으로 사전 처리합니다.
예를 들어 Linux, macOS 또는 Windows(Cygwin) 환경에서 다음 명령어를 사용할 수 있습니다.
gcloud storage cp gs://example-logs-bucket/example-bucket_storage\* . for f in example-bucket_storage\*; do sed -i -e "1s/$/,\"filename\"/" -e "2s/$/,\""$f"\"/" $f; done
gcloud storage
명령어는 파일을 작업 디렉터리에 복사합니다. 두 번째 명령어는 로그 파일을 반복하고 설명 행(첫 번째 행)에 'filename'을 추가하고 데이터 행(두 번째 행)에 실제 파일 이름을 추가합니다. 다음은 수정된 로그 파일의 예입니다."bucket","storage_byte_hours","filename" "example-bucket","5532482018","example-bucket_storage_2014_01_05_08_00_00_021fd_v0"
BigQuery로 스토리지 사용량 로그를 로드할 때 로컬에서 수정된 로그를 로드하고 맞춤설정된 스키마를 사용합니다.
for f in example-bucket_storage\*; \ do ./bq.py load --skip_leading_rows=1 storageanalysis.storage $f ./cloud_storage_storage_schema_custom.json; done
BigQuery에서 로그 쿼리
로그가 BigQuery로 로드되면 사용량 로그를 쿼리하여 로깅된 버킷에 대한 정보를 반환할 수 있습니다. 다음 예시에서는 버킷에 며칠 동안의 사용량 로그가 있으며 BigQuery에 사용량 로그 로드하기에서 표시된 대로 로그를 로딩했을 때의 시나리오에서 bq 도구를 사용하는 방법을 보여줍니다. BigQuery 브라우저 도구를 사용하여 아래 쿼리를 실행할 수도 있습니다.
bq 도구에서 상호작용 모드를 시작합니다.
$ bq shell
저장소 로그 테이블을 대상으로 쿼리를 실행합니다.
예를 들어 다음 쿼리는 로깅된 버킷의 저장용량이 시간에 따라 어떻게 바뀌는지 보여줍니다. 여기에서는 사용량 로그 스키마 수정하기의 설명대로 스토리지 사용량 로그를 수정했으며 로그 파일 이름이 'logstorage*'라고 가정합니다.
project-name>SELECT SUBSTRING(filename, 13, 10) as day, storage_byte_hours/24 as size FROM [storageanalysis.storage] ORDER BY filename LIMIT 100
쿼리의 출력 예시:
Waiting on bqjob_r36fbf5c164a966e8_0000014379bc199c_1 ... (0s) Current status: DONE +------------+----------------------+ | day | size | +------------+----------------------+ | 2014_01_05 | 2.3052008408333334E8 | | 2014_01_06 | 2.3012297245833334E8 | | 2014_01_07 | 3.3477797120833334E8 | | 2014_01_08 | 4.4183686058333334E8 | +-----------------------------------+
스키마를 수정하지 않고 기본 스키마를 사용하는 경우 다음 쿼리를 실행할 수 있습니다.
project-name>SELECT storage_byte_hours FROM [storageanalysis.storage] LIMIT 100
사용량 로그 테이블을 대상으로 쿼리를 실행합니다.
예를 들어, 다음 쿼리는 클라이언트가 로깅된 버킷의 리소스에 액세스하는 데 사용하는 요청 메서드를 요약하는 방법을 보여줍니다.
project-name>SELECT cs_method, COUNT(*) AS count FROM [storageanalysis.usage] GROUP BY cs_method
쿼리의 출력 예시:
Waiting on bqjob_r1a6b4596bd9c29fb_000001437d6f8a52_1 ... (0s) Current status: DONE +-----------+-------+ | cs_method | count | +-----------+-------+ | PUT | 8002 | | GET | 12631 | | POST | 2737 | | HEAD | 2173 | | DELETE | 7290 | +-----------+-------+
bq 도구의 대화형 셸을 종료합니다.
project-name> quit
로깅 중지
명령줄
buckets update
명령어에서 --clear-log-bucket
플래그로 로깅을 중지합니다.
gcloud storage buckets update gs://example-bucket --clear-log-bucket
로깅이 사용 중지되었는지 확인하려면 buckets describe
명령어를 사용하세요.
gcloud storage buckets describe gs://example-bucket --format="default(logging_config)"
로깅이 사용 중지되면 다음이 반환됩니다.
null
REST API
사용량 및 스토리지 로그 형식
사용량 로그와 스토리지 로그는 엄청난 양의 정보를 제공할 수 있습니다. 다음 표를 사용하여 이들 로그에서 제공하는 모든 정보를 식별할 수 있습니다.
사용량 로그 필드:
필드 | 유형 | 설명 |
---|---|---|
time_micros |
정수 | Unix epoch 이후에 요청이 완료된 시간(마이크로초 단위)입니다. |
c_ip |
문자열 | 요청이 작성된 IP 주소입니다. 'c' 프리픽스는 클라이언트에 대한 정보임을 나타냅니다. |
c_ip_type |
정수 | c_ip 필드의 IP 유형:
|
c_ip_region |
문자열 | 나중에 사용하기 위해 예약되어 있습니다. |
cs_method |
문자열 | 이 요청의 HTTP 메서드입니다. 프리픽스 'cs'는 이 정보가 클라이언트에서 서버로 전송되었음을 나타냅니다. |
cs_uri |
문자열 | 요청의 URI입니다. |
sc_status |
정수 | 서버가 응답으로 전송한 HTTP 상태 코드입니다. 프리픽스 'cs'는 이 정보가 서버에서 클라이언트로 전송되었음을 나타냅니다. |
cs_bytes |
정수 | 요청에서 전송한 바이트 수입니다. |
sc_bytes |
정수 | 응답에서 전송한 바이트 수입니다. |
time_taken_micros |
정수 | 요청을 처리하는 데 걸린 시간(마이크로초 단위)으로, 첫 번째 바이트가 수신된 시점부터 응답이 전송될 때까지 측정됩니다. 재개 가능한 업로드의 경우 종료 지점은 재개 가능한 업로드의 일부인 최종 업로드 요청에 대한 응답에 의해 결정됩니다. |
cs_host |
문자열 | 원래 요청의 호스트입니다. |
cs_referer |
문자열 | 요청에 대한 HTTP 리퍼러입니다. |
cs_user_agent |
문자열 | 요청의 사용자 에이전트입니다. 수명 주기 관리에서 생성한 요청의 경우 값이 GCS Lifecycle Management 입니다. |
s_request_id |
문자열 | 요청 식별자입니다. |
cs_operation |
문자열 | Cloud Storage 작업입니다(예: GET_Object ). null일 수 있습니다. |
cs_bucket |
문자열 | 이 요청에 지정된 버킷입니다. |
cs_object |
문자열 | 이 요청에 지정된 객체입니다. null일 수 있습니다. |
스토리지 로그 필드:
필드 | 유형 | 설명 |
---|---|---|
bucket |
문자열 | 버킷의 이름입니다. |
storage_byte_hours |
정수 | 버킷의 24시간 동안의 평균 크기(바이트-시간)입니다. 버킷의 총 크기를 구하려면 바이트-시간을 24로 나눕니다. |