

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Lightsail에서 Amazon Athena를 사용하여 버킷 액세스 로그 분석
<a name="amazon-lightsail-using-bucket-access-logs"></a>

이 안내서에서는 액세스 로그를 사용하여 버킷에 대한 요청을 식별하는 방법을 보여줍니다. 자세한 내용은 [버킷 액세스 로그](amazon-lightsail-bucket-access-logs.md)를 참조하세요.

**목차**
+ [Amazon Athena를 사용하여 요청에 대한 액세스 로그 쿼리](#querying-access-logs-for-requests)
+ [Amazon S3 액세스 로그를 사용하여 객체 액세스 요청 식별](#identifying-object-access-requests)

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

Amazon Athena Athena를 사용하여 액세스 로그에서 버킷에 대한 요청을 쿼리하고 식별할 수 있습니다.

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

**예제**

다음 예에서는 Amazon Athena에서 버킷 서버 액세스 로그를 쿼리할 수 있는 방법을 보여줍니다.

**참고**  
Athena 쿼리에서 버킷 위치를 지정하려면 다음과 같이 로그가 S3 URI로 전달되는 대상 버킷 이름과 대상 접두사의 형식을 지정해야 합니다.`s3://amzn-s3-demo-bucket1-logs/prefix/`

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

1. **쿼리 편집기**에서 다음과 유사한 명령을 실행합니다.

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

1. **쿼리 편집기**에서 다음과 유사한 명령을 실행하여 2단계에서 생성한 데이터베이스에 테이블 스키마를 생성합니다. `STRING` 및 `BIGINT` 데이터 형식 값이 액세스 로그 속성입니다. Athena에서 이 속성을 쿼리할 수 있습니다. `LOCATION`의 경우 앞서 설명한 대로 버킷 및 접두사 경로를 입력하십시오.

   ```
   CREATE EXTERNAL TABLE `s3_access_logs_db.amzn-s3-demo-bucket_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)
   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 테이블이 만들어졌다는 뜻입니다. 이제 버킷 서버 액세스 로그를 쿼리할 수 있습니다.

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

```
SELECT RequestDateTime, RemoteIP, Requester, Key 
FROM s3_access_logs_db.amzn-s3-demo-bucket_logs 
WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
```

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

```
SELECT * 
FROM s3_access_logs_db.amzn-s3-demo-bucket_logs 
WHERE requester='arn:aws:iam::123456789123:user/user_name';
```

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

```
SELECT *
FROM s3_access_logs_db.amzn-s3-demo-bucket_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');
```

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

```
SELECT SUM(bytessent) AS uploadTotal,
      SUM(objectsize) AS downloadTotal,
      SUM(bytessent + objectsize) AS Total
FROM s3_access_logs_db.amzn-s3-demo-bucket_logs
WHERE RemoteIP='1.2.3.4'
AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z')
BETWEEN parse_datetime('2017-06-01','yyyy-MM-dd')
AND parse_datetime('2017-07-01','yyyy-MM-dd');
```

## Amazon S3 액세스 로그를 사용하여 객체 액세스 요청 식별
<a name="identifying-object-access-requests"></a>

액세스 로그에 대한 쿼리를 사용하여 *GET*, *PUT* 및 *DELETE*와 같은 작업에 대한 객체 액세스 요청을 식별하고 해당 요청에 대한 추가 정보를 검색할 수 있습니다.

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

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

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db
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 객체 요청을 가져오는 방법을 보여 줍니다.

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

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db
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 버킷에 대한 모든 익명 요청을 가져오는 방법을 보여 줍니다.

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

```
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime
FROM s3_access_logs_db.amzn-s3-demo-bucket_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')
```

**참고**  
필요에 맞게 날짜 범위를 수정할 수 있습니다.
이 쿼리 예제는 보안 모니터링에도 유용할 수 있습니다. 예상치 못하거나 승인되지 않은 IP 주소/요청자의 `PutObject` 또는 `GetObject` 호출 결과를 검토하고 버킷에 대한 익명 요청을 식별할 수 있습니다.
이 쿼리는 로깅이 사용 설정된 시간부터의 정보만 검색합니다.