# AWS CloudTrail 이벤트 기록에서 누가 언제 무엇을 했는지 읽기

> CloudTrail 이벤트 기록 화면에서 최근 변경 이벤트를 보고, 리소스 이름으로 걸러 한 보안 그룹의 생성부터 삭제까지를 추적합니다. 이벤트 상세와 JSON 레코드에서 사용자, 시각, 호출 내용, MFA 여부를 읽는 방법을 정리합니다.

- 주소: https://copyandrun.com/blog/aws-cloudtrail-event-history-read/
- 분야: 클라우드
- 발행일: 2026-10-19
- 태그: AWS, CloudTrail, 이벤트 기록, 감사 로그, IAM

AWS 계정에서 누가 무엇을 바꿨는지는 CloudTrail 이벤트 기록에서 먼저 확인합니다. 이 글은 조회만 하는 실습입니다. 앞선 [보안 그룹 글](/blog/aws-security-group-inbound-rules-console/)에서 만들고 지운 보안 그룹의 이벤트를 그대로 찾아 읽습니다.

## 준비물

| 항목 | 내용 |
| --- | --- |
| AWS 계정 | 실습용 IAM 사용자. `cloudtrail:LookupEvents` 권한 필요 |
| 리전 | 아시아 태평양(서울) ap-northeast-2 |
| 예상 소요 시간 | 약 15분 |
| 변경 사항 | 없음. 이 글은 아무것도 만들거나 지우지 않습니다 |

화면의 계정 ID, 사용자 이름, 액세스 키, 공용 IP, 요청 ID는 가렸습니다. 보안 그룹, VPC, 버킷 이름과 ID는 이미 삭제한 실습 리소스라 그대로 두었습니다.

## 1. 이벤트 기록 열기

CloudTrail 콘솔 왼쪽 메뉴에서 `이벤트 기록`을 엽니다.

![이벤트 기록 목록에 DeleteSecurityGroup, CreateSecurityGroup, AuthorizeSecurityGroupIngress, CreateBucket, DeleteVpc 같은 이벤트가 시각 순서로 보이고 위쪽 안내에 지난 90일 동안의 관리 이벤트가 표시된다고 적힌 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/01-event-history.png)

화면 위쪽 안내에 이벤트 기록에는 지난 90일 동안의 관리 이벤트가 표시된다고 적혀 있습니다. 목록 열은 이벤트 이름, 이벤트 시간, 사용자 이름, 이벤트 소스, 리소스 유형, 리소스 이름입니다.

두 가지를 먼저 알아 둡니다.

- 속성 조회 칸의 기본 필터가 `읽기 전용 = false`로 들어 있었습니다. 그래서 만들기, 수정, 삭제 같은 변경 이벤트와 ConsoleLogin 같은 쓰기 성격 이벤트만 보이고 조회(Describe, List) 이벤트는 가려집니다.
- 이 실습에서는 이벤트 시간이 `UTC+09:00`으로 표시됐습니다. 브라우저 시간대에 따라 달라질 수 있습니다. 목록에서는 시간 열이 잘려 보이니 4번 이미지에서 전체 표기를 확인합니다. 뒤에서 볼 JSON 레코드는 UTC로 기록돼 있어 9시간 차이가 났습니다.

## 2. 이벤트를 걸러 보기

속성 조회의 첫 칸을 열면 걸러 볼 수 있는 속성이 나옵니다.

![속성 조회 목록에 AWS 액세스 키, 이벤트 ID, 이벤트 이름, 이벤트 소스, 읽기 전용, 리소스 이름, 리소스 유형, 사용자 이름이 표시된 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/02-filter-attributes.png)

| 속성 | 쓰는 때 |
| --- | --- |
| 사용자 이름 | 특정 사용자가 한 일만 보고 싶을 때 |
| 이벤트 이름 | `DeleteSecurityGroup`처럼 특정 동작만 볼 때 |
| 리소스 이름 | 한 리소스에 일어난 일을 처음부터 끝까지 볼 때 |
| AWS 액세스 키 | 유출이 의심되는 액세스 키가 한 일을 찾을 때 |
| 이벤트 소스 | `s3.amazonaws.com`처럼 서비스별로 볼 때 |

이 화면에서는 속성을 하나만 고를 수 있었고, 옆의 `날짜 및 시간별 필터링`으로 기간을 함께 좁힐 수 있습니다. 이 글에서는 `리소스 이름`을 고르고 앞선 글에서 만든 보안 그룹 ID를 입력한 뒤 Enter를 눌렀습니다.

![리소스 이름이 보안 그룹 ID인 이벤트 3건이 DeleteSecurityGroup, CreateSecurityGroup, AuthorizeSecurityGroupIngress 순서로 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/03-filter-by-resource.png)

그 보안 그룹의 이벤트 3건이 나왔습니다. 만들기(CreateSecurityGroup), 인바운드 규칙 추가(AuthorizeSecurityGroupIngress), 삭제(DeleteSecurityGroup)입니다. 삭제된 리소스도 이벤트가 남아 있어서, 이 화면으로 누가 언제 지웠는지 확인할 수 있습니다.

CreateSecurityGroup 행의 리소스 유형과 리소스 이름 칸에는 VPC와 보안 그룹이 함께 들어 있어서, 칸이 좁으면 잘려 보입니다. 전체 목록은 상세 화면의 참조 리소스에서 확인합니다.

## 3. 이벤트 상세 읽기

이벤트 이름을 눌러 상세 화면을 엽니다. 이 글은 `CreateSecurityGroup`을 열었습니다.

![세부 정보에 이벤트 시간, 사용자 이름, 이벤트 이름, 이벤트 소스, AWS 액세스 키, 소스 IP 주소, 이벤트 ID, 요청 ID, AWS 리전, 오류 코드, 읽기 전용이 표시되고 아래 참조 리소스에 VPC와 보안 그룹 이름과 ID가 있는 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/04-event-detail.png)

| 항목 | 값 | 읽는 방법 |
| --- | --- | --- |
| 이벤트 시간 | 10월 17, 2026, 23:57:22 (UTC+09:00) | 호출이 일어난 시각 |
| 사용자 이름 | IAM 사용자 이름 | 호출한 주체 |
| 이벤트 소스 | ec2.amazonaws.com | 호출된 서비스 |
| AWS 액세스 키 | 액세스 키(가림) | 호출에 쓰인 자격 증명. 임시 자격 증명이면 ASIA 접두사로 시작하는 것이 AWS 문서의 설명입니다 |
| 소스 IP 주소 | 공인 IP(가림) | 호출이 시작된 위치 |
| 오류 코드 | - | 비어 있으면 호출이 성공한 것 |
| 읽기 전용 | false | 변경 호출 |

`참조 리소스`에는 이 호출이 읽거나 바꾼 리소스가 모입니다. 이 이벤트는 VPC 하나와 보안 그룹 이름, 보안 그룹 ID를 가리켰습니다.

## 4. JSON 레코드 읽기

상세 화면 아래의 `이벤트 레코드`에 JSON 전문이 있습니다. 오른쪽 위 `복사`로 통째로 복사할 수 있습니다.

![JSON에 userIdentity의 type이 IAMUser, sessionContext의 mfaAuthenticated가 false, eventSource가 ec2.amazonaws.com, eventName이 CreateSecurityGroup, requestParameters에 groupName이 cr-demo-sg로 보이고 계정 ID와 액세스 키 값은 가려진 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/05-record-json-top.png)

위쪽 절반에서 읽을 필드입니다.

| 필드 | 이 레코드의 값 | 의미 |
| --- | --- | --- |
| `userIdentity.type` | `IAMUser` | 호출한 주체의 종류 |
| `sessionContext.attributes.mfaAuthenticated` | `"false"` | 이 세션이 MFA로 인증되지 않았음 |
| `eventTime` | `2026-10-17T14:57:22Z` | UTC 시각. 목록의 23:57:22와 9시간 차이 |
| `eventName` | `CreateSecurityGroup` | 호출한 API |
| `requestParameters` | `groupName`, `groupDescription`, `vpcId` | 요청에 넣은 값 |

`requestParameters`의 `groupName`이 `cr-demo-sg`로, 보안 그룹 생성 화면에 입력한 값과 같습니다. 화면에서 입력한 값이 로그에 그대로 남는다는 것을 확인할 수 있습니다.

`mfaAuthenticated`가 `false`인 점은 감사에서 볼 만합니다. 이 세션은 MFA로 인증한 세션이 아니었다는 뜻입니다. 운영 계정이면 MFA 없는 관리 변경은 점검 대상입니다.

![JSON 아래쪽에 readOnly가 false, eventType이 AwsApiCall, managementEvent가 true, eventCategory가 Management, tlsDetails의 tlsVersion이 TLSv1.3, sessionCredentialFromConsole이 true로 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-cloudtrail-event-history-read/06-record-json-bottom.png)

아래쪽 절반에서는 다음을 읽습니다.

| 필드 | 이 레코드의 값 | 의미 |
| --- | --- | --- |
| `readOnly` | `false` | 변경 호출 |
| `eventType` | `AwsApiCall` | API 호출로 기록된 이벤트 |
| `managementEvent`, `eventCategory` | `true`, `Management` | 관리 이벤트 |
| `tlsDetails.tlsVersion` | `TLSv1.3` | 호출에 쓰인 TLS 버전 |
| `sessionCredentialFromConsole` | `"true"` | 콘솔 로그인 세션의 자격 증명으로 한 호출. 사용자 에이전트가 Chrome이라는 점도 같은 방향입니다 |

## 자주 막히는 곳

| 증상 | 확인할 것 |
| --- | --- |
| 방금 한 작업이 목록에 없음 | 목록 오른쪽 위의 새로고침을 누르고 다시 확인합니다. 이 글은 작업이 끝난 뒤에 이벤트 기록을 열어서, 반영 시간은 측정하지 못했습니다 |
| 조회(Describe, List) 호출이 안 보임 | 기본 필터가 `읽기 전용 = false`입니다. 속성을 `읽기 전용`으로 두고 값을 `true`로 바꿉니다. 이 글은 이 값을 바꿔 보지 않았습니다 |
| 시각이 9시간 어긋남 | 목록은 UTC+09:00, JSON의 `eventTime`은 UTC입니다 |
| 여러 속성으로 동시에 걸러지지 않음 | 이 화면에서는 속성 하나만 고를 수 있었습니다. 한 속성으로 걸러 놓고 목록에서 눈으로 좁힙니다 |
| 90일보다 오래된 이벤트가 없음 | 이벤트 기록은 지난 90일만 보여 줍니다. 더 오래 보관하려면 추적을 만들어 S3에 저장합니다. 이 글은 추적을 만들지 않았습니다 |

## 이어서 해 볼 것

- 속성을 `사용자 이름`으로 바꿔 한 사용자의 최근 변경 이벤트 훑어보기
- `이벤트 다운로드`로 목록을 CSV나 JSON으로 받아 보기
- 추적을 만들어 S3에 로그를 저장하고 이벤트 기록과 비교하기(비용이 생길 수 있으니 요금 안내를 먼저 확인)

## 확인 범위

- 확인한 것: 서울 리전 콘솔(한국어 화면)에서 이벤트 기록을 열고, 속성 목록을 확인하고, 리소스 이름으로 걸러 3건을 찾고, 이벤트 상세와 JSON 레코드를 읽었습니다. 이 글의 모든 동작은 조회였습니다.
- 확인하지 못한 것: `읽기 전용`을 `true`로 바꿨을 때의 결과, 이벤트가 목록에 나타나기까지 걸리는 정확한 시간, 90일을 넘는 보관은 확인하지 않았습니다. 추적은 열지 않았습니다. 화면 위 안내 배너에는 CloudTrail Lake를 신규 고객에게 더 이상 제공하지 않는다고 적혀 있어서, 이 글은 이벤트 데이터 스토어를 다루지 않았습니다.
- 화면 구성과 기본값은 콘솔 업데이트와 계정 설정에 따라 달라질 수 있습니다.
