AWS-VPC-Flowlog-Athena

VPC에서 아웃바운드로 향하는 모든포트를 확인해야하는 일이 생겼다.

그래서 이전 포스팅에서 먼저 과거의 방법을 이용해서 확인했고 이번에는 S3로 전송하여 보려한다.

아래는 이전의 방법으로 확인한 포스팅이다.

현재에는 이런 방법을 사용하지 않는다.

위에 작성한 방법은 ETL 과정을 거치는건데 사실 이렇게 할필요가 전혀없다.

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/vpc-flow-logs.html

그냥 이거 따라하면 된다.

VPC-Flowlog 활성화 -S3 -athena

이렇게 간소화 되었다.

S3로 보내도록 로그를 생성한다.

S3 버킷 생성하는 부분은 생략한다.

CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs (
version int,
account string,
interfaceid string,
sourceaddress string,
destinationaddress string,
sourceport int,
destinationport int,
protocol int,
numpackets int,
numbytes bigint,
starttime int,
endtime int,
action string,
logstatus string
)
PARTITIONED BY (date date)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://your_log_bucket/prefix/AWSLogs/{subscribe_account_id}/vpcflowlogs/{region_code}/'
TBLPROPERTIES ("skip.header.line.count"="1");

명령어가 정상적으로 실행되면 위와같이 테이블을 확인할수있다

ALTER TABLE vpc_flow_logs
ADD PARTITION (date='2020-06-04')
location 's3://linuxer-blog-log/AWSLogs/328345415633/vpcflowlogs/ap-northeast-2/';

두줄을 적용하면 테이블이 등록된다. 유의할점이 지정한 날에 대한 단일 파티션만 생성된다.

이제 목적한 쿼리를 날려보자.

여기까지 테스트한이유는 아웃바운드의 모든 포트를 확인하기 위함이었다. 이제 쿼리를 해보자.

SELECT sourceport, count(*) cnt
FROM vpc_flow_logs
WHERE sourceaddress LIKE '10.0%'
GROUP BY sourceport
ORDER BY cnt desc
LIMIT 10;

이렇게 확인할수 있었다.

구 방법 부터 현재 권장하는 방법까지 테스트를 해보았고 같은결과를 확인하였다.

여기까지 읽어주셔서 감사하다!

-추가 쿼리

SELECT day_of_week(date) AS
day,
date,
interfaceid,
sourceaddress,
action,
protocol,
destinationaddress,
destinationport
FROM vpc_flow_logs_proc_20200702
WHERE action = 'REJECT' AND sourceaddress = '10.0.1.150'
LIMIT 1000;

AWS-VPC-flowlog-kinesis-Athena

아웃바운드로 연결되는 모든 포트를 확인하기위해 flowlog 를 이용해야 했다.

먼저 흐름을 그려보자.

https://aws.amazon.com/ko/blogs/big-data/analyzing-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight/

VPCflowlog enable -> cloudwatch loggroup -> lambda -> kinesis -> s3

이게 일단 저장하는 프로세스다.

지금은 좀더 간소화된 과정이 있으나 먼저 이전에 나온 방법을 학습하기 위해 이방법을 택했다.

먼저 저장 프로세스를 만들어보자.

https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/flow-logs.html

VPCflowlog 는 이런식으로 생성했다.

여기서 중요한것은 대상 로그 그룹이다. 역할은 자동생성 눌러서 그냥 만들어주자.

로그그룹은 따로 쌓기 위해서 새로만들어줬다.

로그그룹을 만들었다면 lambda를 생성하자. 람다는 어려울게 없다.

역할만 잘만들어주면 끝이다.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:::" }, { "Effect": "Allow", "Action": [ "firehose:PutRecordBatch" ], "Resource": [ "arn:aws:firehose::*:deliverystream/VPCFlowLogsDefaultToS3"
]
}
]
}

따로 역할을 생성할때 람다를 선택하거나 역할을 만들고 신뢰관계를 추가하자.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

람다를 생성하고 위의 역할을 생성해서 부여해 주자. python 2.7 을 사용했다.

아래 소스를 인라인에 붙여 넣자.

https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py

환경변수또한 잘 생성해 줘야 한다.

람다의 제한시간을 1분으로 해주자.

람다에서는 템플릿 변경할게없다.

람다를 정상적으로 생성했다면 CloudWatch Loggroup 에서 lamdba 에대해서 설정해 줄게 있다.

Create Lambda subscription filter 설정이다.

생성한 Lambda 로 지정해주면 된다.

그다음은 kinesis다.

kinesis 에서도 Kinesis Data Firehose delivery streams 를 설정해야 한다.

VPCFlowLogsDefaultToS3 이름은 람다에서 설정한 환경에 넣은 이름으로 한다.

설정해줄 부분은

역할 자동 생성.

S3 버킷 지정이랑 compession 을 gzip 으로 변경하자. 거의 다왔다. 여기까지 했으면 이제 ETL 설정은 끝이다.

Athena 서비스로 이동하자

Athena 에서 테이블을 생성해야 한다.

CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs (
Version INT,
Account STRING,
InterfaceId STRING,
SourceAddress STRING,
DestinationAddress STRING,
SourcePort INT,
DestinationPort INT,
Protocol INT,
Packets INT,
Bytes INT,
StartTime INT,
EndTime INT,
Action STRING,
LogStatus STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([^ ]+)\s+([0-9]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([0-9]+)\s+([0-9]+)\s+([^ ]+)\s+([^ ]+)$")
LOCATION 's3:///';

지금까지의 과정이 정상적으로 진행됬다면 이쿼리가 잘실행된이후에 테이블이 생성된다.

그리고 이제 포트를 확인하자 사용한 쿼리다.

SELECT sourceport, count(*) cnt
FROM vpc_flow_logs
WHERE sourceaddress LIKE '10.0%'
GROUP BY sourceport
ORDER BY cnt desc
LIMIT 10;

이런 내용이 나오고..

이렇게 VPC 에서 사용하는 sourceport 를 확인할 수 있다.

정리하자면 VPC IP가 sourceaddress 인경우에 port 를 count 한다 이다.

읽어주셔서 감사하다 !

linux-jaeger-setup

jaeger를 다운 받을 위치로 이동한다. 나는 amazon linux 2를 사용했고 일부패키지는 amazon-linux-extra 를 사용했다.

cd /usr/local/src/

위치에서 시작했다.

GOPATH=`pwd`
echo $GOPATH

gopath 를 설정했으면 gopath bin 을 path 로 지정해줘야 한다. 현재위치에서 gopath/bin 은 /usr/local/src/bin 이된다.

export PATH=$PATH:$GOPATH/bin

gopath bin을 설정해줬으면 사전 설치를 한다.

amazon-linux-extras install golang1.11
amazon-linux-extras install epel
curl -sL https://rpm.nodesource.com/setup_8.x | bash -
yum install -y git npm nodejs
npm install -g yarn
go get -u github.com/mjibson/esc
go get github.com/securego/gosec/cmd/gosec

nodejs가 8버전이 필요하다. go 1.11 버전이 최소 요구 버전이다.

이제 본격적인 설치를 시작한다.

git clone https://github.com/jaegertracing/jaeger.git jaeger
cd jaeger/

git clone 뜨고 디렉토리를 이동한다.

설치전에 CONTRIBUTING.md 파일을 꼭읽자.

https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING.md

git submodule update --init --recursive
make install-tools
make build-ui

여기까지 하면 설치가 완료된거다.

go run -tags ui ./cmd/all-in-one/main.go

명령어로 실행한다.

사이트 확인은 16686 포트이다

http://IP:16686/search

으로 접근해서 서비스를 확인하자.

이 화면이 뜨면 정상적으로 설치된거다.

읽어주셔서 감사하다.

jaeger 설치를 마친다.

AWS-Linux-MariaDB-10.5-S3-Storage-Engine-install-실패

mariadb 10.5 version 에서 S3 Storage Engine을 사용하기위해 먼저 repo를 설치하고 s3 engine 를 올리려고 해봤다. 원랜 바이너리 패키지로 지원해야 하는데....

https://mariadb.com/kb/en/using-the-s3-storage-engine/

아무리 찾아봐도 없어서...찾아보니까...

https://jira.mariadb.org/browse/MDEV-22606

The S3 storage engine is included in source code distributions of MariaDB Community Server 10.5. However, it is not currently built and distributed with any of our MariaDB Community Server 10.5 binary packages.

이런내용이 있었다...제길..컴파일해야 하는구나.

그래서 컴파일을 시작했다.

mariadb 컴파일은 생각보다 엄청 오래걸린다. T2.micro 사이즈 기준으로 2시간정도.. 너무 느리다 생각되면 인스턴스 사이즈를 컴파일 할때만 잠깐 늘리거나 인스턴스가 터지지 않게 swap 을 늘려주자.

이전에 포스팅한 swap 만들기가 있다. 참고하자.

하면서 인스턴스용량 때문에 한번 메모리때문에 한번터져서 세번째엔 그냥 T3.large 유형으로 컴파일을 했다.

설치 시작전에 먼저 필요한 패키지를 설치한다.

cmake로 컴파일한다.

# amazon-linuxer-extra install epel-release
# yum install -y cmake gcc gcc-c++ ncurses-devel git curl-devel mhash-devel

먼저 기본설정으로 두가지를 설치하자. epel은 mhash-devel 때문에 설치하는거다.

# wget http://mirrors.supportex.net/mariadb//mariadb-10.5.3/source/mariadb-10.5.3.tar.gz

다운받고

tar zfxv mariadb-10.5.3.tar.gz

압축풀고

cd mariadb-10.5.3

이동하고 컴파일 한다.

# cmake \
-DWITH_READLINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=bundled \
-DWITH_ZLIB=system \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_ARIA_STORAGE_ENGINE=1 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATEDX_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DPLUGIN_S3=YES \
-DINSTALL_SYSCONFDIR=/usr/local/mariadb/etc \
-DINSTALL_SYSCONF2DIR=/usr/local/mariadb/etc/my.cnf.d \
-DMYSQL_TCP_PORT=3306 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DMYSQL_DATADIR=/usr/local/mariadb/data \
-DMYSQL_UNIX_ADDR=/usr/local/mariadb/socket/mysql.socket

CMake Error at cmake/plugin.cmake:296 (MESSAGE):
Plugin S3 cannot be built
Call Stack (most recent call first):
CMakeLists.txt:427 (CONFIGURE_PLUGINS)

-DPLUGIN_S3=YES

위 옵션이 먹지 않았다.

https://jira.mariadb.org/browse/MDEV-19416

이리저리 찾아봐도 안된다는 내용만.. source  에 있다해서 신나서 했는데..ㅠㅠ

아직 10.5.3버전에서도 정상적으로 릴리즈되진 않은것으로 보인다.

S3_STORAGE_ENGINE=1 이옵션으로 켜줘야 정상아닌가..그래서

S3_STORAGE_ENGINE옵션을 주고 컴파일 해봤는데... 컴파일은 되는데 플러그인을 확인할수 없었다.

-rwxr-xr-x 1 root root 30008 May 23 06:36 adt_null.so
-rwxr-xr-x 1 root root 22368 May 23 06:36 auth_0x0100.so
-rwxr-xr-x 1 root root 327904 May 23 06:36 auth_ed25519.so
-rwxr-xr-x 1 root root 33488 May 23 06:36 auth_test_plugin.so
-rwxr-xr-x 1 root root 51160 May 23 06:35 caching_sha2_password.so
-rwxr-xr-x 1 root root 343792 May 23 06:35 client_ed25519.so
-rw-r--r-- 1 root root 227 May 11 14:34 daemon_example.ini
-rwxr-xr-x 1 root root 31840 May 23 06:36 debug_key_management.so
-rwxr-xr-x 1 root root 23608 May 23 06:36 dialog_examples.so
-rwxr-xr-x 1 root root 51848 May 23 06:35 dialog.so
-rwxr-xr-x 1 root root 419984 May 23 06:36 disks.so
-rwxr-xr-x 1 root root 59432 May 23 06:36 example_key_management.so
-rwxr-xr-x 1 root root 184128 May 23 06:36 file_key_management.so
-rwxr-xr-x 1 root root 1239672 May 23 06:36 func_test.so
-rwxr-xr-x 1 root root 718464 May 23 06:36 ha_archive.so
-rwxr-xr-x 1 root root 682112 May 23 06:36 ha_blackhole.so
-rwxr-xr-x 1 root root 8822896 May 23 06:36 ha_connect.so
-rwxr-xr-x 1 root root 532336 May 23 06:36 ha_example.so
-rwxr-xr-x 1 root root 874792 May 23 06:36 ha_federated.so
-rwxr-xr-x 1 root root 1526136 May 23 06:36 ha_federatedx.so
-rwxr-xr-x 1 root root 28310200 May 23 06:36 ha_mroonga.so
-rwxr-xr-x 1 root root 3250752 May 23 06:36 handlersocket.so
-rwxr-xr-x 1 root root 126790184 May 23 06:35 ha_rocksdb.so
-rwxr-xr-x 1 root root 1806592 May 23 06:36 ha_sphinx.so
-rwxr-xr-x 1 root root 11633920 May 23 06:36 ha_spider.so
-rwxr-xr-x 1 root root 363776 May 23 06:36 ha_test_sql_discovery.so
-rwxr-xr-x 1 root root 84016 May 23 06:36 libdaemon_example.so
-rwxr-xr-x 1 root root 415792 May 23 06:36 locales.so
-rwxr-xr-x 1 root root 592512 May 23 06:36 metadata_lock_info.so
-rwxr-xr-x 1 root root 29352 May 23 06:36 mypluglib.so
-rwxr-xr-x 1 root root 35656 May 23 06:35 mysql_clear_password.so
-rwxr-xr-x 1 root root 29568 May 23 06:36 qa_auth_client.so
-rwxr-xr-x 1 root root 39152 May 23 06:36 qa_auth_interface.so
-rwxr-xr-x 1 root root 24592 May 23 06:36 qa_auth_server.so
-rwxr-xr-x 1 root root 587624 May 23 06:36 query_cache_info.so
-rwxr-xr-x 1 root root 731952 May 23 06:36 query_response_time.so
-rwxr-xr-x 1 root root 234272 May 23 06:36 server_audit.so
-rwxr-xr-x 1 root root 28576 May 23 06:36 simple_password_check.so
-rwxr-xr-x 1 root root 31152 May 23 06:36 sql_errlog.so
-rwxr-xr-x 1 root root 1281352 May 23 06:36 test_versioning.so
-rwxr-xr-x 1 root root 689104 May 23 06:36 type_test.so
-rwxr-xr-x 1 root root 720048 May 23 06:36 wsrep_info.so

플러그인 리스트를 첨부하는것으로 포스팅을 마친다...

하....이번에도 역시 실패

Azure-Free Certification Exam

https://docs.microsoft.com/en-us/learn/certifications/microsoft-build-cloud-skills-challenge-2020-free-certification-exam-offer

Microsoft Build Cloud Skills Challenge 2020 를 완료하면 시험 바우처를 제공합니다!!

과정은 이렇습니다.

https://mybuild.microsoft.com/

가입후 메일로 인증확인 개인정보 등록

https://docs.microsoft.com/ko-kr/users/

learm 프로필에서 확인

https://aka.ms/buildcloudskillschallenge

챌린지 진행!