# VPC 엔드포인트 실습 과정
* 현재 라우팅 테이블 설정을 하지 않은 상태
1. 퍼블릭 인스턴스를 생성(bastion)
2. private 서브넷에 인스턴스 생성
3. 생성한 인스턴스에 IAM역할 부여(S3접근)
2-1 역할 생성
IAM > 서비스: EC2 , 정책: AmazonS3ReadOnlyAccess > 생성
3. bastion을 통해 private에 있는 인스턴스에 접속
4. 명령어 실행
=====================
$ aws s3 ls
=====================
실행 안되는것을 확인
5. 엔트 포인트 생성하기
VPC > 엔드포인트 > Services: S3 검색 후 Gateway 타입 선택 , VPC, 라우팅 테이블 선택 > 생성
6. 다시 들어가서 'aws s3 ls' 실행해보기
* 여기서 CLI 설정을 해줘야 한다.
CLI 리전은 기본값으로 us-east-1로 설정되어 있어 변경해야함
==================
$ aws s3 ls --region <해당 리전>
==================
1)
- Flow Logs가 CloudWatch Logs로 갈 수 있다.
- CloudWatch Contributor Insights를 이용해 VPC나 원하는 것에 대한 네트워크에 가장 많이 기여하는 상위 10개 IP 주소를 확인할 수 있다.
2)
- Flow Logs를 사용해 CloudWatch Logs로 전송한다.
- 메트릭 필터를 설정해 SSH 또는 RDP 프로토콜을 검색
- 평소보다 SSH 또는 RDP가 많으면 CloudWatch Alarm을 트리거
- SNS를 통해 경보 생성
3)
- Flow Logs를 사용하고 모든걸 S3 버킷에 전송해 저장
- 이후 Athena를 사용해 SQL로 된 VPC Flow Logs를 분석
- 그리고 QuickSight로 시각화도 가능.
# VPC > 실습할 VPC 선택 > Flow Logs 목록 선택 > Flow Logs 생성
- name: DemoS3FlowLog
- filter: Accept|Reject|All // 어떤 트래픽이 왜 통과되지 않는지 디버깅 -> 거부형
- 최대 집계 주기: 10분|1분 // 보통은 10분 권장
- 전송 대상: CloudWatch Logs|S3|Kinesis Firehose(same|diff)account // 여기선 S3 선택
- S3 버킷 ARN: 실습에 사용할 ARN
생성
# CloudWatch Logs를 위한 Flow Logs 생성
- name: DemoCWFlowLog
- filter: Accept|Reject|All
- 최대 집계 주기: 10분|1분
- 전송 대상: CloudWatch Logs|S3|Kinesis Firehose(same|diff)account // 여기선 CloudWatch 선택
- 대상 로그 그룹: CloudWatch Logs > 로그 > 로그 그룹 > 로그 그룹 생성 >
이름: VPCFlowLgos
- 보관 기간: 1일 > 생성 후 선택
IAM 역할: IAM > 역할 생성 > 커스텀 신뢰정책 선택 >
=================
"Principal": {
"Service":"vpc-flow-logs.amazonaws.com"
}
=================
> 권한 정책: CloudWatchLogsFullAccess 선택 > 이름: flowlogsRole 생성 후 선택
생성
# 이제 이 로그들을 보고 어떤 IP가 접속 시도했는지 보고 NACL 수준에서 차단등의 작업을 할 수 있다.
# S3와 Athena를 사용해 분석하기
## 쿼리 위치 지정
Athena > 설정 > 관리 > 결과를 저장할 S3 버킷 지정 (ex: s3://<버킷 이름>/athena > 저장
# 구글에 aws vpc logs athena 검색 후 튜토리얼에서 구문 복사
=============
CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` (
version int,
account_id string,
interface_id string,
srcaddr string,
dstaddr string,
srcport int,
dstport int,
protocol bigint,
packets bigint,
bytes bigint,
start bigint,
`end` bigint,
action string,
log_status string,
vpc_id string,
subnet_id string,
instance_id string,
tcp_flags int,
type string,
pkt_srcaddr string,
pkt_dstaddr string,
region string,
az_id string,
sublocation_type string,
sublocation_id string,
pkt_src_aws_service string,
pkt_dst_aws_service string,
flow_direction string,
traffic_path int
)
PARTITIONED BY (`date` date)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'
TBLPROPERTIES ("skip.header.line.count"="1");
=============
를 쿼리에 넣고 S3 부분을 해당하는 S3 버킷 URI로 수정 후 구문 실행
이후 테이블 생성되는지 확인
# 튜토리얼에 아래에 있는 구문 찾아 실행
==============
ALTER TABLE vpc_flow_logs
ADD PARTITION (`date`='YYYY-MM-dd')
LOCATION 's3://DOC-EXAMPLE-BUCKET/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';
==============
ADD PARTITION에 ('date'='2024-08-19')로 변경 -> 번거롭다면 Glue를 사용하면 자동으로 할 수 있다.
S3 버킷의 YYYY/MM/dd 까지 들어간 후 URI 복사해 LOCATION에 붙여 넣은 후 실행
# select를 사용해 로그를 쿼리하기
============
SELECT *
FROM vpc_flow_logs
WHERE date = DATE('2020-05-04')
LIMIT 100;
SELECT day_of_week(date) AS
day,
date,
interface_id,
srcaddr,
action,
protocol
FROM vpc_flow_logs
WHERE action = 'REJECT' AND protocol = 6
LIMIT 100;
SELECT SUM(packets) AS
packetcount,
dstaddr
FROM vpc_flow_logs
WHERE dstport = 443 AND date > current_date - interval '7' day
GROUP BY dstaddr
ORDER BY packetcount DESC
LIMIT 10;
등등...
============
배치 분석할 때 아주 유용하다.
# 리소스 삭제 (중요)