액세스 로그 및 스토리지 로그

이 문서에서는 Cloud Storage 버킷의 액세스 로그와 스토리지 정보를 다운로드 및 검토하고 Google BigQuery를 사용하여 로그를 분석하는 방법을 설명합니다.

소개

Cloud Storage는 액세스 로그와 스토리지 로그를 다운로드하고 볼 수 있는 CSV 파일 형식으로 제공합니다. 액세스 로그는 지정된 버킷에서 수행된 모든 요청에 대한 정보를 제공하며 매시간 생성됩니다. 스토리지 로그는 마지막 날의 해당 버킷의 스토리지 사용에 대한 정보를 제공하며 매일 생성됩니다. 설정이 완료되면 액세스 로그와 스토리지 로그가 지정한 버킷의 새 객체로 자동 생성됩니다.

액세스 로그 또는 Cloud 감사 로그를 사용해야 하나요?

대부분의 경우에 Cloud 감사 로그는 Cloud Storage에서 수행된 API 작업을 추적하는 로그를 생성하는 데 권장되는 방법입니다.

  • Cloud 감사 로그는 지속적으로 액세스를 추적합니다.
  • Cloud 감사 로그는 사용하기 더 쉬운 로그를 생성합니다.
  • Cloud 감사 로그는 Cloud Storage뿐만 아니라 다양한 Google Cloud Platform 서비스를 모니터링할 수 있습니다.

경우에 따라 액세스 로그를 대신 사용할 수도 있습니다. 대개 다음과 같은 경우 액세스 로그를 사용합니다.

  • 정적 웹사이트로 구성된 버킷의 애셋과 같은 공개 객체에 대한 액세스를 추적하려고 합니다.
  • 객체에 설정된 액세스제어 목록(ACL) 때문에 액세스가 독점적으로 부여되는 경우 객체에 대한 액세스를 추적하려고 합니다.
  • 객체 수명 주기 관리 기능을 통해 변경된 내용을 추적하려고 합니다.
  • 인증된 브라우저 다운로드를 사용하여 버킷의 객체에 액세스하려고 합니다.
  • 지연 시간 정보나 개별 HTTP 요청의 요청 크기 및 응답 크기를 로그에 포함하려고 합니다.

스토리지 로그 또는 Stackdriver를 사용해야 하는 경우

일반적으로는 스토리지 로그를 사용하면 안 됩니다. 스토리지 사용을 측정하는 데 권장되는 도구는 Stackdriver이며, 이 도구는 스토리지 로그가 제공하지 않는 스토리지 사용과 관련된 추가 측정항목과 시각화 도구를 제공합니다. Stackdriver 사용에 대한 단계별 안내는 버킷 크기 결정을 참조하세요.

로그 전송 설정

다음 단계에서는 gsutil 도구, XML API, JSON API를 사용하여 특정 버킷의 로그 전송을 설정하는 방법을 설명합니다. gsutil 도구가 없으면 Google Cloud SDK 패키지의 일부나 독립 실행형 제품으로 gsutil 도구를 다운로드하여 설치하면 됩니다.

gsutil

  1. 로그를 저장할 버킷을 만듭니다.

    다음 명령어를 사용하여 로그를 저장할 버킷을 만듭니다.

    gsutil mb gs://example-logs-bucket
  2. Cloud Storage에 버킷에 대한 WRITE 권한을 허용하도록 권한을 설정합니다.

    Cloud Storage에 WRITE 권한이 있어야 로그를 만들고 새 객체로 저장할 수 있습니다. Cloud Storage에 버킷에 대한 WRITE 액세스 권한을 부여하려면 다음 명령어를 사용하여 cloud-storage-analytics@google.com 그룹에 쓰기 액세스 권한을 부여합니다.

    gsutil acl ch -g cloud-storage-analytics@google.com:W gs://example-logs-bucket
  3. 로그 객체는 로그 버킷의 기본 객체 ACL을 가집니다. gsutil을 사용하여 로그 버킷의 기본 객체 acl을 설정할 수 있습니다. 예를 들어, 기본 객체 acl을 project-private으로 설정하려면 다음을 사용하세요.

    gsutil defacl set project-private gs://example-logs-bucket
  4. 버킷에 로깅을 사용 설정합니다.

    logging 명령어를 사용하여 버킷에 로깅을 사용 설정할 수 있습니다.

    gsutil logging set on -b gs://example-logs-bucket [-o log_object_prefix ] gs://example-bucket

    선택사항으로 로그 개체의 log_object_prefix 객체 프리픽스를 설정할 수 있습니다. 객체 프리픽스는 로그 객체 이름의 시작 부분을 구성합니다. 최대 900자이며 유효한 객체 이름이어야 합니다. 기본적으로 객체 프리픽스는 로그가 사용 설정된 버킷의 이름입니다.

XML API

  1. 로그를 저장할 버킷을 만듭니다.

    다음 요청을 사용하여 로그를 저장할 버킷을 만듭니다.

    PUT /example-logs-bucket HTTP/1.1
    Host: storage.googleapis.com
    
  2. Cloud Storage에 버킷에 대한 WRITE 권한을 허용하도록 권한을 설정합니다.

    Cloud Storage에 WRITE 권한이 있어야 로그를 만들고 새 객체로 저장할 수 있습니다. 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>
    
  3. 버킷에 로깅을 사용 설정합니다.

    로깅 쿼리 매개변수를 사용하여 버킷에 로깅을 사용 설정할 수 있습니다.

    PUT /example-bucket?logging HTTP/1.1
    Host: storage.googleapis.com
    
    <Logging>
        <LogBucket>example-logs-bucket</LogBucket>
        <LogObjectPrefix>log_object_prefix</LogObjectPrefix>
    </Logging>
    

JSON API

  1. 로그를 저장할 버킷을 만듭니다.

    다음 요청을 사용하여 로그를 저장할 버킷을 만듭니다.

    POST /storage/v1/b?project=project-id
    Host: www.googleapis.com
    
    {
      "name": "example-logs-bucket"
    }
    
  2. Cloud Storage에 버킷에 대한 WRITE 권한을 허용하도록 권한을 설정합니다.

    Cloud Storage에 WRITE 권한이 있어야 로그를 만들고 새 객체로 저장할 수 있습니다. Cloud Storage에 버킷에 대한 WRITE 액세스 권한을 부여하려면 cloud-storage-analytics@google.com 그룹에 쓰기 액세스 권한을 부여하는 버킷에 대한 ACL 항목을 추가합니다. 로깅 버킷의 BucketAccessControls 리소스에 대한 다음 요청을 사용하여 이 작업을 수행할 수 있습니다.

    POST /storage/v1/b/example-logs-bucket/acl
    Host: www.googleapis.com
    {
     "entity": "group-cloud-storage-analytics@google.com",
     "role": "WRITER"
    }
    
  3. 버킷에 로깅을 사용 설정합니다.

    다음 요청을 사용하여 버킷에 로깅을 사용 설정할 수 있습니다.

    PATCH /storage/v1/b/example-bucket
    Host: www.googleapis.com
    
    {
     "logging": {
      "logBucket": "example-logs-bucket",
      "logObjectPrefix": "log_object_prefix"
     }
    }
    

로깅 상태 확인

gsutil

gsutil을 사용하면 logging get 명령어를 사용하여 로깅을 확인할 수 있습니다.

gsutil logging get gs://example-bucket

로깅 구성을 파일에 저장할 수도 있습니다.

gsutil logging get gs://example-bucket > your_logging_configuration_file

로깅이 사용 설정되면 서버가 응답으로 로깅 구성을 반환합니다.

{"logBucket": "example-logs-bucket", "logObjectPrefix": "log_object_prefix"}

로깅이 사용 설정되지 않으면 다음이 반환됩니다.

gs://example-bucket/ has no logging configuration.

XML API

Cloud Storage 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/>

JSON API

다음 예시와 같이 Cloud Storage JSON API를 사용하여 버킷의 로깅 구성에 대한 GET 요청을 전송할 수 있습니다.

GET /storage/v1/b/example-bucket?fields=logging
Host: www.googleapis.com

로깅이 사용 설정되면 서버가 다음과 같은 응답으로 구성을 반환합니다.

{
 "logging": {
  "logBucket": "example-logs-bucket",
  "logObjectPrefix": "log_object_prefix"
  }
}

로깅이 사용 설정되어 있지 않으면 빈 구성이 반환됩니다.

{
}

로그 다운로드하기

스토리지 로그는 하루에 한 번 생성되며 전날의 스토리지 사용량을 포함합니다. 대개 오전 10시(PST) 전에 스토리지 로그가 생성됩니다.

모니터링 버킷에 보고할 활동이 있는 경우 사용량 로그가 매시간 생성됩니다. 사용량 로그는 대개 한 시간이 끝나고 15분 후에 생성됩니다.

로그에 대한 액세스는 로그 객체의 ACL로 제어됩니다. 로그 객체에는 로그 버킷의 기본 객체 ACL이 있습니다.

액세스 로그와 스토리지 로그를 다운로드하는 가장 쉬운 방법은 Google Cloud Platform Console이나 gsutil 도구를 사용하는 것입니다. 액세스 로그는 CSV 형식이며 다음 명명 규칙을 따릅니다.

gs://<bucket_name>/<object_prefix>_usage_<timestamp>_<id>_v0

예를 들어, 다음은 2013년 6월 18일 오후 2시(UTC)에 생성된 gs://example-bucket이라는 버킷의 액세스 로그 객체이며 gs://example-logs-bucket 버킷에 저장됩니다.

gs://example-logs-bucket/example-bucket_usage_2013_06_18_14_00_00_1702e6_v0

스토리지 로그의 이름은 다음 규칙에 따라 지정됩니다.

gs://<bucket_name>/<object_prefix>_storage_<timestamp>_<id>_v0

예를 들어 다음은 2013년 6월 18일의 동일한 버킷에 대한 스토리지 로그 객체입니다.

gs://example-logs-bucket/example-bucket_storage_2013_06_18_07_00_00_1702e6_v0

로그를 다운로드하려면 다음 안내를 따르세요.

Console

  1. Google Cloud Platform Console에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기
  2. 로그 버킷을 선택합니다.

  3. 적절한 로그 객체를 클릭하여 로그를 다운로드하거나 봅니다.

gsutil

다음 명령어를 실행합니다.

gsutil cp <logs_object> <destination_uri>

BigQuery에서 로그 분석하기

Cloud Storage 사용량 및 스토리지 로그를 쿼리하려는 경우 추가 전용 테이블에 대해 SQL과 유사한 고속 쿼리를 제공하는 Google BigQuery를 사용할 수 있습니다. BigQuery 명령줄 도구 bq는 명령줄에서 BigQuery에 액세스하는 데 사용할 수 있는 Python 기반 도구입니다. bq의 다운로드 및 사용에 대한 자세한 내용은 bq 명령줄 도구 참조 페이지를 확인하세요.

BigQuery로 로그 로드하기

  1. 기본 프로젝트를 선택합니다.

    프로젝트 선택에 대한 자세한 내용은 프로젝트 다루기를 참조하세요.

  2. 새 데이터세트를 만듭니다.

    $ bq mk storageanalysis
    Dataset 'storageanalysis' successfully created.
    
  3. 프로젝트의 데이터세트를 나열합니다.

    $ bq ls
     
    datasetId
    -----------------
    storageanalysis
    
  4. load 명령어에 사용할 사용량 및 스토리지 스키마를 로컬 컴퓨터에 저장합니다.

    사용할 스키마는 cloud_storage_usage_schema_v0cloud_storage_storage_schema_v0에서 찾을 수 있습니다. 액세스 및 스토리지 로그 형식 섹션에도 스키마가 설명되어 있습니다.

  5. 데이터세트로 액세스 로그를 로드합니다.

    $ 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에서 테이블 usagestorage를 만듭니다.
    • bq 명령어가 실행되는 동일한 디렉터리에서 스키마 데이터(.json 파일)를 읽습니다.
    • 각 로그 파일의 첫 행은 열 설명이 포함되어 있으므로 건너뜁니다.

    이 예시에서 load 명령어를 처음으로 실행했으므로 테이블 usagestorage가 생성되었습니다. 다른 액세스 로그 파일 이름을 가진 후속 로드 명령어나 와일드 카드를 사용하여 이 테이블에 계속 추가할 수 있습니다. 예를 들어 다음 명령어는 '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에서 쿼리를 더 쉽게 분석할 수 있게 액세스 로그에 정보를 더 추가할 수 있습니다. 이 섹션에서는 각 저장소 액세스 로그의 파일 이름을 로그에 추가하는 방법을 보여줍니다. 이 작업을 수행하려면 기존 스키마와 각 로그 파일을 수정해야 합니다.

  1. 아래와 같이 기존 스키마인 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"}
    ]
    
  2. 저장소 액세스 로그를 BigQuery로 로드하기 전에 새 스키마를 기준으로 사전 처리합니다.

    예를 들어 Linux, macOS 또는 Windows(Cygwin) 환경에서 다음 명령어를 사용할 수 있습니다.

    gsutil 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
    

    gsutil 명령어는 파일을 작업 디렉토리에 복사합니다. 두 번째 명령어는 로그 파일을 반복하고 설명 행(첫 번째 행)에 'filename'을 추가하고 데이터 행(두 번째 행)에 실제 파일 이름을 추가합니다. 다음은 수정된 로그 파일의 예입니다.

    "bucket","storage_byte_hours","filename"
    "example-bucket","5532482018","example-bucket_storage_2014_01_05_08_00_00_021fd_v0"
    
  3. 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 브라우저 도구를 사용하여 아래 쿼리를 실행할 수도 있습니다.

  1. bq 도구에서 대화형 모드를 시작합니다.

    $ bq shell
    
  2. 스토리지 로그 테이블을 대상으로 쿼리를 실행합니다.

    예를 들어 다음 쿼리는 로깅된 버킷의 저장용량이 시간에 따라 어떻게 바뀌는지 보여줍니다. 여기에서는 액세스 로그 스키마 수정하기의 설명대로 스토리지 액세스 로그를 수정했으며 로그 파일 이름이 '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
    
  3. 사용량 로그 테이블을 대상으로 쿼리를 실행합니다.

    예를 들어, 다음 쿼리는 클라이언트가 로깅된 버킷의 리소스에 액세스하는 데 사용하는 요청 메소드를 요약하는 방법을 보여줍니다.

    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 |
    +-----------+-------+
    
  4. bq 도구의 대화형 셸을 종료합니다.

    project-name> quit
    

로깅 사용 중지

gsutil

gstuil을 사용하여 logging 명령어로 로깅을 사용 중지합니다.

gsutil logging set off gs://example-bucket

로깅이 사용 중지되었는지 확인하려면 logging get 요청을 수행합니다.

gsutil logging get gs://example-bucket

로깅이 중지되면 다음이 반환됩니다.

gs://example-bucket/ has no logging configuration.

XML API

Cloud Storage XML API를 사용하여 다음 예시와 같이 버킷의 로깅 구성에 PUT 요청을 전송하여 로깅을 사용 중지합니다.

PUT /example-bucket?logging HTTP/1.1
Host: storage.googleapis.com

<Logging/>

JSON API

Cloud Storage JSON API를 사용하여 다음 예시와 같이 PATCH 요청을 버킷의 로깅 구성으로 전송하여 로깅을 사용 중지합니다.

PATCH /example-bucket?logging HTTP/1.1
Host: storage.googleapis.com

{
 "logging": null
}

액세스 및 스토리지 로그 형식

액세스 로그와 스토리지 로그는 엄청난 양의 정보를 제공할 수 있습니다. 다음 표를 사용하여 이들 로그에서 제공하는 모든 정보를 식별할 수 있습니다.

액세스 로그 필드:

필드 유형 설명
time_micros 정수 Unix epoch 이후에 요청이 완료된 시간(마이크로초 단위)입니다.
c_ip 문자열 요청이 작성된 IP 주소입니다. 프리픽스 'c'는 클라이언트에 대한 정보임을 나타냅니다.
c_ip_type 정수 c_ip 필드의 IP 유형:
  • 1은 IPV4 주소를 나타냅니다.
  • 2는 IPV6 주소를 나타냅니다.
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).
cs_bucket 문자열 요청에 지정된 버킷입니다. 목록 버킷 요청인 경우 null일 수 있습니다.
cs_object 문자열 이 요청에 지정된 객체입니다. null일 수 있습니다.

스토리지 로그 필드:

필드 유형 설명
bucket 문자열 버킷의 이름입니다.
storage_byte_hours 정수 버킷의 24시간 동안의 평균 크기(바이트-시간)입니다. 버킷의 총 크기를 구하려면 바이트-시간을 24로 나눕니다.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.