

# 서버 액세스 로깅을 사용한 요청 로깅
<a name="ServerLogs"></a>

서버 액세스 로깅은 버킷에 대해 이루어진 요청에 따른 상세 레코드를 제공합니다. 서버 액세스 로그는 많은 애플리케이션에 있어 유용합니다. 예를 들어 액세스 로그 정보는 보안 및 액세스 감사에 유용할 수 있습니다. 이 정보를 통해 고객 기반을 이해하고 Amazon S3 청구 비용을 파악할 수도 있습니다.

**참고**  
서버 액세스 로그는 2019년 3월 20일 이후에 시작된 리전의 잘못된 리전 리디렉션 오류에 대한 정보를 기록하지 않습니다. 버킷이 존재하는 리전 외부에서 객체 또는 버킷 요청이 생성되면 잘못된 리전 리디렉션 오류가 발생합니다.

## 로그 전송을 사용 설정하려면 어떻게 해야 합니까?
<a name="server-access-logging-overview"></a>

로그 전송을 사용 설정하려면 다음 기본 단계를 수행합니다. 자세한 내용은 [Amazon S3 서버 액세스 로깅 사용 설정](enable-server-access-logging.md)을 참조하세요.

1. **대상 버킷**의 이름을 입력합니다**. 이 버킷은 Amazon S3에서 액세스 로그를 객체로 저장하는 곳입니다. 소스 및 대상 버킷 모두 동일한 AWS 리전에 있어야 하며 동일한 계정에서 소유하고 있어야 합니다. 대상 버킷에는 S3 객체 잠금 기본 보존 기간이 구성되어 있지 않아야 합니다. 또한 대상 버킷에는 요청자 지불이 활성화되어 있지 않아야 합니다.

   소스 버킷 자체를 포함하여 소스 버킷과 동일한 리전에 있는 자신의 고유 버킷에 로그를 전달할 수 있습니다. 그러나 로그 관리를 간소화하기 위해서는 액세스 로그를 다른 버킷에 저장하는 것이 좋습니다.

   소스 버킷과 대상 버킷이 동일한 버킷이면 버킷에 작성되는 로그에 대해 추가 로그가 생성되므로 로그의 무한 루프가 만들어집니다. 이러한 방식은 스토리지 결제 요금이 약간 증가할 수 있으므로 이 작업을 수행하지 않는 것이 좋습니다. 또한 로그에 대한 추가 로그로 인해 원하는 로그를 찾기가 힘들어질 수 있습니다.

   소스 버킷에 액세스 로그를 저장하려는 경우 모든 로그 객체 키에 대상 접두사를 지정하는 것이 좋습니다.** 접두사를 지정하면 모든 로그 객체 이름이 공통의 문자열로 시작되므로 로그 객체를 쉽게 식별할 수 있습니다.

1. **(선택 사항) 모든 Amazon S3 로그 객체 키에 대상 접두사를 지정합니다.** 대상 접두사를 사용하면 더 쉽게 로그 객체를 찾을 수 있습니다.** 예를 들어 접두사 값을 `logs/`로 지정할 경우 Amazon S3가 만드는 각 로그 객체의 키는 `logs/` 접두사로 시작합니다.

   ```
   logs/2013-11-01-21-32-16-E568B2907131C0C0
   ```

   접두사 값을 `logs`로 지정하는 경우 로그 객체는 다음과 같이 나타납니다.

   ```
   logs2013-11-01-21-32-16-E568B2907131C0C0
   ```

   [접두사](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)는 여러 버킷이 동일한 대상 버킷에 로깅할 때 소스 버킷을 서로 구별하는 데 유용합니다.

   로그를 삭제할 경우에도 이 접두사가 유용하게 사용됩니다. 예를 들어 Amazon S3가 특정 접두사를 가진 객체를 삭제하도록 수명 주기 구성 규칙을 설정할 수 있습니다. 자세한 내용은 [Amazon S3 로그 파일 삭제](deleting-log-files-lifecycle.md) 섹션을 참조하세요.

1. **(선택 사항) **다른 사용자가 생성된 로그에 액세스할 수 있도록 권한을 설정합니다.** 기본적으로 버킷 소유자에게만 항상 로그 객체에 대한 모든 액세스 권한이 부여됩니다. 대상 버킷이 S3 객체 소유권에 버킷 소유자 적용 설정을 사용하여 액세스 제어 목록(ACL)을 비활성화하는 경우 ACL을 사용하는 대상 권한 부여에서 권한을 부여할 수 없습니다.** 그러나 대상 버킷에 대한 버킷 정책을 업데이트하여 다른 사용자에게 액세스 권한을 부여할 수 있습니다. 자세한 내용은 [Amazon S3의 ID 및 액세스 관리](security-iam.md) 및 [로그 전달을 위한 권한](enable-server-access-logging.md#grant-log-delivery-permissions-general)(을)를 참조하세요.

1. **(선택 사항) 로그 파일에 로그 객체 키 형식을 설정합니다.** 로그 객체 키 형식(**대상 객체 키 형식이라고도 함)에는 두 가지 옵션이 있습니다.
   + **날짜 기반이 아닌 분할** - 원래 로그 객체 키 형식입니다. 이 형식을 선택하면 로그 파일 키 형식이 다음과 같이 나타납니다.

     ```
     [DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
     ```

     예를 들어 접두사를 `logs/`로 지정하는 경우 로그 객체의 이름은 다음과 같이 지정됩니다.

     ```
     logs/2013-11-01-21-32-16-E568B2907131C0C0
     ```
   + **날짜 기반 분할** - 날짜 기반 분할을 선택하는 경우 로그 파일의 이벤트 시간이나 전송 시간을 로그 형식에 사용되는 날짜 소스로 선택할 수 있습니다. 이 형식을 사용하면 로그를 더 쉽게 쿼리할 수 있습니다.

     날짜 기반 분할을 선택하면 로그 파일 키 형식이 다음과 같이 나타납니다.

     ```
     [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
     ```

     예를 들어 대상 접두사를 `logs/`로 지정하는 경우 로그 객체의 이름은 다음과 같이 지정됩니다.

     ```
     logs/123456789012/us-west-2/amzn-s3-demo-source-bucket/2023/03/01/2023-03-01-21-32-16-E568B2907131C0C0
     ```

     전송 시간 전송의 경우 로그 파일 이름의 시간은 로그 파일의 전송 시간에 해당합니다.

     이벤트 시간 전송의 경우 연도, 월, 일은 이벤트가 발생한 날에 해당하며 시, 분, 초는 키에서 `00`으로 설정됩니다. 이러한 로그 파일에 전송되는 로그는 특정 날짜에만 제공됩니다.

   

   AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 통해 로그를 구성하는 경우 `TargetObjectKeyFormat`을 사용하여 로그 객체 키 형식을 지정하세요. 날짜 기반이 아닌 분할을 지정하려면 `SimplePrefix`를 사용하세요. 날짜 기반 분할을 지정하려면 `PartitionedPrefix`를 사용하세요. `PartitionedPrefix`를 사용하는 경우 `PartitionDateSource`를 사용하여 `EventTime` 또는 `DeliveryTime`을 지정하세요.

   `SimplePrefix`의 경우 로그 파일 키 형식은 다음과 같이 나타납니다.

   ```
   [TargetPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
   ```

   이벤트 시간이나 전송 시간이 포함된 `PartitionedPrefix`의 경우 로그 파일 키 형식은 다음과 같이 나타납니다.

   ```
   [TargetPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
   ```

## 로그 객체 키 형식
<a name="server-log-keyname-format"></a>

Amazon S3는 대상 버킷에 업로드하는 로그 객체에 대해 다음과 같은 객체 키 형식을 사용합니다.
+ **날짜 기반이 아닌 분할** - 원래 로그 객체 키 형식입니다. 이 형식을 선택하면 로그 파일 키 형식이 다음과 같이 나타납니다.

  ```
  [DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
  ```
+ **날짜 기반 분할** - 날짜 기반 분할을 선택하는 경우 로그 파일의 이벤트 시간이나 전송 시간을 로그 형식에 사용되는 날짜 소스로 선택할 수 있습니다. 이 형식을 사용하면 로그를 더 쉽게 쿼리할 수 있습니다.

  날짜 기반 분할을 선택하면 로그 파일 키 형식이 다음과 같이 나타납니다.

  ```
  [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
  ```

로그 객체 키에서 `YYYY`, `MM`, `DD`, `hh`, `mm` 및 `ss`는 각각 연도, 월, 일, 시, 분, 초의 숫자를 나타냅니다. 이러한 날짜 및 시간은 협정 세계시(UTC)로 표시됩니다.

로그 파일에는 해당 파일이 전송된 시간 이전에 기록된 레코드가 포함될 수 있습니다. 특정 기간의 모든 로그 레코드가 전송되었는지 여부는 확인할 수 없습니다.

키의 `UniqueString` 구성 요소는 파일의 덮어쓰기를 방지할 목적으로 사용되는 것으로, 특별한 의미가 없으므로 로그 처리 소프트웨어가 무시해도 됩니다.

## 로그 전송 방법
<a name="how-logs-delivered"></a>

Amazon S3는 주기적으로 액세스 로그 레코드를 수집하여 로그 파일에 레코드를 통합한 다음 대상 버킷의 로그 객체로 로그 파일을 업로드합니다. 여러 소스 버킷에서 로깅을 활성화하고 동일한 대상 버킷을 지정한 경우 대상 버킷에 이러한 모든 소스 버킷의 액세스 로그가 저장됩니다. 그러나 각 로그 객체는 특정 원본 버킷의 액세스 로그 레코드만 보고합니다.

Amazon S3는 특별 로그 전달 계정을 사용하여 서버 액세스 로그를 씁니다. 이 쓰기는 일반적인 액세스 제어 제약 조건을 따릅니다. 액세스 로그 전송을 위해 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 액세스 권한을 부여하도록 대상 버킷의 버킷 정책을 업데이트하는 것이 좋습니다. 버킷 액세스 제어 목록(ACL)을 통해 S3 로그 전송 그룹에 액세스 로그 전송을 위한 액세스 권한을 부여할 수도 있습니다. 그러나 버킷 ACL을 사용하여 S3 로그 전송 그룹에 액세스 권한을 부여하는 것은 권장되지 않습니다.

대상 버킷 정책을 통해 서버 액세스 로깅을 활성화하고 액세스 로그 전송을 위한 액세스 권한을 부여할 때 정책을 업데이트하여 로깅 서비스 보안 주체에게 `s3:PutObject` 액세스를 허용해야 합니다. Amazon S3 콘솔을 사용하여 서버 액세스 로깅을 활성화하는 경우 콘솔은 대상 버킷 정책을 자동으로 업데이트하여 이러한 권한을 로깅 서비스 보안 주체에 부여합니다. 서버 액세스 로그 전달을 위한 권한 부여에 대한 자세한 내용은 [로그 전달을 위한 권한](enable-server-access-logging.md#grant-log-delivery-permissions-general) 섹션을 참조하십시오.

**참고**  
S3는 VPC 엔드포인트 정책에서 거부하는 경우 VPC 엔드포인트 요청에 대해, 또는 VPC 정책 평가 전에 실패하는 요청에 대해 요청자 또는 버킷 소유자에게 CloudTrail 로그 또는 서버 액세스 로그를 전송하는 것을 지원하지 않습니다.

**S3 객체 소유권에 대한 버킷 소유자 시행 설정**  
대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 ACL이 비활성화되고 더 이상 권한에 영향을 주지 않습니다. 로깅 서비스 보안 주체에 액세스 권한을 부여하려면 대상 버킷의 버킷 정책을 업데이트해야 합니다. 객체 소유권에 대한 자세한 내용은 [서버 액세스 로깅을 위해 S3 로그 전송 그룹에 대한 액세스 권한 부여](object-ownership-migrating-acls-prerequisites.md#object-ownership-server-access-logs) 섹션을 참조하십시오.

## 서버 로그 전송이 항상 보장되지는 않음
<a name="LogDeliveryBestEffort"></a>

서버 액세스 로그 레코드는 최대한 전송을 시도하지만 항상 모든 레코드가 전송된다고 보장할 수는 없습니다. 버킷에 대해 적절히 로깅이 구성된 대부분의 요청은 로그 레코드가 전송됩니다. 대부분 기록된 지 몇 시간 내로 로그 레코드가 전송되지만 더 자주 전송될 수 있습니다.

모든 서버 로깅이 제때 전송될 것이라고 보장할 수는 없습니다. 특정 요청에 대한 로그 레코드는 요청이 실제로 처리된 후에 오랫동안 전송되거나 *전혀 전송되지 않을 수도 있습니다*. 로그 레코드가 중복되는 경우가 발생할 수도 있습니다. 서버 로그는 버킷에 대한 트래픽의 특성을 파악할 용도로 제공되며, 로그 레코드가 손실되거나 중복되는 경우는 매우 드물지만 서버 로깅은 모든 요청을 완벽하게 기록할 목적으로 제공되는 것이 아니라는 점에 유의해야 합니다.

완벽한 전송을 보장할 수 없는 서버 로깅의 특성 때문에 사용 보고서에는 전송된 서버 로그에 포함되지 않은 액세스 요청이 하나 이상 포함될 수 있습니다. 이 사용 보고서는 AWS 결제 및 비용 관리 콘솔의 **비용 및 사용량 보고서**에서 찾을 수 있습니다.

## 버킷 로깅 상태 변경 시 일정 기간에 걸쳐 단계적으로 반영됨
<a name="BucketLoggingStatusChanges"></a>

버킷의 로깅 상태를 변경한 후 실제 로그 파일의 전송에 반영되려면 어느 정도 시간이 지나야 합니다. 예를 들어, 버킷에 로깅을 활성화할 경우 이후 1시간 동안 이루어진 요청 중 일부는 로깅되지만 일부는 로깅되지 않을 수도 있습니다. 로깅의 대상 버킷을 버킷 A에서 버킷 B로 변경한다고 가정하겠습니다. 변경 후 1시간 동안 일부 로그는 버킷 A로 계속 전송될 수 있지만, 다른 로그는 새로운 대상 버킷 B로 전송될 수 있습니다. 그러나 추가 작업을 수행하지 않아도 어느 정도 기간이 지나면 새 설정에 따라 로그가 전송됩니다.

로깅 및 로그 파일에 대한 자세한 내용은 다음 섹션을 참조하십시오.

**Topics**
+ [로그 전송을 사용 설정하려면 어떻게 해야 합니까?](#server-access-logging-overview)
+ [로그 객체 키 형식](#server-log-keyname-format)
+ [로그 전송 방법](#how-logs-delivered)
+ [서버 로그 전송이 항상 보장되지는 않음](#LogDeliveryBestEffort)
+ [버킷 로깅 상태 변경 시 일정 기간에 걸쳐 단계적으로 반영됨](#BucketLoggingStatusChanges)
+ [Amazon S3 서버 액세스 로깅 사용 설정](enable-server-access-logging.md)
+ [Amazon S3 서버 액세스 로그 형식](LogFormat.md)
+ [Amazon S3 로그 파일 삭제](deleting-log-files-lifecycle.md)
+ [Amazon S3 서버 액세스 로그를 사용하여 요청 식별](using-s3-access-logs-to-identify-requests.md)
+ [서버 액세스 로깅 문제 해결](troubleshooting-server-access-logging.md)

# Amazon S3 서버 액세스 로깅 사용 설정
<a name="enable-server-access-logging"></a>

서버 액세스 로깅은 Amazon S3 버킷에 수행된 요청에 대한 상세 레코드를 제공합니다. 서버 액세스 로그는 많은 애플리케이션에 있어 유용합니다. 예를 들어 액세스 로그 정보는 보안 및 액세스 감사에 유용할 수 있습니다. 이 정보를 통해 고객 기반을 이해하고 Amazon S3 청구 비용을 파악할 수도 있습니다.

Amazon S3는 기본적으로 서버 액세스 로그를 수집하지 않습니다. 로깅을 활성화하면 Amazon S3는 선택된 대상 버킷에 소스 버킷에 대한 액세스 로그를 전송합니다.** 대상 버킷은 소스 버킷과 AWS 리전 및 AWS 계정이 동일해야 합니다.

액세스 로그 레코드에는 버킷에 대한 요청 내역이 자세히 나와 있습니다. 이 정보에는 요청 유형, 요청에 지정된 리소스, 요청을 처리한 날짜 및 시간 등이 포함됩니다. 로깅 기초 사항에 대한 자세한 내용은 [서버 액세스 로깅을 사용한 요청 로깅](ServerLogs.md) 단원을 참조하십시오.

**중요**  
Amazon S3 버킷에서 서버 액세스 로그를 사용하는 데 따른 별도의 요금은 청구되지 않습니다. 단, 시스템이 사용자에게 전달하는 로그 파일에 대해서는 일반적인 스토리지 요금이 발생합니다. (로그 파일은 언제든지 삭제할 수 있습니다.) 로그 파일 전송에 따른 데이터 전송 요금은 발생하지 않지만 로그 파일 액세스에 따른 일반 데이터 전송 요금은 부과됩니다.
대상 버킷에는 서버 액세스 로깅을 활성화해서는 안 됩니다. 소스 버킷 자체를 포함하여 소스 버킷과 동일한 리전에 있는 자신의 고유 버킷에 로그를 전달할 수 있습니다. 그러나 원본 버킷에 로그를 전송하면 로그의 무한 루프가 발생하므로 권장되지 않습니다. 로그 관리를 간소화하기 위해서는 액세스 로그를 다른 버킷에 저장하는 것이 좋습니다. 자세한 내용은 [로그 전송을 사용 설정하려면 어떻게 해야 합니까?](ServerLogs.md#server-access-logging-overview) 섹션을 참조하세요.
S3 객체 잠금이 활성화된 S3 버킷은 서버 액세스 로그의 대상 버킷으로 사용할 수 없습니다. 대상 버킷에는 기본 보존 기간이 구성되어 있지 않아야 합니다.
대상 버킷에는 요청자 지불이 활성화되어 있지 않아야 합니다.

Amazon S3 콘솔, Amazon S3 API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하여 서버 액세스 로깅을 사용하거나 사용 중지할 수 있습니다.

## 로그 전달을 위한 권한
<a name="grant-log-delivery-permissions-general"></a>

Amazon S3는 특별 로그 전달 계정을 사용하여 서버 액세스 로그를 씁니다. 이 쓰기는 일반적인 액세스 제어 제약 조건을 따릅니다. 액세스 로그를 전송하려면 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 대상 버킷에 대한 액세스 권한을 부여해야 합니다.

Amazon S3에 로그 전송 권한을 부여하려면 대상 버킷의 S3 객체 소유권 설정에 따라 버킷 정책 또는 버킷 액세스 제어 목록(ACL)을 사용할 수 있습니다. 그러나 ACL 대신 버킷 정책을 사용하는 것이 좋습니다.

**S3 객체 소유권에 대한 버킷 소유자 시행 설정**  
대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 ACL이 비활성화되고 더 이상 권한에 영향을 주지 않습니다. 이 경우, 대상 버킷에서 로깅 서비스 보안 주체에 액세스 권한을 부여하도록 버킷 정책을 업데이트해야 합니다. S3 로그 전달 그룹에 액세스 권한을 부여하기 위해 버킷 ACL을 업데이트할 수 없습니다. 또한 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html) 구성에 대상 권한 부여를 포함할 수 없습니다.**

버킷 정책으로 액세스 로그 전달을 위해 기존 버킷 ACL을 마이그레이션하는 방법에 대한 자세한 내용은 [서버 액세스 로깅을 위해 S3 로그 전송 그룹에 대한 액세스 권한 부여](object-ownership-migrating-acls-prerequisites.md#object-ownership-server-access-logs) 섹션을 참조하십시오. 객체 소유권에 대한 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하십시오. 새 버킷을 만들 때 기본적으로 ACL이 비활성화됩니다.

**버킷 정책을 사용하여 액세스 권한 부여**  
대상 버킷에 대한 버킷 정책을 사용하여 액세스 권한을 부여하려면 로깅 서비스 보안 주체에 `s3:PutObject` 권한을 부여하도록 버킷 정책을 업데이트합니다. Amazon S3 콘솔을 사용하여 서버 액세스 로깅을 활성화하는 경우 콘솔은 대상 버킷에 대한 버킷 정책을 자동으로 업데이트하여 이 권한을 로깅 서비스 보안 주체에 부여합니다. 프로그래밍 방식으로 서버 액세스 로깅을 활성화하는 경우 대상 버킷에서 로깅 서비스 보안 주체에 액세스 권한을 부여하도록 버킷 정책을 수동으로 업데이트해야 합니다.

로깅 서비스 보안 주체에 액세스 권한을 부여하는 버킷 정책의 예시는 [버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여](#grant-log-delivery-permissions-bucket-policy) 섹션을 참조하세요.

**버킷 ACL을 사용하여 액세스 권한 부여**  
또는 버킷 ACL을 사용하여 액세스 로그 전달을 위한 액세스 권한을 부여할 수 있습니다. S3 로그 전달 그룹에 `WRITE` 및 `READ_ACP` 권한을 부여하는 권한 부여 항목을 버킷 ACL에 추가합니다. 그러나 버킷 ACL을 사용하여 S3 로그 전달 그룹에 액세스 권한을 부여하는 것은 권장되지 않습니다. 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요. 버킷 정책으로 액세스 로그 전달을 위해 기존 버킷 ACL을 마이그레이션하는 방법에 대한 자세한 내용은 [서버 액세스 로깅을 위해 S3 로그 전송 그룹에 대한 액세스 권한 부여](object-ownership-migrating-acls-prerequisites.md#object-ownership-server-access-logs) 섹션을 참조하십시오. 로깅 서비스 보안 주체에 액세스 권한을 부여하는 ACL의 예시는 [버킷 ACL을 사용하여 로그 전달 그룹에 권한 부여](#grant-log-delivery-permissions-acl) 섹션을 참조하세요.

### 버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여
<a name="grant-log-delivery-permissions-bucket-policy"></a>

이 예시 버킷 정책은 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 `s3:PutObject` 권한을 부여합니다. 이 버킷 정책을 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다. 다음 정책에서 `amzn-s3-demo-destination-bucket`은 서버 액세스 로그가 전송되는 대상 버킷이고 `amzn-s3-demo-source-bucket`은 소스 버킷입니다. `EXAMPLE-LOGGING-PREFIX`는 로그 객체에 사용할 선택적 대상 접두사(*대상 접두사*라고도 함)입니다. `SOURCE-ACCOUNT-ID`는 소스 버킷을 소유한 AWS 계정입니다.

**참고**  
버킷 정책에 `Deny` 명령문이 있는 경우 Amazon S3가 액세스 로그를 전송하는 것을 차단하지 않도록 해야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3ServerAccessLogsPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "logging.s3.amazonaws.com"
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/EXAMPLE-LOGGING-PREFIX*",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "SOURCE-ACCOUNT-ID"
                }
            }
        }
    ]
}
```

------

### 버킷 ACL을 사용하여 로그 전달 그룹에 권한 부여
<a name="grant-log-delivery-permissions-acl"></a>

**참고**  
보안 모범 사례로 Amazon S3는 기본적으로 모든 새 버킷에서 액세스 제어 목록(ACL)을 비활성화합니다. Amazon S3 콘솔의 ACL 권한에 대한 자세한 내용은 [ACL 구성](managing-acls.md) 단원을 참조하십시오.

권장하지는 않는 방식이지만 버킷 ACL을 사용하여 로그 전송 그룹에 권한을 부여할 수 있습니다. 그러나 대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html) 구성에 대상 권한 부여를 포함할 수 없습니다.** 대신, 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.

버킷 ACL에서 로그 전송 그룹은 다음 URL로 표시됩니다.

```
1. http://acs.amazonaws.com/groups/s3/LogDelivery
```

`WRITE` 및 `READ_ACP`(ACL 읽기) 권한을 부여하려면 대상 버킷 ACL에 다음 권한을 추가합니다.

```
 1. <Grant>
 2.     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:type="Group">
 3.         <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> 
 4.     </Grantee>
 5.     <Permission>WRITE</Permission>
 6. </Grant>
 7. <Grant>
 8.     <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:type="Group">
 9.         <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> 
10.     </Grantee>
11.     <Permission>READ_ACP</Permission>
12. </Grant>
```

프로그래밍 방식으로 ACL 권한을 추가하는 예는 [ACL 구성](managing-acls.md) 단원을 참조하십시오.

**중요**  
버킷에서 AWS CloudFormation을 사용하여 Amazon S3 서버 액세스 로깅을 활성화하고 ACL을 사용하여 S3 로그 전달 그룹에 액세스 권한을 부여하는 경우 CloudFormation 템플릿에 "`AccessControl": "LogDeliveryWrite"`도 추가해야 합니다. 이것이 중요한 이유는 버킷에 대해 ACL을 생성해야만 이러한 권한을 부여할 수 있지만 CloudFormation에서 버킷에 대한 사용자 지정 ACL을 생성할 수 없기 때문입니다. 미리 준비된 ACL만 CloudFormation에서 사용할 수 있습니다.

## 서버 액세스 로깅 사용 설정
<a name="enable-server-logging"></a>

Amazon S3 콘솔, Amazon S3 REST API, AWS SDK, AWS CLI를 사용하여 서버 액세스 로깅을 활성화하려면 다음 절차를 수행합니다.

### S3 콘솔 사용
<a name="server-access-logging"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **범용 버킷**을 선택합니다.

1. 버킷 목록에서 서버 액세스 로깅을 사용 설정하려는 버킷의 이름을 선택합니다.

1. [**속성(Properties)**]을 선택합니다.

1. **서버 액세스 로깅** 섹션에서 **편집**을 선택합니다.

1. **서버 액세스 로깅**에서 **활성화**를 선택합니다.

1. **대상 버킷**에서 버킷과 원하는 경우 접두사를 지정합니다. 접두사를 지정하는 경우 로그를 더 쉽게 찾을 수 있도록 접두사 뒤에 슬래시(`/`)를 포함하는 것이 좋습니다.
**참고**  
접두사를 슬래시(`/`)와 함께 지정하면 로그 객체를 더 쉽게 구분할 수 있습니다. 예를 들어 접두사 값을 `logs/`로로 지정할 경우 Amazon S3가 만드는 각 로그 객체의 키는 다음과 같이 `logs/` 접두사로 시작합니다.  

   ```
   logs/2013-11-01-21-32-16-E568B2907131C0C0
   ```
접두사 값을 `logs`로 지정하는 경우 로그 객체는 다음과 같이 나타납니다.  

   ```
   logs2013-11-01-21-32-16-E568B2907131C0C0
   ```

1. **로그 객체 키 형식**에서 다음 중 하나를 수행합니다.
   + 날짜 기반이 아닌 분할을 선택하려면 **[DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]**을 선택합니다.
   + 날짜 기반 분할을 선택하려면 **[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]**을 선택한 다음 **S3 이벤트 시간** 또는 **로그 파일 전송 시간**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

   버킷에서 서버 액세스 로깅을 활성화하면 콘솔이 소스 버킷에서 로깅을 사용 설정하고 대상 버킷에서 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 `s3:PutObject` 권한을 부여하도록 버킷 정책을 업데이트합니다. 이 버킷 정책에 대한 자세한 내용은 [버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여](#grant-log-delivery-permissions-bucket-policy) 섹션을 참조하십시오.

   대상 버킷에서 로그를 볼 수 있습니다. 서버 액세스 로깅을 사용 설정하면 로그가 대상 버킷에 전달되기까지 몇 시간이 소요될 수 있습니다. 로그가 전송되는 방법 및 시기에 대한 자세한 내용은 [로그 전송 방법](ServerLogs.md#how-logs-delivered) 섹션을 참조하십시오.

자세한 내용은 [S3 범용 버킷에 대한 속성 보기](view-bucket-properties.md) 섹션을 참조하세요.

### REST API 사용
<a name="enable-logging-rest"></a>

로깅을 활성화하기 위해 소스 버킷에 로깅 구성을 추가하는 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html) 요청을 제출합니다. 요청에 대상 버킷, 그리고 선택 사항으로 모든 로그 객체 키에 사용할 접두사를 지정합니다.**

다음 예시에서는 대상 버킷으로 `amzn-s3-demo-destination-bucket`을, 접두사로 *`logs/`*를 지정합니다.

```
1. <BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
2.   <LoggingEnabled>
3.     <TargetBucket>amzn-s3-demo-destination-bucket</TargetBucket>
4.     <TargetPrefix>logs/</TargetPrefix>
5.   </LoggingEnabled>
6. </BucketLoggingStatus>
```

다음 예시에서는 대상 버킷으로 `amzn-s3-demo-destination-bucket`을, 접두사로 *`logs/`*를, 로그 객체 키 형식으로 `EventTime`을 지정합니다.

```
 1. <BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
 2.   <LoggingEnabled>
 3.     <TargetBucket>amzn-s3-demo-destination-bucket</TargetBucket>
 4.     <TargetPrefix>logs/</TargetPrefix>
 5.     <TargetObjectKeyFormat>
 6.       <PartitionedPrefix>
 7.          <PartitionDateSource>EventTime</PartitionDateSource>
 8.       </PartitionedPrefix>
 9.   </TargetObjectKeyFormat>
10.   </LoggingEnabled>
11. </BucketLoggingStatus>
```

S3 로그 전달 계정이 로그 객체를 작성하고 소유하며, 버킷 소유자에게는 로그 객체에 대한 모든 권한이 부여됩니다. 필요한 경우 대상 권한 부여를 사용하여 로그에 액세스할 수 있도록 다른 사용자에게 권한을 부여할 수 있습니다.** [자세한 내용은 PutBucketLogging 단원을 참조하세요.](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html)

**참고**  
대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 대상 권한 부여를 사용하여 다른 사용자에게 권한을 부여할 수 없습니다. 다른 사용자에게 권한을 부여하기 위해 대상 버킷에서 버킷 정책을 업데이트할 수 있습니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.

버킷의 로깅 구성을 검색하려면 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlogging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlogging.html) API 작업을 사용하세요.

로깅 구성을 삭제하려면 빈 `BucketLoggingStatus`로 `PutBucketLogging` 요청을 보냅니다.

```
1. <BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
2. </BucketLoggingStatus>
```

버킷에서 로깅을 활성화하려면 Amazon S3 API 또는 AWS SDK 래퍼 라이브러리를 사용할 수 있습니다.

### AWS SDK 사용
<a name="enable-logging-sdk"></a>

다음은 버킷에서 로깅을 활성화하는 예시입니다. 소스 버킷 하나와 대상 버킷 하나를 생성해야 합니다. 예시는 대상 버킷의 버킷 ACL을 먼저 업데이트합니다. 그런 다음, 먼저 대상 버킷에 로그를 쓰는 데 필요한 권한을 로그 전송 그룹에 부여하고 나서 소스 버킷에서 로깅을 활성화합니다.

이 예시는 객체 소유권에 버킷 소유자 적용 설정을 사용하는 대상 버킷에서는 작동하지 않습니다.

대상 버킷이 객체 소유권에 버킷 소유자 강제 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 [PutBucketLogging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html) 구성에 대상 권한 부여를 포함할 수 없습니다. 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.

------
#### [ .NET ]

**SDK for .NET**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/S3#code-examples)에서 전체 예제를 확인하고 설정 및 실행하는 방법을 알아보세요.

```
    using System;
    using System.IO;
    using System.Threading.Tasks;
    using Amazon.S3;
    using Amazon.S3.Model;
    using Microsoft.Extensions.Configuration;

    /// <summary>
    /// This example shows how to enable logging on an Amazon Simple Storage
    /// Service (Amazon S3) bucket. You need to have two Amazon S3 buckets for
    /// this example. The first is the bucket for which you wish to enable
    /// logging, and the second is the location where you want to store the
    /// logs.
    /// </summary>
    public class ServerAccessLogging
    {
        private static IConfiguration _configuration = null!;

        public static async Task Main()
        {
            LoadConfig();

            string bucketName = _configuration["BucketName"];
            string logBucketName = _configuration["LogBucketName"];
            string logObjectKeyPrefix = _configuration["LogObjectKeyPrefix"];
            string accountId = _configuration["AccountId"];

            // If the AWS Region defined for your default user is different
            // from the Region where your Amazon S3 bucket is located,
            // pass the Region name to the Amazon S3 client object's constructor.
            // For example: RegionEndpoint.USWest2 or RegionEndpoint.USEast2.
            IAmazonS3 client = new AmazonS3Client();

            try
            {
                // Update bucket policy for target bucket to allow delivery of logs to it.
                await SetBucketPolicyToAllowLogDelivery(
                    client,
                    bucketName,
                    logBucketName,
                    logObjectKeyPrefix,
                    accountId);

                // Enable logging on the source bucket.
                await EnableLoggingAsync(
                    client,
                    bucketName,
                    logBucketName,
                    logObjectKeyPrefix);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine($"Error: {e.Message}");
            }
        }

        /// <summary>
        /// This method grants appropriate permissions for logging to the
        /// Amazon S3 bucket where the logs will be stored.
        /// </summary>
        /// <param name="client">The initialized Amazon S3 client which will be used
        /// to apply the bucket policy.</param>
        /// <param name="sourceBucketName">The name of the source bucket.</param>
        /// <param name="logBucketName">The name of the bucket where logging
        /// information will be stored.</param>
        /// <param name="logPrefix">The logging prefix where the logs should be delivered.</param>
        /// <param name="accountId">The account id of the account where the source bucket exists.</param>
        /// <returns>Async task.</returns>
        public static async Task SetBucketPolicyToAllowLogDelivery(
            IAmazonS3 client,
            string sourceBucketName,
            string logBucketName,
            string logPrefix,
            string accountId)
        {
            var resourceArn = @"""arn:aws:s3:::" + logBucketName + "/" + logPrefix + @"*""";

            var newPolicy = @"{
                                ""Statement"":[{
                                ""Sid"": ""S3ServerAccessLogsPolicy"",
                                ""Effect"": ""Allow"",
                                ""Principal"": { ""Service"": ""logging.s3.amazonaws.com"" },
                                ""Action"": [""s3:PutObject""],
                                ""Resource"": [" + resourceArn + @"],
                                ""Condition"": {
                                ""ArnLike"": { ""aws:SourceArn"": ""arn:aws:s3:::" + sourceBucketName + @""" },
                                ""StringEquals"": { ""aws:SourceAccount"": """ + accountId + @""" }
                                        }
                                    }]
                                }";
            Console.WriteLine($"The policy to apply to bucket {logBucketName} to enable logging:");
            Console.WriteLine(newPolicy);

            PutBucketPolicyRequest putRequest = new PutBucketPolicyRequest
            {
                BucketName = logBucketName,
                Policy = newPolicy,
            };
            await client.PutBucketPolicyAsync(putRequest);
            Console.WriteLine("Policy applied.");
        }

        /// <summary>
        /// This method enables logging for an Amazon S3 bucket. Logs will be stored
        /// in the bucket you selected for logging. Selected prefix
        /// will be prepended to each log object.
        /// </summary>
        /// <param name="client">The initialized Amazon S3 client which will be used
        /// to configure and apply logging to the selected Amazon S3 bucket.</param>
        /// <param name="bucketName">The name of the Amazon S3 bucket for which you
        /// wish to enable logging.</param>
        /// <param name="logBucketName">The name of the Amazon S3 bucket where logging
        /// information will be stored.</param>
        /// <param name="logObjectKeyPrefix">The prefix to prepend to each
        /// object key.</param>
        /// <returns>Async task.</returns>
        public static async Task EnableLoggingAsync(
            IAmazonS3 client,
            string bucketName,
            string logBucketName,
            string logObjectKeyPrefix)
        {
            Console.WriteLine($"Enabling logging for bucket {bucketName}.");
            var loggingConfig = new S3BucketLoggingConfig
            {
                TargetBucketName = logBucketName,
                TargetPrefix = logObjectKeyPrefix,
            };

            var putBucketLoggingRequest = new PutBucketLoggingRequest
            {
                BucketName = bucketName,
                LoggingConfig = loggingConfig,
            };
            await client.PutBucketLoggingAsync(putBucketLoggingRequest);
            Console.WriteLine($"Logging enabled.");
        }

        /// <summary>
        /// Loads configuration from settings files.
        /// </summary>
        public static void LoadConfig()
        {
            _configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("settings.json") // Load settings from .json file.
                .AddJsonFile("settings.local.json", true) // Optionally, load local settings.
                .Build();
        }
    }
```
+  API 세부 정보는 *AWS SDK for .NET API 참조*의 [PutBucketLogging](https://docs.aws.amazon.com/goto/DotNetSDKV3/s3-2006-03-01/PutBucketLogging)을 참조하십시오.

------
#### [ Java ]

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.BucketLoggingStatus;
import software.amazon.awssdk.services.s3.model.LoggingEnabled;
import software.amazon.awssdk.services.s3.model.PartitionedPrefix;
import software.amazon.awssdk.services.s3.model.PutBucketLoggingRequest;
import software.amazon.awssdk.services.s3.model.TargetObjectKeyFormat;

// Class to set a bucket policy on a target S3 bucket and enable server access logging on a source S3 bucket.
public class ServerAccessLogging {
    private static S3Client s3Client;

    public static void main(String[] args) {
        String sourceBucketName = "SOURCE-BUCKET";
        String targetBucketName = "TARGET-BUCKET";
        String sourceAccountId = "123456789012";
        String targetPrefix = "logs/";

        // Create S3 Client.
        s3Client = S3Client.builder().
                region(Region.US_EAST_2)
                .build();

        // Set a bucket policy on the target S3 bucket to enable server access logging by granting the
        // logging.s3.amazonaws.com principal permission to use the PutObject operation.
        ServerAccessLogging serverAccessLogging = new ServerAccessLogging();
        serverAccessLogging.setTargetBucketPolicy(sourceAccountId, sourceBucketName, targetBucketName);

        // Enable server access logging on the source S3 bucket.
        serverAccessLogging.enableServerAccessLogging(sourceBucketName, targetBucketName,
                targetPrefix);

    }

    // Function to set a bucket policy on the target S3 bucket to enable server access logging by granting the
    // logging.s3.amazonaws.com principal permission to use the PutObject operation.
    public void setTargetBucketPolicy(String sourceAccountId, String sourceBucketName, String targetBucketName) {
        String policy = "{\n" +
                "    \"Version\": \"2012-10-17\",\n" +
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Sid\": \"S3ServerAccessLogsPolicy\",\n" +
                "            \"Effect\": \"Allow\",\n" +
                "            \"Principal\": {\"Service\": \"logging.s3.amazonaws.com\"},\n" +
                "            \"Action\": [\n" +
                "                \"s3:PutObject\"\n" +
                "            ],\n" +
                "            \"Resource\": \"arn:aws:s3:::" + targetBucketName + "/*\",\n" +
                "            \"Condition\": {\n" +
                "                \"ArnLike\": {\n" +
                "                    \"aws:SourceArn\": \"arn:aws:s3:::" + sourceBucketName + "\"\n" +
                "                },\n" +
                "                \"StringEquals\": {\n" +
                "                    \"aws:SourceAccount\": \"" + sourceAccountId + "\"\n" +
                "                }\n" +
                "            }\n" +
                "        }\n" +
                "    ]\n" +
                "}";
        s3Client.putBucketPolicy(b -> b.bucket(targetBucketName).policy(policy));
    }

    // Function to enable server access logging on the source S3 bucket.
    public void enableServerAccessLogging(String sourceBucketName, String targetBucketName,
            String targetPrefix) {
        TargetObjectKeyFormat targetObjectKeyFormat = TargetObjectKeyFormat.builder()
                .partitionedPrefix(PartitionedPrefix.builder().partitionDateSource("EventTime").build())
                .build();
        LoggingEnabled loggingEnabled = LoggingEnabled.builder()
                .targetBucket(targetBucketName)
                .targetPrefix(targetPrefix)
                .targetObjectKeyFormat(targetObjectKeyFormat)
                .build();
        BucketLoggingStatus bucketLoggingStatus = BucketLoggingStatus.builder()
                .loggingEnabled(loggingEnabled)
                .build();
        s3Client.putBucketLogging(PutBucketLoggingRequest.builder()
                .bucket(sourceBucketName)
                .bucketLoggingStatus(bucketLoggingStatus)
                .build());
    }

}
```

------

### AWS CLI 사용
<a name="enabling-s3-access-logs-for-requests"></a>

S3 버킷이 있는 각 AWS 리전에 전용 로깅 버킷을 생성하는 것이 좋습니다. 그런 다음 해당 S3 버킷에 Amazon S3 액세스 로그를 전송하세요. 자세한 내용과 예제는 *AWS CLI 참조*의 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-logging.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-logging.html) 섹션을 참조하십시오.

대상 버킷이 객체 소유권에 버킷 소유자 강제 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 [PutBucketLogging](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html) 구성에 대상 권한 부여를 포함할 수 없습니다. 로깅 서비스 보안 주체(`logging.s3.amazonaws.com`)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.

**Example - 2개 리전에 걸쳐 5개 버킷으로 액세스 로그 사용 설정**  
이 예제에서는 다음과 같은 다섯 개 버킷이 있습니다.  
+ `amzn-s3-demo-source-bucket-us-east-1`
+ `amzn-s3-demo-source-bucket1-us-east-1`
+ `amzn-s3-demo-source-bucket2-us-east-1`
+ `amzn-s3-demo-bucket1-us-west-2`
+ `amzn-s3-demo-bucket2-us-west-2`
**참고**  
다음 절차의 마지막 단계에서는 로깅 버킷을 생성하고 해당 버킷에서 서버 액세스 로깅을 활성화하는 데 사용할 수 있는 예시 bash 스크립트를 제공합니다. 이러한 스크립트를 사용하려면 다음 절차에 설명된 대로 `policy.json` 및 `logging.json` 파일을 만들어야 합니다.

1. 미국 서부(오리건) 및 미국 동부(버지니아 북부) 리전에 로깅 대상 버킷 두 개를 만들고 다음과 같이 이름을 지정합니다.
   + `amzn-s3-demo-destination-bucket-logs-us-east-1`
   + `amzn-s3-demo-destination-bucket1-logs-us-west-2`

1. 이 단계 후반부에서 다음과 같이 서버 액세스 로깅을 활성화합니다.
   + `amzn-s3-demo-source-bucket-us-east-1`은 접두사가 `amzn-s3-demo-source-bucket-us-east-1`인 S3 버킷 `amzn-s3-demo-destination-bucket-logs-us-east-1`에 로깅합니다.
   + `amzn-s3-demo-source-bucket1-us-east-1`은 접두사가 `amzn-s3-demo-source-bucket1-us-east-1`인 S3 버킷 `amzn-s3-demo-destination-bucket-logs-us-east-1`에 로깅합니다.
   + `amzn-s3-demo-source-bucket2-us-east-1`은 접두사가 `amzn-s3-demo-source-bucket2-us-east-1`인 S3 버킷 `amzn-s3-demo-destination-bucket-logs-us-east-1`에 로깅합니다.
   + `amzn-s3-demo-bucket1-us-west-2`은 접두사가 `amzn-s3-demo-bucket1-us-west-2`인 S3 버킷 `amzn-s3-demo-destination-bucket1-logs-us-west-2`에 로깅합니다.
   + `amzn-s3-demo-bucket2-us-west-2`는 접두사가 `amzn-s3-demo-bucket2-us-west-2`인 S3 버킷 `amzn-s3-demo-destination-bucket1-logs-us-west-2`에 로깅합니다.

1. 대상 로깅 버킷 각각에 대해 버킷 ACL 또는 버킷 정책을 사용하여 서버 액세스 로그 전송에 대한 권한을 부여합니다.**
   + **버킷 정책 업데이트**(권장) - 로깅 서비스 보안 주체에 권한을 부여하려면 다음 `put-bucket-policy` 명령을 사용합니다. `amzn-s3-demo-destination-bucket-logs`를 대상 버킷의 이름으로 바꿉니다.

     ```
     1. aws s3api put-bucket-policy --bucket amzn-s3-demo-destination-bucket-logs --policy file://policy.json
     ```

     `Policy.json`은 다음 버킷 정책이 포함된 현재 폴더의 JSON 문서입니다. 이 버킷 정책을 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다. 다음 정책에서 *`amzn-s3-demo-destination-bucket-logs`*는 서버 액세스 로그가 전송될 대상 버킷이고 `amzn-s3-demo-source-bucket`은 소스 버킷입니다. `SOURCE-ACCOUNT-ID`는 소스 버킷을 소유한 AWS 계정입니다.

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Sid": "S3ServerAccessLogsPolicy",
                 "Effect": "Allow",
                 "Principal": {
                     "Service": "logging.s3.amazonaws.com"
                 },
                 "Action": [
                     "s3:PutObject"
                 ],
                 "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket-logs/*",
                 "Condition": {
                     "ArnLike": {
                         "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
                     },
                     "StringEquals": {
                         "aws:SourceAccount": "SOURCE-ACCOUNT-ID"
                     }
                 }
             }
         ]
     }
     ```

------
   + **버킷 ACL 업데이트** – S3 로그 전달 그룹에 권한을 부여하려면 다음 `put-bucket-acl` 명령을 사용합니다. *`amzn-s3-demo-destination-bucket-logs`*를 대상 버킷의 이름으로 바꾸세요.

     ```
     1. aws s3api put-bucket-acl --bucket amzn-s3-demo-destination-bucket-logs  --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery 
     ```

1. 그런 다음, 아래 세 가지 예시 중 하나를 기반으로 로깅 구성이 포함된 `logging.json` 파일을 생성합니다. `logging.json` 파일을 만든 후 다음 `put-bucket-logging` 명령을 사용하여 로깅 구성을 적용할 수 있습니다. *`amzn-s3-demo-destination-bucket-logs`*를 대상 버킷의 이름으로 바꾸세요.

   ```
   1. aws s3api put-bucket-logging --bucket amzn-s3-demo-destination-bucket-logs --bucket-logging-status file://logging.json 
   ```
**참고**  
이 `put-bucket-logging` 명령을 사용하여 각 대상 버킷에 로깅 구성을 적용하는 대신 다음 단계에서 제공하는 bash 스크립트 중 하나를 사용할 수 있습니다. 이러한 스크립트를 사용하려면 이 절차에 설명된 대로 `policy.json` 및 `logging.json` 파일을 만들어야 합니다.

   `logging.json` 파일은 로깅 구성이 포함된 현재 폴더의 JSON 문서입니다. 대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 로깅 구성에 대상 권한 부여가 포함될 수 없습니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.  
**Example - 대상 권한 부여가 없는 `logging.json`**  

   다음 예시 `logging.json` 파일에는 대상 권한 부여가 없습니다. 따라서 객체 소유권에 대해 버킷 소유자 적용 설정을 사용하는 대상 버킷에 이 구성을 적용할 수 있습니다.

   ```
     {
         "LoggingEnabled": {
             "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
             "TargetPrefix": "amzn-s3-demo-destination-bucket/"
          }
      }
   ```  
**Example - 대상 권한 부여가 있는 `logging.json`**  

   다음 예시 `logging.json` 파일에는 대상 권한 부여가 포함되어 있습니다.

   대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html) 구성에 대상 권한 부여를 포함할 수 없습니다. 자세한 내용은 [로그 전달을 위한 권한](#grant-log-delivery-permissions-general) 섹션을 참조하세요.

   ```
     {
         "LoggingEnabled": {
             "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
             "TargetPrefix": "amzn-s3-demo-destination-bucket/",
             "TargetGrants": [
                  {
                     "Grantee": {
                         "Type": "CanonicalUser",
                         "ID": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
                      },
                     "Permission": "FULL_CONTROL"
                  }
              ]
          }
      }
   ```

**피부여자 값**  
다음과 같은 방법으로 액세스 권한을 할당할 사람(피부여자)을 지정할 수 있습니다(요청 요소 사용).
   + 개인의 ID:

     ```
     {
       "Grantee": {
         "Type": "CanonicalUser",
         "ID": "ID"
       }
     }
     ```
   + URI:

     ```
     {
       "Grantee": {
         "Type": "Group",
         "URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
       }
     }
     ```  
**Example - 로그 객체 키 형식이 S3 이벤트 시간으로 설정된 `logging.json`**  

   다음 `logging.json` 파일은 로그 객체 키 형식을 S3 이벤트 시간으로 변경합니다. 로그 객체 키 형식 설정에 대한 자세한 내용은 [로그 전송을 사용 설정하려면 어떻게 해야 합니까?](ServerLogs.md#server-access-logging-overview) 섹션을 참조하세요.

   ```
     { 
       "LoggingEnabled": {
           "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
           "TargetPrefix": "amzn-s3-demo-destination-bucket/",
           "TargetObjectKeyFormat": { 
               "PartitionedPrefix": { 
                   "PartitionDateSource": "EventTime" 
               }
            }
       }
   }
   ```

1. 다음 bash 스크립트 중 하나를 사용하여 계정의 모든 버킷에 대한 액세스 로깅을 추가합니다. *`amzn-s3-demo-destination-bucket-logs`*를 대상 버킷의 이름으로 바꾸고, `us-west-2`를 버킷이 위치한 리전의 이름으로 바꾸세요.
**참고**  
이 스크립트는 모든 버킷이 동일한 리전에 있는 경우에만 작동합니다. 여러 리전에 버킷이 있는 경우 스크립트를 조정해야 합니다.  
**Example – 버킷 정책으로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가**  

   ```
     loggingBucket='amzn-s3-demo-destination-bucket-logs'
     region='us-west-2'
     
     
     # Create the logging bucket.
     aws s3 mb s3://$loggingBucket --region $region
     
     aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json
     
     # List the buckets in this account.
     buckets="$(aws s3 ls | awk '{print $3}')"
     
     # Put a bucket logging configuration on each bucket.
     for bucket in $buckets
         do 
           # This if statement excludes the logging bucket.
           if [ "$bucket" == "$loggingBucket" ] ; then
               continue;
           fi
           printf '{
             "LoggingEnabled": {
               "TargetBucket": "%s",
               "TargetPrefix": "%s/"
           }
         }' "$loggingBucket" "$bucket"  > logging.json
         aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json
         echo "$bucket done"
     done
     
     rm logging.json
     
     echo "Complete"
   ```  
**Example – 버킷 ACL로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가**  

   ```
     loggingBucket='amzn-s3-demo-destination-bucket-logs'
     region='us-west-2'
     
     
     # Create the logging bucket.
     aws s3 mb s3://$loggingBucket --region $region
     
     aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
     
     # List the buckets in this account.
     buckets="$(aws s3 ls | awk '{print $3}')"
     
     # Put a bucket logging configuration on each bucket.
     for bucket in $buckets
         do 
           # This if statement excludes the logging bucket.
           if [ "$bucket" == "$loggingBucket" ] ; then
               continue;
           fi
           printf '{
             "LoggingEnabled": {
               "TargetBucket": "%s",
               "TargetPrefix": "%s/"
           }
         }' "$loggingBucket" "$bucket"  > logging.json
         aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json
         echo "$bucket done"
     done
     
     rm logging.json
     
     echo "Complete"
   ```

## 서버 액세스 로그 설정 확인
<a name="verify-access-logs"></a>

서버 액세스 로깅을 활성화한 후 다음 단계를 완료합니다.
+ 대상 버킷에 액세스하여 로그 파일이 전송되고 있는지 확인합니다. 액세스 로그가 설정되면 Amazon S3는 즉시 요청 캡처 및 로깅을 시작합니다. 하지만 로그가 대상 버킷으로 전송되려면 몇 시간이 소요될 수 있습니다. 자세한 내용은 [버킷 로깅 상태 변경 시 일정 기간에 걸쳐 단계적으로 반영됨](ServerLogs.md#BucketLoggingStatusChanges) 및 [서버 로그 전송이 항상 보장되지는 않음](ServerLogs.md#LogDeliveryBestEffort)(을)를 참조하세요.

  또한 Amazon S3 요청 지표를 사용하고 이러한 지표에 대한 Amazon CloudWatch 경보를 설정하여 로그 전달을 자동으로 확인할 수 있습니다. 자세한 내용은 [Amazon CloudWatch를 사용한 지표 모니터링](cloudwatch-monitoring.md) 섹션을 참조하세요.
+ 로그 파일의 내용을 열고 읽을 수 있는지 확인합니다.

서버 액세스 로깅 문제 해결 정보는 [서버 액세스 로깅 문제 해결](troubleshooting-server-access-logging.md) 섹션을 참조하십시오.

# Amazon S3 서버 액세스 로그 형식
<a name="LogFormat"></a>

서버 액세스 로깅은 Amazon S3 버킷에 수행된 요청에 대한 상세 레코드를 제공합니다. 서버 액세스 로그는 다음과 같은 목적으로 사용 가능합니다.
+ 보안 및 액세스 감사 수행
+ 고객층 조사
+ Amazon S3 청구서 이해

이 섹션에서는 Amazon S3 서버 액세스 로그 파일에 대한 형식과 기타 세부 정보를 설명합니다.

서버 액세스 로그 파일은 줄 바꿈으로 구분되는 로그 레코드의 시퀀스로 구성됩니다. 각 로그 레코드는 하나의 요청을 표시하며 공백으로 구분된 필드로 구성됩니다.

다음은 5개 로그 레코드로 구성된 로그 예제입니다.

**참고**  
아무 필드나 `-`로 설정하여 데이터를 알 수 없거나 사용할 수 없음 또는 해당 필드에 이 요청이 적용되지 않음을 표시할 수 있습니다.

```
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be amzn-s3-demo-bucket1 [06/Feb/2019:00:00:38 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be 3E57427F3EXAMPLE REST.GET.VERSIONING - "GET /amzn-s3-demo-bucket1?versioning HTTP/1.1" 200 - 113 - 7 - "-" "S3Console/0.4" - s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader amzn-s3-demo-bucket1.s3.us-west-1.amazonaws.com TLSV1.2 arn:aws:s3:us-west-1:123456789012:accesspoint/example-AP Yes us-east-1
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be amzn-s3-demo-bucket1 [06/Feb/2019:00:00:38 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be 891CE47D2EXAMPLE REST.GET.LOGGING_STATUS - "GET /amzn-s3-demo-bucket1?logging HTTP/1.1" 200 - 242 - 11 - "-" "S3Console/0.4" - 9vKBE6vMhrNiWHZmb2L0mXOcqPGzQOI5XLnCtZNPxev+Hf+7tpT6sxDwDty4LHBUOZJG96N1234= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader amzn-s3-demo-bucket1.s3.us-west-1.amazonaws.com TLSV1.2 - - us-east-1
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be amzn-s3-demo-bucket1 [06/Feb/2019:00:00:38 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be A1206F460EXAMPLE REST.GET.BUCKETPOLICY - "GET /amzn-s3-demo-bucket1?policy HTTP/1.1" 404 NoSuchBucketPolicy 297 - 38 - "-" "S3Console/0.4" - BNaBsXZQQDbssi6xMBdBU2sLt+Yf5kZDmeBUP35sFoKa3sLLeMC78iwEIWxs99CRUrbS4n11234= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader amzn-s3-demo-bucket1.s3.us-west-1.amazonaws.com TLSV1.2 - Yes us-east-1
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be amzn-s3-demo-bucket1 [06/Feb/2019:00:01:00 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be 7B4A0FABBEXAMPLE REST.GET.VERSIONING - "GET /amzn-s3-demo-bucket1?versioning HTTP/1.1" 200 - 113 - 33 - "-" "S3Console/0.4" - Ke1bUcazaN1jWuUlPJaxF64cQVpUEhoZKEG/hmy/gijN/I1DeWqDfFvnpybfEseEME/u7ME1234= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader amzn-s3-demo-bucket1.s3.us-west-1.amazonaws.com TLSV1.2 - - us-east-1
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be amzn-s3-demo-bucket1 [06/Feb/2019:00:01:57 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be DD6CC733AEXAMPLE REST.PUT.OBJECT s3-dg.pdf "PUT /amzn-s3-demo-bucket1/s3-dg.pdf HTTP/1.1" 200 - - 4406583 41754 28 "-" "S3Console/0.4" - 10S62Zv81kBW7BB6SX4XJ48o6kpcl6LPwEoizZQQxJd5qDSCTLX0TgS37kYUBKQW3+bPdrg1234= SigV4 ECDHE-RSA-AES128-SHA AuthHeader amzn-s3-demo-bucket1.s3.us-west-1.amazonaws.com TLSV1.2 - Yes us-east-1
```

다음은 **체크섬 계산** 작업에 대한 예제 로그 레코드입니다.

```
7cd47ef2be amzn-s3-demo-bucket [06/Feb/2019:00:00:38 +0000] - 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be e5042925-b524-4b3b-a869-f3881e78ff3a S3.COMPUTE.OBJECT.CHECKSUM example-object - - - - 1048576 - - - - - bPf7qjG4XwYdPgDQTl72GW/uotRhdPz2UryEyAFLDSRmKrakUkJCYLtAw6fdANcrsUYc1M/kIulXM1u5vZQT5g== - - - - - - - -
```

**Topics**
+ [로그 레코드 필드](#log-record-fields)
+ [복사 작업을 위한 추가 로깅](#AdditionalLoggingforCopyOperations)
+ [사용자 지정 액세스 로그 정보](#LogFormatCustom)
+ [확장 가능한 서버 액세스 로그 형식에 대한 프로그래밍 고려 사항](#LogFormatExtensible)

## 로그 레코드 필드
<a name="log-record-fields"></a>

다음 목록에서는 로그 레코드 필드에 대해 설명합니다.

**버킷 소유자**  
원본 버킷의 정식 사용자 ID입니다. 정식 사용자 ID는 또 다른 형식의 AWS 계정 ID입니다. 정식 사용자 ID에 대한 자세한 내용은 **AWS 일반 참조에서 [AWS 계정 식별자](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)를 참조하십시오. 계정의 정식 사용자 ID를 찾는 방법에 대한 자세한 내용은 [AWS 계정에 대한 정식 사용자 ID 찾기](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId)를 참조하십시오.  
**입력 예**  

```
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be
```

**버킷**  
요청이 처리된 버킷의 이름. 시스템이 잘못된 양식의 요청을 수신하여 버킷을 결정할 수 없을 경우 해당 요청이 어떤 서버 액세스 로그에도 표시되지 않습니다.  
**입력 예**  

```
amzn-s3-demo-bucket1
```

**시간**  
요청이 수신된 시간입니다. 이 날짜 및 시간은 협정 세계시(UTC)로 표시됩니다. `strftime()` 용어를 사용하는 형식은 `[%d/%b/%Y:%H:%M:%S %z]`입니다.  
**입력 예**  

```
[06/Feb/2019:00:00:38 +0000]
```

**원격 IP**  
요청자의 명백한 IP 주소. 중간 프록시 및 방화벽이 요청 시스템의 실제 IP 주소를 가릴 수 있습니다.  
**입력 예**  

```
192.0.2.3
```

**요청자**  
요청자의 정식 사용자 ID 또는 인증되지 않은 요청의 `-`입니다. 요청자가 IAM 사용자인 경우 이 필드는 IAM 사용자가 속한 AWS 계정와 함께 요청자의 IAM 사용자 이름을 반환합니다. 이 식별자는 액세스 제어 목적으로 사용되는 것과 동일합니다.  
**입력 예**  

```
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be
```
요청자가 수임된 역할을 사용하는 경우 이 필드는 수임된 IAM 역할을 반환합니다.  
**입력 예**  

```
arn:aws:sts::123456789012:assumed-role/roleName/test-role
```

**요청 ID**  
각 요청을 고유하게 식별하기 위해 Amazon S3에서 생성한 문자열입니다. **체크섬 계산** 작업 요청의 경우 연결된 작업 ID가 **요청 ID** 필드에 표시됩니다. 자세한 내용은 [체크섬 계산](batch-ops-compute-checksums.md) 섹션을 참조하세요.  
**입력 예**  

```
3E57427F33A59F07
```

**작업**  
여기에 나열된 작업은 `SOAP.operation`, `REST.HTTP_method.resource_type`, `WEBSITE.HTTP_method.resource_type` 또는 `BATCH.DELETE.OBJECT`로 선언되거나 `S3.action.resource_type`의 경우 [S3 수명 주기 및 로깅](lifecycle-and-other-bucket-config.md#lifecycle-general-considerations-logging)으로 선언됩니다. [https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-compute-checksums.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-compute-checksums.html) 작업 요청의 경우 작업은 `S3.COMPUTE.OBJECT.CHECKSUM`으로 나열됩니다.  
**입력 예**  

```
REST.PUT.OBJECT
S3.COMPUTE.OBJECT.CHECKSUM
```

**키**  
요청의 키(객체 이름) 부분입니다.  
**입력 예**  

```
/photos/2019/08/puppy.jpg
```

**Request-URI**  
HTTP 요청 메시지의 `Request-URI` 부분. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"GET /amzn-s3-demo-bucket1/photos/2019/08/puppy.jpg?x-foo=bar HTTP/1.1"
```

**HTTP 상태**  
응답의 숫자 HTTP 상태 코드.  
**입력 예**  

```
200
```

**오류 코드**  
Amazon S3 [오류 응답](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html), 오류가 없을 경우 `-`.  
**입력 예**  

```
NoSuchBucket
```

**보낸 바이트**  
HTTP 프로토콜 오버헤드를 제외한 보낸 응답 바이트 수. 영일 경우 `-`.  
**입력 예**  

```
2662992
```

**객체 크기**  
해당 객체의 총 크기.  
**입력 예**  

```
3462992
```

**총 시간**  
서버 관점에서 요청이 플라이트 상태를 유지한 밀리초 단위 시간. 이 값은 요청이 수신된 시간부터 응답의 마지막 바이트가 전송된 시간까지 측정됩니다. 클라이언트 관점의 측정값은 네트워크 지연 시간으로 인해 더 길 수 있습니다.  
**입력 예**  

```
70
```

**반환 시간**  
Amazon S3이 요청을 처리하는 데 소비한 시간(밀리초). 이 값은 요청의 마지막 바이트가 수신된 시간부터 응답의 첫 바이트가 전송된 시간까지 측정됩니다.  
**입력 예**  

```
10
```

**Referer**  
HTTP `Referer` 헤더의 값(있는 경우). HTTP 사용자 에이전트(예: 브라우저)는 일반적으로 이 헤더를 요청 시 연결 또는 포함 페이지의 URL로 설정합니다. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"http://www.example.com/webservices"
```

**User-Agent**  
HTTP `User-Agent` 헤더의 값. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"curl/7.15.1"
```

**버전 ID**  
요청의 버전 ID. 작업이 `versionId` 파라미터를 사용하지 않는 경우 `-`.  
**입력 예**  

```
3HL4kqtJvjVBH40Nrjfkd
```

**호스트 Id**  
`x-amz-id-2` 또는 Amazon S3 확장 요청 ID.  
**입력 예**  

```
s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234=
```

**서명 버전**  
요청을 인증하는 데 사용된 서명 버전, `SigV2` 또는 `SigV4` 또는 인증되지 않은 요청에 대한 `-`.  
**입력 예**  

```
SigV2
```

**암호 그룹**  
HTTPS 요청에 대해 협상된 Transport Layer Security(TLS) 암호 또는 HTTP에 대해 협상된 `-` 암호.  
**입력 예**  

```
ECDHE-RSA-AES128-GCM-SHA256
```

**인증 유형**  
사용된 요청 인증 유형: 인증 헤더의 경우 `AuthHeader`, 쿼리 문자열(사전 서명된 URL)의 경우 `QueryString`, 미인증 요청의 경우 `-`.  
**입력 예**  

```
AuthHeader
```

**호스트 헤더**  
Amazon S3에 연결하는 데 사용된 엔드포인트  
**입력 예**  

```
s3.us-west-2.amazonaws.com
```
일부 초기 리전은 레거시 엔드포인트를 지원합니다. 서버 액세스 로그 또는 AWS CloudTrail 로그에 이러한 엔드포인트가 표시될 수 있습니다. 자세한 내용은 [레거시 엔드포인트](VirtualHosting.md#s3-legacy-endpoints) 섹션을 참조하세요. Amazon S3 리전 및 엔드포인트의 전체 목록은 **Amazon Web Services 일반 참조에서 [Amazon S3 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/s3.html)을 참조하십시오.

**TLS 버전**  
클라이언트가 협상한 TLS(전송 계층 보안) 버전. 값은 `TLSv1.1`, `TLSv1.2`, `TLSv1.3` 또는 `-`(TLS가 사용되지 않은 경우) 중 하나입니다.  
**입력 예**  

```
TLSv1.2
```

**액세스 포인트 ARN**  
요청 액세스 포인트의 Amazon 리소스 이름(ARN) 입니다. 액세스 포인트 ARN의 형식이 잘못되었거나 이를 사용하지 않으면 필드에 `-`가 포함됩니다. 액세스 포인트에 대한 자세한 내용은 [범용 버킷의 Amazon S3 Access Points 사용](using-access-points.md) 섹션을 참조하십시오. ARN에 대한 자세한 내용은 *AWS 참조 안내서*의 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)을 참조하십시오.  
**입력 예**  

```
arn:aws:s3:us-east-1:123456789012:accesspoint/example-AP
```

**aclRequired**  
승인을 위해 요청에 액세스 제어 목록(ACL)이 필요한지 여부를 나타내는 문자열입니다. 승인을 위해 요청에 ACL이 필요한 경우, 문자열은 `Yes` 입니다. ACL이 필요하지 않은 경우 문자열은 `-`입니다. ACL에 대한 자세한 내용은 [ACL(액세스 제어 목록) 개요](acl-overview.md) 섹션을 참조하세요. `aclRequired` 필드를 사용하여 ACL을 비활성화하는 방법에 대한 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 페이지를 참조하십시오.  
**입력 예**  

```
Yes
```

**소스 리전**  
요청이 시작된 AWS 리전입니다. 오리진 리전을 확인할 수 없거나(예: PrivateLink 연결, Direct Connect 연결, 기존 보유 IP 주소 사용(BYOIP) 또는 비 AWS IP 주소) 고객이 설정한 정책 또는 작업(예: 수명 주기 및 체크섬)에 따라 트리거된 작업으로 인해 로그가 생성된 경우 이 필드에 대시(`-`)가 표시됩니다.  
**입력 예**  

```
us-east-1
```

## 복사 작업을 위한 추가 로깅
<a name="AdditionalLoggingforCopyOperations"></a>

복사 작업에는 `GET` 및 `PUT`이 관련됩니다. 그러므로 복사 작업을 수행할 때 2개의 레코드가 로그됩니다. 작업의 `PUT` 부분과 관련된 필드는 이전 표에 설명되어 있습니다. 아래 목록에서는 복사 작업의 `GET` 부분과 관련된 레코드의 필드에 대해 설명합니다.

**버킷 소유자**  
복사 중인 객체가 저장되어 있는 버킷의 정식 사용자 ID입니다. 정식 사용자 ID는 또 다른 형식의 AWS 계정 ID입니다. 정식 사용자 ID에 대한 자세한 내용은 **AWS 일반 참조에서 [AWS 계정 식별자](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)를 참조하십시오. 계정의 정식 사용자 ID를 찾는 방법에 대한 자세한 내용은 [AWS 계정에 대한 정식 사용자 ID 찾기](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId)를 참조하십시오.  
**입력 예**  

```
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be
```

**버킷**  
복사 중인 객체가 저장되어 있는 버킷의 이름.  
**입력 예**  

```
amzn-s3-demo-bucket1
```

**시간**  
요청이 수신된 시간입니다. 이 날짜 및 시간은 협정 세계시(UTC)로 표시됩니다. `strftime()` 용어를 사용하는 형식은 `[%d/%B/%Y:%H:%M:%S %z]`입니다.  
**입력 예**  

```
[06/Feb/2019:00:00:38 +0000]
```

**원격 IP**  
요청자의 명백한 IP 주소. 중간 프록시 및 방화벽이 요청 시스템의 실제 IP 주소를 가릴 수 있습니다.  
**입력 예**  

```
192.0.2.3
```

**요청자**  
요청자의 정식 사용자 ID 또는 인증되지 않은 요청의 `-`입니다. 요청자가 IAM 사용자인 경우 이 필드는 IAM 사용자가 속한 AWS 계정 루트 사용자와 함께 요청자의 IAM 사용자 이름을 반환합니다. 이 식별자는 액세스 제어 목적으로 사용되는 것과 동일합니다.  
**입력 예**  

```
79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be
```
요청자가 수임된 역할을 사용하는 경우 이 필드는 수임된 IAM 역할을 반환합니다.  
**입력 예**  

```
arn:aws:sts::123456789012:assumed-role/roleName/test-role
```

**요청 ID**  
각 요청을 고유하게 식별하기 위해 Amazon S3에서 생성한 문자열입니다. **체크섬 계산** 작업 요청의 경우 연결된 작업 ID가 **요청 ID** 필드에 표시됩니다. 자세한 내용은 [체크섬 계산](batch-ops-compute-checksums.md) 섹션을 참조하세요.  
**입력 예**  

```
3E57427F33A59F07
```

**작업**  
여기에 나열된 작업은 `SOAP.operation`, `REST.HTTP_method.resource_type`, `WEBSITE.HTTP_method.resource_type` 또는 `BATCH.DELETE.OBJECT`로 선언됩니다.  
**입력 예**  

```
REST.COPY.OBJECT_GET
```

**키**  
복사 중인 객체의 키(객체 이름). 작업에 키 파라미터가 없을 경우 `-`.  
**입력 예**  

```
/photos/2019/08/puppy.jpg
```

**Request-URI**  
HTTP 요청 메시지의 `Request-URI` 부분. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"GET /amzn-s3-demo-bucket1/photos/2019/08/puppy.jpg?x-foo=bar"
```

**HTTP 상태**  
복사 작업 `GET` 부분의 숫자 HTTP 상태 코드.  
**입력 예**  

```
200
```

**오류 코드**  
복사 작업 `GET` 부분의 Amazon S3 [오류 응답](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html), 오류가 없을 경우 `-`.  
**입력 예**  

```
NoSuchBucket
```

**보낸 바이트**  
HTTP 프로토콜 오버헤드를 제외한 보낸 응답 바이트 수. 영일 경우 `-`.  
**입력 예**  

```
2662992
```

**객체 크기**  
해당 객체의 총 크기.  
**입력 예**  

```
3462992
```

**총 시간**  
서버 관점에서 요청이 플라이트 상태를 유지한 밀리초 단위 시간. 이 값은 요청이 수신된 시간부터 응답의 마지막 바이트가 전송된 시간까지 측정됩니다. 클라이언트 관점의 측정값은 네트워크 지연 시간으로 인해 더 길 수 있습니다.  
**입력 예**  

```
70
```

**반환 시간**  
Amazon S3이 요청을 처리하는 데 소비한 시간(밀리초). 이 값은 요청의 마지막 바이트가 수신된 시간부터 응답의 첫 바이트가 전송된 시간까지 측정됩니다.  
**입력 예**  

```
10
```

**Referer**  
HTTP `Referer` 헤더의 값(있는 경우). HTTP 사용자 에이전트(예: 브라우저)는 일반적으로 이 헤더를 요청 시 연결 또는 포함 페이지의 URL로 설정합니다. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"http://www.example.com/webservices"
```

**User-Agent**  
HTTP `User-Agent` 헤더의 값. 이 필드에는 사용자 입력의 이스케이프 처리되지 않은 따옴표가 포함될 수 있습니다.  
**입력 예**  

```
"curl/7.15.1"
```

**버전 ID**  
복사 중인 객체의 버전 ID. `x-amz-copy-source` 헤더가 복사 소스의 일부로 `versionId` 파라미터를 지정하지 않은 경우 `-`.  
**입력 예**  

```
3HL4kqtJvjVBH40Nrjfkd
```

**호스트 Id**  
`x-amz-id-2` 또는 Amazon S3 확장 요청 ID.  
**입력 예**  

```
s9lzHYrFp76ZVxRcpX9+5cjAnEH2ROuNkd2BHfIa6UkFVdtjf5mKR3/eTPFvsiP/XV/VLi31234=
```

**서명 버전**  
요청을 인증하는 데 사용된 서명 버전, `SigV2` 또는 `SigV4`. 미인증 요청의 경우 `-`.  
**입력 예**  

```
SigV4
```

**암호 그룹**  
HTTPS 요청에 대해 협상된 Transport Layer Security(TLS) 암호 또는 HTTP에 대해 협상된 `-` 암호.  
**입력 예**  

```
ECDHE-RSA-AES128-GCM-SHA256
```

**인증 유형**  
사용된 요청 인증 유형: 인증 헤더의 경우 `AuthHeader`, 쿼리 문자열(사전 서명된 URL)의 경우 `QueryString`, 미인증 요청의 경우 `-`.  
**입력 예**  

```
AuthHeader
```

**호스트 헤더**  
Amazon S3에 연결하는 데 사용된 엔드포인트.  
**입력 예**  

```
s3.us-west-2.amazonaws.com
```
일부 초기 리전은 레거시 엔드포인트를 지원합니다. 서버 액세스 로그 또는 AWS CloudTrail 로그에 이러한 엔드포인트가 표시될 수 있습니다. 자세한 내용은 [레거시 엔드포인트](VirtualHosting.md#s3-legacy-endpoints) 섹션을 참조하세요. Amazon S3 리전 및 엔드포인트의 전체 목록은 **Amazon Web Services 일반 참조에서 [Amazon S3 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/s3.html)을 참조하십시오.

**TLS 버전**  
클라이언트가 협상한 TLS(전송 계층 보안) 버전. 값은 `TLSv1.1`, `TLSv1.2`, `TLSv1.3` 또는 `-`(TLS가 사용되지 않은 경우) 중 하나입니다.  
**입력 예**  

```
TLSv1.2
```

**액세스 포인트 ARN**  
요청 액세스 포인트의 Amazon 리소스 이름(ARN) 입니다. 액세스 포인트 ARN의 형식이 잘못되었거나 이를 사용하지 않으면 필드에 `-`가 포함됩니다. 액세스 포인트에 대한 자세한 내용은 [범용 버킷의 Amazon S3 Access Points 사용](using-access-points.md) 섹션을 참조하십시오. ARN에 대한 자세한 내용은 *AWS 참조 안내서*의 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)을 참조하십시오.  
**입력 예**  

```
arn:aws:s3:us-east-1:123456789012:accesspoint/example-AP
```

**aclRequired**  
승인을 위해 요청에 액세스 제어 목록(ACL)이 필요한지 여부를 나타내는 문자열입니다. 승인을 위해 요청에 ACL이 필요한 경우, 문자열은 `Yes` 입니다. ACL이 필요하지 않은 경우 문자열은 `-`입니다. ACL에 대한 자세한 내용은 [ACL(액세스 제어 목록) 개요](acl-overview.md) 섹션을 참조하세요. `aclRequired` 필드를 사용하여 ACL을 비활성화하는 방법에 대한 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 페이지를 참조하십시오.  
**입력 예**  

```
Yes
```

**소스 리전**  
요청이 시작된 AWS 리전입니다. 오리진 리전을 확인할 수 없거나(예: PrivateLink 연결, Direct Connect 연결, 기존 보유 IP 주소 사용(BYOIP) 또는 비 AWS IP 주소) 고객이 설정한 정책 또는 작업(예: 수명 주기 및 체크섬)에 따라 트리거된 작업으로 인해 로그가 생성된 경우 이 필드에 대시(`-`)가 표시됩니다.  
**입력 예**  

```
us-east-1
```

## 사용자 지정 액세스 로그 정보
<a name="LogFormatCustom"></a>

요청에 대한 액세스 로그 레코드에 저장할 사용자 지정 정보를 포함할 수 있습니다. 이렇게 하려면 요청의 URL에 사용자 지정 쿼리 문자열 파라미터를 추가합니다. Amazon S3은 `x-`로 시작하는 쿼리 문자열 파라미터를 무시하지만 해당 파라미터를 요청에 대한 액세스 로그 레코드에 로그 레코드 `Request-URI` 필드의 일부로 포함시킵니다.

예를 들어 `GET`에 대한 `"s3.amazonaws.com/amzn-s3-demo-bucket1/photos/2019/08/puppy.jpg?x-user=johndoe"` 요청은 관련 로그 레코드의 `"s3.amazonaws.com/amzn-s3-demo-bucket1/photos/2019/08/puppy.jpg"` 필드에 `"x-user=johndoe"` 문자열이 포함된다는 점을 제외하고 `Request-URI`에 대한 요청과 동일하게 작동합니다. 이 기능은 REST 인터페이스에서만 사용할 수 있습니다.

## 확장 가능한 서버 액세스 로그 형식에 대한 프로그래밍 고려 사항
<a name="LogFormatExtensible"></a>

때때로 각 줄의 끝에 새로운 필드를 추가하여 액세스 로그 레코드 형식을 확장할 수 있습니다. 따라서, 서버 액세스 로그를 파싱하여 이해되지 못할 수 있는 후행 필드를 처리하는 코드를 작성해야 합니다.

# Amazon S3 로그 파일 삭제
<a name="deleting-log-files-lifecycle"></a>

시간이 지나면 서버 액세스 로깅이 사용 설정된 Amazon S3 버킷에 수많은 서버 로그 객체가 누적될 수 있습니다. 생성 후 일정 기간 동안 애플리케이션에 이 액세스 로그가 필요할 수 있지만, 이후 더 이상 필요가 없어지면 삭제하는 것이 좋습니다. Amazon S3 수명 주기 구성을 사용하여 Amazon S3가 자동으로 수명이 끝난 이러한 객체를 삭제하도록 규칙을 설정할 수 있습니다.

공유 접두사를 사용하여 버킷의 일부 객체에 대해 수명 주기 구성을 정의할 수 있습니다. 서버 액세스 로깅 구성에 접두사를 지정한 경우 해당 접두사를 가진 로그 객체를 삭제하도록 수명 주기 구성 규칙을 설정할 수 있습니다.

예를 들어, 로그 객체에 `logs/` 접두사가 있다고 가정해 보세요. 지정된 기간이 지난 후 접두사가 `logs/`인 모든 객체를 버킷에서 삭제하도록 수명 주기 구성 규칙을 설정할 수 있습니다.

수명 주기 구성에 대한 자세한 내용은 [객체 수명 주기 관리](object-lifecycle-mgmt.md) 섹션을 참조하십시오.

서버 액세스 로깅에 대한 자세한 내용은 [서버 액세스 로깅을 사용한 요청 로깅](ServerLogs.md) 섹션을 참조하십시오.

# Amazon S3 서버 액세스 로그를 사용하여 요청 식별
<a name="using-s3-access-logs-to-identify-requests"></a>

Amazon S3 서버 액세스 로그를 사용하여 Amazon S3 요청을 식별할 수 있습니다.

**참고**  
Amazon S3 요청을 식별하려면 Amazon S3 서버 액세스 로그 대신 AWS CloudTrail 데이터 이벤트를 사용하는 것이 좋습니다. CloudTrail 데이터 이벤트는 더 쉽게 설정할 수 있으며 더 많은 정보를 포함합니다. 자세한 내용은 [CloudTrail을 사용하여 Amazon S3 요청 식별](cloudtrail-request-identification.md) 섹션을 참조하세요.
받는 액세스 요청의 수에 따라 CloudTrail 데이터 이벤트를 사용하는 것보다 로그를 분석하는 데 더 많은 리소스 또는 시간이 필요할 수 있습니다.

**Topics**
+ [Amazon Athena를 사용하여 요청에 대한 액세스 로그 쿼리](#querying-s3-access-logs-for-requests)
+ [Amazon S3 액세스 로그를 사용하여 Signature Version 2 요청 식별](#using-s3-access-logs-to-identify-sigv2-requests)
+ [Amazon S3 액세스 로그를 사용하여 객체 액세스 요청 식별](#using-s3-access-logs-to-identify-objects-access)

## Amazon Athena를 사용하여 요청에 대한 액세스 로그 쿼리
<a name="querying-s3-access-logs-for-requests"></a>

Amazon Athena를 사용하여 Amazon S3 액세스 로그로 Amazon S3 요청을 식별할 수 있습니다.

Amazon S3에서는 서버 액세스 로그를 S3 버킷에 객체로 저장합니다. Amazon S3의 로그를 분석할 수 있는 도구를 사용하는 것이 보통 더 쉽습니다. Athena는 S3 객체 분석을 지원하며 Amazon S3 액세스 로그를 쿼리하는 데 사용할 수 있습니다.

**Example**  
다음 예에서는 Amazon Athena에서 Amazon S3 서버 액세스 로그를 쿼리하는 방법을 보여 줍니다. 다음 예시에 사용된 `user input placeholders`를 실제 정보로 바꾸세요.  
Athena 쿼리에서 Amazon S3 위치를 지정하려면 로그가 전송되는 버킷 이름에 대한 S3 URI를 제공해야 합니다. 이 URI에는 버킷 이름과 접두사가 `s3://amzn-s3-demo-bucket1-logs/prefix/` 형식으로 포함되어야 합니다.

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. 쿼리 편집기에서 다음과 유사한 명령을 실행합니다. `s3_access_logs_db`를 데이터베이스에 부여하려는 이름으로 바꿉니다.

   ```
   CREATE DATABASE s3_access_logs_db
   ```
**참고**  
S3 버킷과 동일한 AWS 리전에 데이터베이스를 생성하는 것이 가장 좋습니다.

1. 쿼리 편집기에서 다음과 비슷한 명령을 실행하여 2단계에서 만든 데이터베이스에 테이블 스키마를 생성합니다. `s3_access_logs_db.mybucket_logs`를 테이블에 부여하려는 이름으로 바꿉니다. `STRING` 및 `BIGINT` 데이터 형식 값이 액세스 로그 속성입니다. Athena에서 이 속성을 쿼리할 수 있습니다. `LOCATION`의 경우 앞서 설명한 대로 S3 버킷 및 접두사 경로를 입력하세요.

------
#### [ Date-based partitioning ]

   ```
   CREATE EXTERNAL TABLE s3_access_logs_db.mybucket_logs( 
    `bucketowner` STRING, 
    `bucket_name` STRING, 
    `requestdatetime` STRING, 
    `remoteip` STRING, 
    `requester` STRING, 
    `requestid` STRING, 
    `operation` STRING, 
    `key` STRING, 
    `request_uri` STRING, 
    `httpstatus` STRING, 
    `errorcode` STRING, 
    `bytessent` BIGINT, 
    `objectsize` BIGINT, 
    `totaltime` STRING, 
    `turnaroundtime` STRING, 
    `referrer` STRING, 
    `useragent` STRING, 
    `versionid` STRING, 
    `hostid` STRING, 
    `sigv` STRING, 
    `ciphersuite` STRING, 
    `authtype` STRING, 
    `endpoint` STRING, 
    `tlsversion` STRING,
    `accesspointarn` STRING,
    `aclrequired` STRING,
    `sourceregion` STRING)
    PARTITIONED BY (
      `timestamp` string)
   ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.RegexSerDe' 
   WITH SERDEPROPERTIES ( 
    'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') 
   STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
   OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
    's3://bucket-name/prefix-name/account-id/region/source-bucket-name/'
    TBLPROPERTIES (
     'projection.enabled'='true', 
     'projection.timestamp.format'='yyyy/MM/dd', 
     'projection.timestamp.interval'='1', 
     'projection.timestamp.interval.unit'='DAYS', 
     'projection.timestamp.range'='2024/01/01,NOW', 
     'projection.timestamp.type'='date', 
     'storage.location.template'='s3://bucket-name/prefix-name/account-id/region/source-bucket-name/${timestamp}')
   ```

------
#### [ Non-date-based partitioning ]

   ```
   CREATE EXTERNAL TABLE `s3_access_logs_db.mybucket_logs`(
     `bucketowner` STRING, 
     `bucket_name` STRING, 
     `requestdatetime` STRING, 
     `remoteip` STRING, 
     `requester` STRING, 
     `requestid` STRING, 
     `operation` STRING, 
     `key` STRING, 
     `request_uri` STRING, 
     `httpstatus` STRING, 
     `errorcode` STRING, 
     `bytessent` BIGINT, 
     `objectsize` BIGINT, 
     `totaltime` STRING, 
     `turnaroundtime` STRING, 
     `referrer` STRING, 
     `useragent` STRING, 
     `versionid` STRING, 
     `hostid` STRING, 
     `sigv` STRING, 
     `ciphersuite` STRING, 
     `authtype` STRING, 
     `endpoint` STRING, 
     `tlsversion` STRING,
     `accesspointarn` STRING,
     `aclrequired` STRING,
     `sourceregion` STRING)
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.serde2.RegexSerDe' 
   WITH SERDEPROPERTIES ( 
     'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.mapred.TextInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket1-logs/prefix/'
   ```

------

1. 탐색 창의 **데이터베이스** 아래에서 데이터베이스를 선택하세요.

1. **테이블**에서 테이블 이름 옆의 **Preview table(테이블 미리보기)**을 선택하세요.

   **결과** 창에 `bucketowner`, `bucket`, `requestdatetime` 등 서버 액세스 로그의 데이터가 표시됩니다. 즉, Athena 테이블이 만들어졌다는 뜻입니다. 이제 Amazon S3 서버 액세스 로그를 쿼리할 수 있습니다.

**Example - 객체를 삭제한 사람과 시기 표시(타임스탬프, IP 주소 및 IAM 사용자)**  

```
SELECT requestdatetime, remoteip, requester, key 
FROM s3_access_logs_db.mybucket_logs 
WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
```

**Example - IAM 사용자가 수행한 모든 작업 표시**  

```
SELECT * 
FROM s3_access_logs_db.mybucket_logs 
WHERE requester='arn:aws:iam::123456789123:user/user_name';
```

**Example - 특정 기간에 객체에 수행한 모든 작업 표시**  

```
SELECT *
FROM s3_access_logs_db.mybucket_logs
WHERE Key='prefix/images/picture.jpg' 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');
```

**Example - 특정 기간에 특정 IP 주소로 전송한 데이터의 양 표시**  

```
SELECT coalesce(SUM(bytessent), 0) AS bytessenttotal
FROM s3_access_logs_db.mybucket_logs
WHERE remoteip='192.0.2.1'
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2022-06-01','yyyy-MM-dd')
AND parse_datetime('2022-07-01','yyyy-MM-dd');
```

**Example - 특정 기간의 HTTP 5xx 오류에 대한 요청 ID 찾기**  

```
SELECT requestdatetime, key, httpstatus, errorcode, requestid, hostid 
FROM s3_access_logs_db.mybucket_logs
WHERE httpstatus like '5%' AND timestamp
BETWEEN '2024/01/29'
AND '2024/01/30'
```

**참고**  
로그를 보존하는 시간을 줄이려면 서버 액세스 로그 버킷에 대해 S3 수명 주기 구성을 생성할 수 있습니다. 주기적으로 로그 파일을 제거하는 수명 주기 구성 규칙을 생성합니다. 그러면 Athena에서 쿼리마다 분석하는 데이터의 양이 줄어듭니다. 자세한 내용은 [버킷에서 S3 수명 주기 구성 설정](how-to-set-lifecycle-configuration-intro.md) 섹션을 참조하세요.

## Amazon S3 액세스 로그를 사용하여 Signature Version 2 요청 식별
<a name="using-s3-access-logs-to-identify-sigv2-requests"></a>

서명 버전 2에 대한 Amazon S3 지원이 비활성화됩니다(사용되지 않음). 그 이후 Amazon S3는 더 이상 서명 버전 2를 사용하는 요청을 수락하지 않으며 모든 요청은 서명 버전 4 서명을 사용해야 합니다. Amazon S3 액세스 로그를 사용하여 Signature Version 2 액세스 요청을 식별할 수 있습니다.

**참고**  
Signature Version 2 요청을 식별하려면 Amazon S3 서버 액세스 로그 대신 AWS CloudTrail 데이터 이벤트를 사용하는 것이 좋습니다. CloudTrail 데이터 이벤트는 서버 액세스 로그보다 더 쉽게 설정할 수 있으며 더 많은 정보를 포함합니다. 자세한 내용은 [CloudTrail을 사용하여 Amazon S3 서명 버전 2 요청 식별](cloudtrail-request-identification.md#cloudtrail-identification-sigv2-requests) 섹션을 참조하세요.

**Example - 서명 버전 2 트래픽을 보내는 모든 요청자 표시**  

```
SELECT requester, sigv, Count(sigv) as sigcount 
FROM s3_access_logs_db.mybucket_logs
GROUP BY requester, sigv;
```

## Amazon S3 액세스 로그를 사용하여 객체 액세스 요청 식별
<a name="using-s3-access-logs-to-identify-objects-access"></a>

Amazon S3 서버 액세스 로그에 대한 쿼리를 사용하여 `GET`, `PUT`, `DELETE` 등의 작업에 대해 Amazon S3 객체 액세스 요청을 식별하고 그러한 요청에 대한 추가 정보를 검색할 수 있습니다.

다음 Amazon Athena 쿼리 예시에서는 서버 액세스 로그에서 Amazon S3에 대한 모든 `PUT` 객체 요청을 가져오는 방법을 보여줍니다.

**Example - 특정 기간에 `PUT` 객체 요청을 보내는 모든 요청자 표시**  

```
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.PUT.OBJECT' 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2019-07-01:00:42:42',yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

다음 Amazon Athena 쿼리 예제에서는 서버 액세스 로그에서 Amazon S3에 대한 모든 `GET` 객체 요청을 가져오는 방법을 보여 줍니다.

**Example - 특정 기간에 `GET` 객체 요청을 보내는 모든 요청자 표시**  

```
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE operation='REST.GET.OBJECT' 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

다음 Amazon Athena 쿼리 예제에서는 서버 액세스 로그에서 S3 버킷에 대한 모든 익명 요청을 가져오는 방법을 보여 줍니다.

**Example - 특정 기간에 버킷에 요청하는 모든 익명 요청자 표시**  

```
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE requester IS NULL 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
```

다음 Amazon Athena 쿼리에서는 인증을 위해 액세스 제어 목록 (ACL)이 필요한 S3 버킷에 대한 모든 요청을 식별하는 방법을 보여줍니다. 이 정보를 사용하여 해당 ACL 권한을 적절한 버킷 정책으로 마이그레이션하고 ACL을 비활성화할 수 있습니다. 이러한 버킷 정책을 생성한 후에는 해당 버킷에 ACL을 비활성화할 수 있습니다. ACL에 대한 자세한 내용은 [ACL 사용 중지를 위한 사전 조건](object-ownership-migrating-acls-prerequisites.md) 페이지를 참조하십시오.

**Example - 인증을 위해 ACL이 필요한 모든 요청 식별**  

```
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime
FROM s3_access_logs_db.mybucket_logs
WHERE aclrequired = 'Yes' 
AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2022-05-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
AND parse_datetime('2022-08-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
```

**참고**  
필요에 따라 요구에 맞게 날짜 범위를 수정할 수 있습니다.
이 쿼리 예제는 보안 모니터링에도 유용할 수 있습니다. 예상치 못하거나 승인되지 않은 IP 주소 또는 요청자의 `PutObject` 또는 `GetObject` 호출 결과를 검토하고 버킷에 대한 익명 요청을 식별할 수 있습니다.
이 쿼리는 로깅이 사용 설정된 시간부터의 정보만 검색합니다.
AWS CloudTrail 로그를 사용하는 경우, [CloudTrail을 사용하여 S3 객체에 대한 액세스 식별](cloudtrail-request-identification.md#cloudtrail-identification-object-access) 섹션을 참조하세요.

# 서버 액세스 로깅 문제 해결
<a name="troubleshooting-server-access-logging"></a>

다음 주제는 Amazon S3를 사용하여 로깅을 설정할 때 발생할 수 있는 문제를 해결하는 데 도움이 됩니다.

**Topics**
+ [로깅 설정 시 자주 발생하는 오류 메시지](#common-errors)
+ [전달 실패 문제 해결](#delivery-failures)

## 로깅 설정 시 자주 발생하는 오류 메시지
<a name="common-errors"></a>

AWS Command Line Interface(AWS CLI) 및 AWS SDK를 통해 로깅을 활성화할 때 다음과 같은 일반적인 오류 메시지가 나타날 수 있습니다.

오류: 크로스 S3 위치 로깅이 허용되지 않음

대상 버킷이 소스 버킷과 다른 리전에 있는 경우 크로스 S3 위치 로깅이 허용되지 않음 오류가 발생합니다.** 이 오류를 해결하려면 액세스 로그를 수신하도록 구성된 대상 버킷이 소스 버킷과 동일한 AWS 리전 및 AWS 계정에 있어야 합니다.

오류: 로깅할 버킷의 소유자와 대상 버킷이 동일해야 함

서버 액세스 로깅을 활성화할 때 지정된 대상 버킷이 다른 계정에 속할 경우 이 오류가 발생합니다. 이 오류를 해결하려면 대상 버킷이 소스 버킷과 동일한 AWS 계정에 있어야 합니다.

**참고**  
소스 버킷과 다른 대상 버킷을 선택하는 것이 좋습니다. 소스 버킷과 대상 버킷이 동일하면 버킷에 작성되는 로그에 대해 추가 로그가 생성되어 스토리지 요금이 증가할 수 있습니다. 로그에 대한 이러한 추가 로그로 인해 원하는 특정 로그를 찾기가 어려울 수도 있습니다. 로그 관리를 간소화하기 위해서는 액세스 로그를 다른 버킷에 저장하는 것이 좋습니다. 자세한 내용은 [로그 전송을 사용 설정하려면 어떻게 해야 합니까?](ServerLogs.md#server-access-logging-overview) 섹션을 참조하세요.

오류: 로깅을 위한 대상 버킷이 없음

구성을 설정하기 전에 대상 버킷이 있어야 합니다. 이 오류는 대상 버킷이 존재하지 않거나 찾을 수 없음을 나타냅니다. 버킷 이름의 철자가 정확한지 확인한 다음 다시 시도하세요.

오류: 버킷 소유자 적용 버킷에 대상 부여가 허용되지 않음

이 오류는 대상 버킷이 S3 객체 소유권에 대해 버킷 소유자 적용 설정을 사용함을 나타냅니다. 버킷 소유자 적용 설정은 대상 권한 부여를 지원하지 않습니다. 자세한 내용은 [로그 전달을 위한 권한](enable-server-access-logging.md#grant-log-delivery-permissions-general) 섹션을 참조하세요.

## 전달 실패 문제 해결
<a name="delivery-failures"></a>

서버 액세스 로깅 문제를 방지하려면 다음 모범 사례를 따라야 합니다.
+ **S3 로그 전송 그룹에는 대상 버킷에 대한 쓰기 권한이 있어야 함** - S3 로그 전송 그룹은 대상 버킷에 서버 액세스 로그를 전송합니다. 버킷 정책 또는 버킷 액세스 제어 목록(ACL)을 사용하여 대상 버킷에 쓰기 액세스 권한을 부여할 수 있습니다. 그러나 ACL 대신 버킷 정책을 사용하는 것이 좋습니다. 대상 버킷에 액세스 권한을 부여하는 방법에 대한 자세한 내용은 [로그 전달을 위한 권한](enable-server-access-logging.md#grant-log-delivery-permissions-general) 섹션을 참조하세요.
**참고**  
대상 버킷이 객체 소유권에 대해 버킷 소유자 적용 설정을 사용하는 경우 다음 사항에 유의하세요.  
ACL이 비활성화되어 더 이상 권한에 영향을 미치지 않습니다. S3 로그 전달 그룹에 액세스 권한을 부여하도록 버킷 ACL을 업데이트할 수 없다는 뜻입니다. 로깅 서비스 보안 주체에 액세스 권한을 부여하려면 대상 버킷에 대한 버킷 정책을 업데이트해야 합니다.
`PutBucketLogging` 구성에 대상 권한 부여를 포함할 수 없습니다.
+ **대상 버킷의 버킷 정책이 로그에 대한 액세스를 허용해야 함** - 대상 버킷의 버킷 정책을 확인합니다. 버킷 정책에서 `"Effect": "Deny"`를 포함하는 명령문을 검색합니다. 그런 다음, `Deny` 명령문이 액세스 로그가 버킷에 기록되는 것을 막고 있지 않은지 확인합니다.
+ **대상 버킷에서 S3 객체 잠금이 활성화되어 있지 않아야 함** - 대상 버킷에 객체 잠금이 활성화되어 있는지 확인합니다. 오브젝트 잠금은 서버 액세스 로그 전달을 차단합니다. 객체 잠금이 활성화되지 않은 대상 버킷을 선택해야 합니다.
+ **대상 버킷에 기본 암호화가 활성화된 경우 Amazon S3 관리형 키(SSE-S3)를 선택해야 함** - Amazon S3 관리형 키를 통한 서버 측 암호화(SSE-S3)를 사용하는 경우에만 대상 버킷에 기본 버킷 암호화를 사용할 수 있습니다. AWS Key Management Service(AWS KMS) 키를 사용한 기본 서버 측 암호화(SSE-KMS)는 서버 액세스 로깅 대상 버킷에 지원되지 않습니다. 기본 암호화를 활성화하는 방법에 대한 자세한 내용은 [기본 암호화 구성](default-bucket-encryption.md) 섹션을 참조하세요.
+ **대상 버킷에 요청자 지불이 활성화되어 있지 않아야 함** - 서버 액세스 로깅을 위해 요청자 지불 버킷을 대상 버킷으로 사용하는 것은 지원되지 않습니다. 서버 액세스 로그 전송을 허용하려면 대상 버킷에서 요청자 지불 옵션을 비활성화하세요.
+ **AWS Organizations 서비스 제어 정책(SCP) 및 리소스 제어 정책(RCP) 검토** – AWS Organizations를 사용할 때는 서비스 제어 정책과 리소스 제어 정책을 확인하여 Amazon S3 액세스가 허용되는지 확인하세요. 해당 정책은 영향을 받는 계정의 보안 주체 및 리소스에 대한 최대 권한을 지정합니다. 정책에 `"Effect": "Deny"`가 포함된 명령문을 검색하고 `Deny` 명령문이 버킷에 대한 액세스 로그 쓰기를 방해하지 않는지 확인합니다. 자세한 내용은 *AWS Organizations 사용 설명서*에서 [AWS Organizations의 권한 부여 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_authorization_policies.html)을 참조하세요.
+ **최근 로깅 구성 변경 사항이 적용될 때까지 대기** - 서버 액세스 로깅을 처음으로 활성화하거나 로그의 대상 버킷을 변경하는 경우 완전히 적용되려면 시간이 필요합니다. 모든 요청이 제대로 로깅되고 전달되려면 한 시간 이상 걸릴 수 있습니다.

  로그 전달 실패를 확인하려면 Amazon CloudWatch에서 요청 지표를 활성화하세요. 몇 시간 내에 로그가 전송되지 않는 경우 로그 전달 실패를 나타낼 수 있는 `4xxErrors` 지표를 찾아보세요. 요청 지표 활성화에 대한 자세한 내용은 [버킷의 모든 객체에 대한 CloudWatch 지표 구성 생성](configure-request-metrics-bucket.md) 섹션을 참조하세요.