설치 매뉴얼
AWS IAM 정책 설정
AWS API를 호출하려면 먼저 AWS IAM 정책과 계정을 설정해야 합니다.
단계 1: 정책 JSON 입력
IAM 서비스 화면에서 아래 JSON 파일을 복사하여 IAM 정책을 생성하세요. 아래 정책은 읽기 전용 권한만 존재하지만 대상이 전체 리소스로 되어있으므로, 로그프레소가 읽기 가능한 클라우드 리소스 범위를 제한하시기 바랍니다. 사용하지 않는 권한은 삭제하셔도 됩니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ce:GetCostAndUsage",
"acm:DescribeCertificate",
"acm:ListCertificates",
"ec2:DescribeVpcs",
"ec2:DescribeInstances",
"ec2:DescribeAddresses",
"ec2:DescribeSnapshots",
"ec2:DescribeVolumeStatus",
"ec2:DescribeVolumes",
"ec2:DescribeAccountAttributes",
"ec2:DescribeKeyPairs",
"ec2:DescribeNetworkAcls",
"ec2:DescribeVpnConnections",
"ec2:DescribeNatGateways",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeRouteTables",
"ec2:DescribeInstanceStatus",
"ec2:DescribeImages",
"autoscaling:DescribeAutoScalingGroups",
"cloudwatch:GetMetricData",
"cloudwatch:ListMetrics",
"logs:DescribeLogGroups",
"iam:ListPolicies",
"iam:ListRoles",
"iam:ListUsers",
"iam:ListMFADevices",
"iam:ListAccessKeys",
"iam:GenerateCredentialReport",
"iam:GetCredentialReport",
"iam:ListVirtualMFADevices",
"iam:ListServerCertificates",
"elasticbeanstalk:DescribeEnvironments",
"elasticbeanstalk:DescribeInstancesHealth",
"elasticbeanstalk:DescribeApplications",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeTargetGroups",
"rds:DescribeEvents",
"rds:DescribeDBLogFiles",
"rds:DownloadDBLogFilePortion",
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:GetObject",
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"route53:ListHostedZones",
"wafv2:GetIPSet",
"wafv2:ListIPSets",
"wafv2:UpdateIPSet"
],
"Resource": "*"
}
]
}
WAF 쿼리 명령어를 사용하거나 차단 연동 기능을 사용하려면 아래 권한이 추가로 필요합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"wafv2:GetIPSet",
"wafv2:ListIPSets",
"wafv2:UpdateIPSet"
],
"Resource": "*"
}
]
}
ECR 쿼리 명령어를 사용하려면 아래 권한이 추가로 필요합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ecr:DescribeImageScanFindings",
"ecr:DescribeRegistry",
"ecr:GetAuthorizationToken",
"ecr:ListImages",
"ecr:GetRegistryScanningConfiguration",
"ecr:BatchGetImage",
"ecr:DescribeImages",
"ecr:DescribeRepositories",
"ecr:GetRepositoryPolicy",
"inspector2:ListCoverageStatistics",
"inspector2:ListFindings",
"inspector2:ListFindingAggregations",
"inspector2:ListCoverage",
"inspector2:GetFindingsReportStatus",
"inspector:ListFindings",
"inspector:DescribeFindings"
],
"Resource": "*"
}
]
}
단계 2: 정책 태그 추가
태그는 필요한 경우에만 설정하고 그냥 건너뛰어도 됩니다.
단계 3: 정책 검토
JSON에 따라 읽기 전용으로 정책이 구성된 것을 확인하고 정책 생성을 클릭하세요.
IAM 사용자 추가
단계 1: 사용자 이름 및 액세스 유형 설정
로그인이 요구되지 않는 사용자이므로 액세스 키 - 프로그래밍 방식 액세스를 선택하고 다음: 권한 버튼을 클릭하세요.
단계 2: IAM 정책 연결
기존 정책 직접 연결을 클릭하고 방금 생성한 logpresso
정책을 선택한 후 다음: 태그 버튼을 클릭하세요.
단계 3: 사용자 태그 설정
태그는 필요한 경우에만 설정하고 그냥 건너뛰어도 됩니다.
단계 4: 사용자 생성 검토
설정 내역을 확인하고 사용자 만들기 버튼을 클릭하세요.
단계 5: 액세스 키 복사
액세스 키 ID와 비밀 액세스 키를 복사하여 안전한 곳에 보관합니다. 이 단계를 지나가면 비밀 액세스 키를 확인할 수 없으므로 주의하세요.
AWS Aurora 로그 수집 환경 구성
단계 1: SQS 대기열 생성
유형, 이름, 액세스 정책은 다음에 열거된 값으로 사용하세요. 나머지 옵션은 기본값을 사용하거나, 운영 환경에 맞게 선택하세요.
-
유형:
FIFO
선택 -
이름:
logpresso-aws-aurora-das.fifo
입력 -
액세스 정책:
고급
선택 후 다음 액세스 정책을 참고하여 설정(REGION, ACCOUNT_ID를 환경에 맞게 수정){ "Version": "2012-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__owner_statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "SQS:*", "Resource": "arn:aws:sqs:REGION:ACCOUNT_ID:logpresso-aws-aurora-das.fifo" }, { "Sid": "__receiver_statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/logpresso" }, "Action": [ "SQS:ChangeMessageVisibility", "SQS:DeleteMessage", "SQS:ReceiveMessage" ], "Resource": "arn:aws:sqs:REGION:ACCOUNT_ID:logpresso-aws-aurora-das.fifo" } ] }
SQS 대기열 생성 직후 화면은 아래와 같습니다.
단계 2: Lambda 함수 생성
Lambda 서비스 화면에서 함수를 생성하세요. 이 함수는 S3에 로그 파일이 저장될 때마다 호출되어 SQS 대기열에 로그를 적재합니다.
-
함수 생성 방법은 새로 작성을 선택하고 기본 정보 옵션을 다음과 같이 입력하고 함수 생성 버튼을 클릭하세요. 여기에 명시되지 않은 다른 옵션들은 기본값을 사용하거나, 운영 환경에 맞게 선택하세요.
-
함수 이름:
logpresso-aws-aurora-das-log-producer
입력 -
런타임: Python 3.12
-
-
함수 생성 직후 화면은 아래와 같습니다.
코드 탭 화면에서 lambda_function.py의 내용을 다음 코드로 대체해야 합니다. 이때 변수
sqs_queue_url
에 할당된 문자열을 SQS 대기열logpresso-aws-aurora-das.fifo
의 URL로 수정하세요.import json import boto3 import gzip s3_client = boto3.client('s3') sqs_client = boto3.client('sqs') sqs_queue_url = 'https://sqs.REGION.amazonaws.com/ACCOUNT_ID/QUEUE' def lambda_handler(event, context): # process_s3_object('BUCKET_NAME', 'FILE_NAME') for record in event['Records']: bucket_name = record['s3']['bucket']['name'] object_key = record['s3']['object']['key'] process_s3_object(bucket_name, object_key) return { 'statusCode': 200, 'body': json.dumps('Completed') } def process_s3_object(bucket_name, object_key): response = s3_client.get_object(Bucket=bucket_name, Key=object_key) data = gzip.decompress(response['Body'].read()).decode('utf-8') lines = data.splitlines() filtered = [] i = 0 for line in lines: try: i = i + 1 log_entry = json.loads(line) # NOTE: Add your own filtering condition below if 'type' in log_entry: filtered.append(json.dumps(log_entry)) except: print('error object key ' + object_key + ' row #' + str(i)) continue dup_id = 0 if filtered: max_message_size = 128 * 1024 # 128KB current_message = [] current_size = 0 for log in filtered: log_size = len(log.encode('utf-8')) + 1 if current_size + log_size > max_message_size: send_message_to_sqs(sqs_queue_url, "\n".join(current_message), object_key, dup_id) dup_id = dup_id + 1 current_message = [log] current_size = log_size else: current_message.append(log) current_size += log_size if current_message: send_message_to_sqs(sqs_queue_url, "\n".join(current_message), object_key, dup_id) dup_id = dup_id + 1 def send_message_to_sqs(queue_url, message_body, object_key, dup_id): message_group_id = 'logpresso' message_deduplication_id = object_key.split('/')[-1] response = sqs_client.send_message( QueueUrl=queue_url, MessageBody=message_body, MessageGroupId=message_group_id, MessageDeduplicationId=object_key + str(dup_id) ) print(response) return response
단계 3: 가상 이벤트 테스트
Lambda 함수가 정상적으로 동작하는지 시험합니다. Test 버튼을 클릭하고 아래와 같이 가상 이벤트를 편집하세요.
간접 호출 버튼을 클릭해서 테스트가 잘 실행되는지 확인하세요.
단계 4: Lambda 인라인 정책
테스트가 잘 실행되었다면 Lambda 함수가 S3 서비스에 접근할 수 있도록 권한을 부여하세요.
-
구성 탭 화면에서 역할 이름을 클릭하세요. 화면이 IAM 서비스로 이동됩니다.
-
IAM 역할 화면에서 권한 추가 > 인라인 정책 생성 버튼을 클릭하세요.
-
정책 에디터 화면에 아래 JSON 파일을 복사하여 IAM 정책을 생성하세요(REGION, ACCOUNT_ID, BUCKET_NAME, QUEUE를 환경에 맞게 수정).
단계 5: Lambda 함수 트리거 추가
이제 함수 트리거를 추가합니다. S3에 로그 파일이 저장될 때마다 lambda 함수가 호출되도록 트리거 조건을 추가하세요.
-
함수 개요 화면에서 트리거 추가 버튼을 클릭하세요.
-
트리거 추가 화면에서 S3 버킷을 선택하고 이벤트 유형으로 모든 객체 생성 이벤트를 선택하세요. 경고 문구가 나타나면 확인을 체크하고 추가 버튼을 클릭하세요.
단계 6: 동작 확인
이제 모니터링 탭 화면에서 S3에 로그가 쌓일 때마다 Lambda 함수가 호출되는지 확인하세요.
로그프레소 수집 설정
AWS 앱을 설치하여 실행하고 설정의 접속 프로파일 메뉴로 이동합니다.
단계 1: 접속 프로파일
이 문서를 참고해 접속 프로파일을 추가하세요.
다음은 접속 프로파일 설정 중 필수 입력 항목입니다.
- 이름: 접속 프로파일을 식별할 고유한 이름
- 식별자: 로그프레소 쿼리 등에서 사용할 접속 프로파일의 고유 식별자
- 유형:
AWS
선택 - 타입: 액세스 키
- 클라이언트 리전:
ap-northeast-2
등 API 접속을 허용할 리전을 쉼표(,
)로 구분하여 입력 - 액세스 키 ID: IAM 사용자 추가 단계에서 복사한 액세스 키 ID(AKIA로 시작)
- 비밀 액세스 키: IAM 사용자 추가 단계에서 복사한 암호
접속 프로파일을 생성하면 확장 명령어를 사용할 수 있습니다.
단계 2: AWS CloudTrail 로그 수집 설정
이 문서를 참고해 수집기를 추가하세요. 로그를 암호화하려면 시스템 > 테이블에서 암호화가 적용된 테이블을 먼저 생성해야 합니다.
다음은 필수 입력 항목입니다.
-
이름: 수집기를 식별할 고유한 이름
-
주기: 5초
-
적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
-
수집 모델:
AWS CloudTrail
선택 -
테이블:
AWS_CLOUDTRAIL
로 시작하는 이름 입력 -
S3 버킷 리전: AWS CloudTrail 로그를 저장한 S3 버킷이 속한 리전
-
S3 버킷 이름: AWS CloudTrail 로그를 저장한 S3 버킷 이름
-
대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)
-
AWS 프로파일: AWS 접속 프로파일 이름
단계 3: AWS GuardDuty 로그 수집 설정
GuardDuty 콘솔에서 결과 내보내기 옵션을 선택한 다음 S3에 로그를 저장하도록 구성할 수 있습니다. AWS GuardDuty 수집기는 S3 버킷에 저장된 로그를 수집합니다.
다음은 필수 입력 항목입니다.
-
이름: 수집기를 식별할 고유한 이름
-
주기: 5초
-
적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
-
수집 모델:
AWS GuardDuty
선택 -
테이블:
AWS_GuardDuty
로 시작하는 이름 입력 -
S3 버킷 리전: AWS GuardDuty 로그를 저장한 S3 버킷이 속한 리전
-
S3 버킷 이름: AWS GuardDuty 로그를 저장한 S3 버킷 이름
-
대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)
-
AWS 프로파일: AWS 접속 프로파일 이름
단계 4: AWS WAF 로그 수집 설정
먼저 AWS WAF 콘솔에서 Web ACLs > Logging and metrics로 이동하여 S3 버킷에 로그를 기록하도록 설정하세요.
이 문서를 참고해 수집기를 추가하세요.
다음은 필수 입력 항목입니다.
- 이름: 수집기를 식별할 고유한 이름
- 주기: 5초
- 적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
- 수집 모델:
AWS WAF
선택 - 테이블:
AWS_WAF
로 시작하는 이름 입력 - S3 버킷 리전: AWS WAF 로그를 저장한 S3 버킷이 속한 리전
- S3 버킷 이름: AWS WAF 로그를 저장한 S3 버킷 이름
- WAF ACL 이름: 웹 액세스 제어 목록 이름
- 대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)
- AWS 프로파일: AWS 접속 프로파일 이름
단계 5: AWS Shield 로그 수집 설정
다음은 필수 입력 항목입니다.
-
이름: 수집기를 식별할 고유한 이름
-
주기: 5초
-
적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
-
수집 모델:
AWS Shield
선택 -
테이블:
AWS_SHIELD
로 시작하는 이름 입력 -
AWS 프로파일: AWS 접속 프로파일 이름
단계 6: AWS ALB 로그 수집 설정
AWS 로드밸런서의 속성 탭에서 액세스 로그를 활성화하고 S3 버킷에 저장할 수 있습니다. AWS ALB 수집기는 S3 버킷에 저장된 액세스 로그를 수집합니다.
다음은 필수 입력 항목입니다.
-
이름: 수집기를 식별할 고유한 이름
-
주기: 5초
-
적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
-
수집 모델:
AWS ALB
선택 -
테이블:
AWS_ALB
로 시작하는 이름 입력 -
S3 버킷 리전: AWS ALB 로그를 저장한 S3 버킷이 속한 리전
-
S3 버킷 이름: AWS ALB 로그를 저장한 S3 버킷 이름
-
대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)
-
AWS 프로파일: AWS 접속 프로파일 이름
단계 7: AWS Aurora DB 로그 수집 설정
다음은 필수 입력 항목입니다.
-
이름: 수집기를 식별할 고유한 이름
-
주기: 5초
-
적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
-
수집 모델:
AWS Aurora DB Activity
선택 -
테이블:
DBAC_AURORA
로 시작하는 이름 입력 -
AWS 프로파일: AWS 접속 프로파일 이름
-
AWS SQS URL: AWS SQS의 엔드포인트 URL 입력(예:
https://sqs.ap-northeast-2.amazonaws.com/ACCOUNT_ID/logpresso-aws-aurora-das.fifo
)
마무리
이제 모든 설치 작업이 완료되었습니다. 수집 메뉴에서 데이터가 잘 수집되는지 확인하고, 대시보드로 이동하세요!