Redshift 및 Athena로 CloudWatch Logs 로그 분석

11904 단어 AWSKinesisFirehose

의 목적


CloudWatch Logs의 로그를 분석하려고 합니다.
Kinesis Firehose를 사용하면 S3로 전송할 수 있지만, 계속 이러면 {json}처럼 한 줄에 여러 개의 JSON 대상을 저장합니다.
자기 힘으로 하나봐.
기본 64 디코딩=>gunzip=&추출logEvents=>줄 바꿈 문자를 가운데 메시지에 추가하고 인코딩하여 반환값으로 조합에 전달=>기본 64
이런 처리는 필요한 것 같다
그래서 순서대로 하겠습니다.

CloudWatch Logs 만들기


로그 그룹 생성


CloudWatch 로그
Actions -> Create log group

로그 생성


위에서 만든 Log Group, Create Log Stram을 클릭

시험해 보다


put-log-events.sh
#!/bin/bash

export AWS_DEFAULT_REGION=ap-northeast-1

LogGroupName="redshift-experiment"
LogStreamName="command-stream"

Profile=$1
Mess=$2

Mess=`echo $Mess | sed -e "s/'//g"`

UploadSequenceToken=$(aws --profile $Profile logs describe-log-streams --log-group-name "$LogGroupName" --query 'logStreams[?logStreamName==`'$LogStreamName'`].[uploadSequenceToken]' --output text)

TimeStamp=`gdate "+%s%N" --utc`
TimeStamp=`expr $TimeStamp / 1000000`

if [ "$UploadSequenceToken" != "None" ]
then
  aws --profile $Profile logs put-log-events --log-group-name "$LogGroupName" --log-stream-name "$LogStreamName" --log-events timestamp=$TimeStamp,message="$Mess" --sequence-token $UploadSequenceToken
else
  aws --profile $Profile logs put-log-events --log-group-name "$LogGroupName" --log-stream-name "$LogStreamName" --log-events timestamp=$TimeStamp,message="$Mess"
fi
aws cli를 미리 설치하여 설정하십시오.
이후$ brew install coreutilsgdate를 사용할 수 있습니다.
aws 계정이 대략 여러 개 있기 때문에 복사여기.의 스크립트를 프로필에 건네주거나date를 gdate로 바꾸어 맥을 이동시킬 수 있습니다.$ ./put-log-events.sh default hello로그를 추가합니다.

Kiness Stream 제작


cludwatch-logs-stream이라는 stream을 제작합니다.
돈이 중요하니까 되도록 작게 하세요.

문서 작성


여기.는 매우 참고 가치가 있다.
cwl-role.json
{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }
}
cwl-kinesis-write.json
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kinesis:PutRecord",
      "Resource": "arn:aws:kinesis:ap-northeast-1:xxxx:stream/cloudwatch-logs-stream"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::xxxx:role/cwl-to-kinesis"
    }
  ]
}

$ aws iam create-role --role-name cwl-to-kinesis --assume-role-policy-document file://./cwl-role.json --profile default
$ aws iam put-role-policy --role-name cwl-to-kinesis --policy-name cwl-kinesis-write --policy-document file://./cwl-kinesis-write.json --profile default

필터 만들기

aws logs \
    put-subscription-filter \
    --region ap-northeast-1 \
    --log-group-name "redshift-experiment" \
    --filter-name "All" \
    --filter-pattern "" \
    --role-arn "arn:aws:iam::xxxx:role/cwl-to-kinesis" \
    --destination-arn "arn:aws:kinesis:ap-northeast-1:xxxx:stream/cloudwatch-logs-stream" \
    --profile default

S3에 저장


S3에 저장하기 위해 Kiness Firehose 설정
클라우드워치-logs-delivery-stream 만들기
Amazon Kiness Data Firehose에서Create Delivery Stream 클릭
1단계에서 아까 Source에서 만든 Kiness Stream을 선택하세요.

두 번째는 와일드카드를 쓰면 OK.
3단계 Destination에서 S3을 저장한 버킷과 prefix를 선택해서 적당히 덧붙이세요.
4단계는 기본적으로 OK입니다.하지만 4단계 버퍼 인터벌에만 Second 60개를 지정해 배가 고프지 않으면 로그를 틀어도 반영되기 어렵다.
만약 IAM role가 환경 검증 등 새롭게 제작됐다면.
이렇게 로그를 만들고 재생하면 파일이 s3에 놓입니다
gzip에 걸렸을 뿐만 아니라 확장자도 없고 줄 바꾸기도 없었다.
참고로 이런 느낌이에요.
{"messageType":"DATA_MESSAGE","owner":"xxx","logGroup":"redshift-experiment","logStream":"command-stream","subscriptionFilters":["All"],"logEvents":[{"id":"xxx","timestamp":1557395415730,"message":"hello1"}]}{"messageType":"DATA_MESSAGE","owner":"xxx","logGroup":"redshift-experiment","logStream":"command-stream","subscriptionFilters":["All"],"logEvents":[{"id":"xxx","timestamp":1557395420146,"message":"hello2"}]}
그래서 lambda로 변환을 진행합니다.
import base64
import gzip
import io
import json

def lambda_handler(event, context):
    records = [process_record(r) for r in event['records']]
    return {'records': records }

def process_record(record):
    record_id = record['recordId']
    data = base64.b64decode(record['data'])
    iodata = io.BytesIO(data)

    with gzip.GzipFile(fileobj=iodata, mode='r') as f:
        data = json.loads(f.read())

    processed_data = process_data(data) + '\n'
    return {
        'data': base64.b64encode(processed_data.encode('utf-8')).decode('utf-8'),
        'result': 'Ok',
        'recordId': record_id
    }

def process_data(data):
    return '\n'.join([format_log_event(json) for json in data['logEvents']])

def format_log_event(j):
    return json.dumps({'timestamp': j['timestamp'], 'message': j['message']})
이러한 script는 AWS Lambda create function 을 사용하여 적절한 이름으로 저장합니다
그런 다음 Firehose edit의 Transform source records with AWS Lambda에 저장된 lambda를 변환하도록 지정합니다.
lambda를 설정하면 IAM role에서 발생합니다. Create new or update를 클릭하십시오.
이렇게 하면 괜찮은 파일이 s3에 놓여 있기 때문에 Athena를 사용할 수 있습니다.
{"timestamp": 1557401834708, "message": "hello"}
{"timestamp": 1557401837275, "message": "hello"}
레드시프트를 사용하려면 먼저 여기.Source의 Kiness Stream을 만들면 OK
사이트 축소판 그림
https://dev.classmethod.jp/cloud/aws/put-cloudwatchlogs/
https://qiita.com/tilfin/items/150cd899077d3c6b7edd

좋은 웹페이지 즐겨찾기