Amazon Kinesis Data Streams, Kinesis Data Firehose 이용하여 로그 데이터 수집/저장

2020. 5. 4. 10:16IT/AWS

728x90

1. 설명

1.1 Kinesis Data Streams

Amazon Kinesis Data Streams는 데이터를 실시간으로 수집하고, 저장하여 데이터를 사용(소비) 할 수 있는 상태로 만든다.

Kinesis Data Streams 아키텍처는 다음과 같다. 

 

Producer는 지속적으로 Kinesis Data Streams에 데이터를 푸시하고, Consumer는 실시간으로 데이터를 처리한다.

Shard는 Stream에서 고유하게 식별되는 데이터 레코드 시퀀스이다. 

Stream은 1개 이상의 Shard로 구성된다. 각 Shard는 고정된 용량을 제공하고, Stream의 총 용량은 해당 Shard의 용량의 합계가 된다.

데이터 속도가 증가하면 Stream에 할당된 Shard 수를 늘리거나 줄일 수 있다(리샤딩).

 

1.2 Kinesis Firehose

Amazon Kinesis Firehose는 데이터를 저장소 또는 분석 도구에 로드한다. S3, Redshift, ES, Splunk 등의 서비스로 전송할 수 있다.

스트리밍 데이터를 S3 버킷으로 전송하는 프로세스는 다음과 같다.

 

옵션으로 데이터 변환을 수행할 수 있고, 변환 후 S3에 전송된다.

 

Amazon Kinesis Data Streams에 데이터를 입력하는 방법으로 Kinesis 에이전트, API, Kinesis Producer Library를 사용할 수 있다.

본문에서는 Kinesis Data Stream, Firehose를 구성하고, Kinesis 에이전트를 통하여 지속적으로 로그를 수집하고, S3에 적재하도록 구성한다.

 

2. 구현

2.1 Kinesis Data Stream 구성

데이터 스트림을 구성한다. 이름과 구성할 Shard 수를 입력하고 생성한다.

단일 Shard는 초당 최대 1MB 또는 1,000 PUT의 스트리밍 데이터를 수집할 수 있다. (서울 리전 기준으로 계정당 200개의 Shard를 생성할 수 있다.)

 

데이터 스트림이 만들어지고, 다음과 같이 활성화되는 것을 확인한다.

 

2.2 Kinesis Data Firehose 구성

Data Firehose를 구성한다. Data Firehose의 이름과 데이터 Source, Destination을 입력한다.

데이터의 Source는 위에서 구성한 Data Stream을 선택한다.

 

보안적인 이유로 Kinesis Data Firehose를 통하여 수신하는 데이터를 변환할 수 있다.

Lambda을 사용하여 소스 레코드 변환하거나, JSON 형식을 Apache Parquet 또는 Apache ORC로 변환할 수 있다.

본문에서는 변환 없이 수집만 수행한다.

 

Destination은 저장하고자 하는 대상을 선택한다. 본문에서는 S3에 저장하고자 한다.

 

저장하고자 하는 S3 버킷을 선택한다. 

S3 Prefix는 S3 폴더명(경로)이다. 기본적으로 'YYYY/MM/DD/HH' UTC 시간 형식으로 자동적으로 적용된다. (예를 들어, 2020/04/16/00/에 저장되게 된다.)

이러한 시간 기본값 대신 사용자가 원하는 Prefix를 지정할 수 있다. 전송 오류 시, S3에 데이터를 전송할 때 Prefix도 지정할 수 있다.

 

Kinesis Data Firehose는 S3로 데이터를 전송하기 전에 버퍼링 하는 단계를 거친다. 

버퍼 크기(1–128MB) 또는 버퍼 간격(60–900초)을 선택할 수 있다.

데이터 변환을 수행하게 되면, Kinesis Data Firehose가 변환된 데이터를 수신하고 S3로 데이터가 전송할 때까지 버퍼 간격이 적용된다. 

S3로 데이터가 전송되는 속도가 데이터 변환 속도보다 느린 경우, Kinesis Data Firehose가 속도를 조절하기 위함이다. 버퍼 크기는 동적으로 확장된다.

 

GZIP, Snappy, Zip 형태로 압축하여 저장할 수 있다. 저장 시, 암호화하는 기능도 제공한다.

 

2.3 Kinesis 에이전트 구성 

Amazon Linux AMI를 이용해 에이전트를 설치한다. 

sudo yum install –y aws-kinesis-agent

 

/etc/sysconfig/aws-kinesis-agent 에서 사용자 계정의 액세스 키와 리전을 입력한다.

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-2

 

/etc/aws-kinesis/agent.json 에서 다음과 같이 구성 정보를 입력한다. 본문에서는 Apache 로그를 S3로 보내고자 한다.

{
  "cloudwatch.emitMetrics": true,
  "kinesis.endpoint": "https://kinesis.ap-northeast-2.amazonaws.com",
  "firehose.endpoint": "https://firehose.ap-northeast-2.amazonaws.com",
 
  "flows": [
    {
      "filePattern": "/var/log/httpd/access_log",
      "kinesisStream": "test"
    }
  ]
}

 

/etc/aws-kinesis/agent.json에서 Data Stream을 거치지 않고, Data Firehose에서 바로 S3로 적재 시에는 다음과 같이 입력한다.

{
   "flows": [
        {
            "filePattern": "/var/log/httpd/access_log",
            "deliveryStream": "test"
        }
   ]
}

 

접근할 로그 파일에 대한 권한 변경도 필요하다.

chmod 755 /var/log/httpd
chmod 644 /var/log/httpd/access_log

 

다음과 같이 에이전트를 시작, 재실행, 정지시킨다. 위 구성 정보 입력 후, 에이전트를 재실행해야 변경 정보가 반영된다.

sudo service aws-kinesis-agent start
 
sudo chkconfig aws-kinesis-agent on
 
sudo service aws-kinesis-agent restart
 
sudo service aws-kinesis-agent stop

 

에이전트의 실행 로그는 다음 위치에서 확인할 수 있다.

cat /var/log/aws-kinesis-agent/aws-kinesis-agent.log

 

2.4 구현 결과

aws-kinesis-agent.log에서 실행 및 전송이 성공적으로 이루어지고 있는지 확인한다. 

오류 발생 또한 이 로그에서 확인할 수 있다. (권한 부여 오류 등)

 

성공적으로 수행되었다면, 구성한 S3 버킷에 해당 로그 파일이 적재된 것을 확인할 수 있다.

 

해당 파일의 로그이다.

300x250