AWS

다운로드 287
업데이트 2024. 2. 21.

설치 매뉴얼

AWS IAM 정책 설정

AWS API를 호출하려면 먼저 AWS IAM 정책과 계정을 설정해야 합니다.

단계 1: 정책 JSON 입력

IAM 서비스 화면에서 아래 JSON 파일을 복사하여 IAM 정책을 생성하세요. 아래 정책은 읽기 전용 권한만 존재하지만 대상이 전체 리소스로 되어있으므로, 로그프레소가 읽기 가능한 클라우드 리소스 범위를 제한하시기 바랍니다. 사용하지 않는 권한은 삭제하셔도 됩니다.

AWS 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: 정책 태그 추가

태그는 필요한 경우에만 설정하고 그냥 건너뛰어도 됩니다.

IAM 정책 태그 추가

단계 3: 정책 검토

JSON에 따라 읽기 전용으로 정책이 구성된 것을 확인하고 정책 생성을 클릭하세요.

IAM 정책 검토

IAM 사용자 추가

단계 1: 사용자 이름 및 액세스 유형 설정

로그인이 요구되지 않는 사용자이므로 액세스 키 - 프로그래밍 방식 액세스를 선택하고 다음: 권한 버튼을 클릭하세요.

IAM 사용자 이름 및 액세스 유형 설정

단계 2: IAM 정책 연결

기존 정책 직접 연결을 클릭하고 방금 생성한 logpresso 정책을 선택한 후 다음: 태그 버튼을 클릭하세요.

IAM 정책 연결

단계 3: 사용자 태그 설정

태그는 필요한 경우에만 설정하고 그냥 건너뛰어도 됩니다.

IAM 사용자 태그 설정

단계 4: 사용자 생성 검토

설정 내역을 확인하고 사용자 만들기 버튼을 클릭하세요.

IAM 사용자 생성 검토

단계 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"
        }
      ]
    }
    
Caution
SQS 대기열 생성 후 Lambda 트리거를 설정하지 마세요. Lambda는 다음 단계에서 별도로 설정합니다.

SQS 대기열 생성 직후 화면은 아래와 같습니다.

SQS 대기열 생성

단계 2: Lambda 함수 생성

Lambda 서비스 화면에서 함수를 생성하세요. 이 함수는 S3에 로그 파일이 저장될 때마다 호출되어 SQS 대기열에 로그를 적재합니다.

  1. 함수 생성 방법은 새로 작성을 선택하고 기본 정보 옵션을 다음과 같이 입력하고 함수 생성 버튼을 클릭하세요. 여기에 명시되지 않은 다른 옵션들은 기본값을 사용하거나, 운영 환경에 맞게 선택하세요.

    • 함수 이름: logpresso-aws-aurora-das-log-producer 입력

    • 런타임: Python 3.12

  2. 함수 생성 직후 화면은 아래와 같습니다.

    Lambda 함수 생성

    코드 탭 화면에서 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 버튼을 클릭하고 아래와 같이 가상 이벤트를 편집하세요.

Lambda 테스트 이벤트 구성

간접 호출 버튼을 클릭해서 테스트가 잘 실행되는지 확인하세요.

단계 4: Lambda 인라인 정책

테스트가 잘 실행되었다면 Lambda 함수가 S3 서비스에 접근할 수 있도록 권한을 부여하세요.

  1. 구성 탭 화면에서 역할 이름을 클릭하세요. 화면이 IAM 서비스로 이동됩니다.

    역할 이름을 클릭해 IAM 서비스로 이동

  2. IAM 역할 화면에서 권한 추가 > 인라인 정책 생성 버튼을 클릭하세요.

    인라인 정책 생성 실행

  3. 정책 에디터 화면에 아래 JSON 파일을 복사하여 IAM 정책을 생성하세요(REGION, ACCOUNT_ID, BUCKET_NAME, QUEUE를 환경에 맞게 수정).

    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "Statement1",
    			"Effect": "Allow",
    			"Action": [
    				"s3:GetObject",
    				"sqs:SendMessage"
    			],
    			"Resource": [
    				"arn:aws:s3:::BUCKET_NAME",
    				"arn:aws:s3:::BUCKET_NAME/*",
    				"arn:aws:sqs:REGION:ACCOUNT_ID:QUEUE.fifo"
    			]
    		}
    	]
    }
    

단계 5: Lambda 함수 트리거 추가

이제 함수 트리거를 추가합니다. S3에 로그 파일이 저장될 때마다 lambda 함수가 호출되도록 트리거 조건을 추가하세요.

  1. 함수 개요 화면에서 트리거 추가 버튼을 클릭하세요.

  2. 트리거 추가 화면에서 S3 버킷을 선택하고 이벤트 유형으로 모든 객체 생성 이벤트를 선택하세요. 경고 문구가 나타나면 확인을 체크하고 추가 버튼을 클릭하세요.

    Lambda 함수 트리거 추가

단계 6: 동작 확인

이제 모니터링 탭 화면에서 S3에 로그가 쌓일 때마다 Lambda 함수가 호출되는지 확인하세요.

Lambda 함수 모니터링

로그프레소 수집 설정

AWS 앱을 설치하여 실행하고 설정의 접속 프로파일 메뉴로 이동합니다.

단계 1: 접속 프로파일

이 문서를 참고해 접속 프로파일을 추가하세요.

AWS 접속 프로파일 설정

다음은 접속 프로파일 설정 중 필수 입력 항목입니다.

  • 이름: 접속 프로파일을 식별할 고유한 이름
  • 식별자: 로그프레소 쿼리 등에서 사용할 접속 프로파일의 고유 식별자
  • 유형: AWS 선택
  • 타입: 액세스 키
  • 클라이언트 리전: ap-northeast-2 등 API 접속을 허용할 리전을 쉼표(,)로 구분하여 입력
  • 액세스 키 ID: IAM 사용자 추가 단계에서 복사한 액세스 키 ID(AKIA로 시작)
  • 비밀 액세스 키: IAM 사용자 추가 단계에서 복사한 암호

접속 프로파일을 생성하면 확장 명령어를 사용할 수 있습니다.

단계 2: AWS CloudTrail 로그 수집 설정

이 문서를 참고해 수집기를 추가하세요. 로그를 암호화하려면 시스템 > 테이블에서 암호화가 적용된 테이블을 먼저 생성해야 합니다.

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 버킷에 저장된 로그를 수집합니다.

AWS GuardDuty 로그 수집 설정

다음은 필수 입력 항목입니다.

  • 이름: 수집기를 식별할 고유한 이름

  • 주기: 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 버킷에 로그를 기록하도록 설정하세요.

AWS WAF S3 로그 기록 설정

이 문서를 참고해 수집기를 추가하세요.

AWS WAF 로그 수집 설정

다음은 필수 입력 항목입니다.

  • 이름: 수집기를 식별할 고유한 이름
  • 주기: 5초
  • 적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택
  • 수집 모델: AWS WAF 선택
  • 테이블: AWS_WAF로 시작하는 이름 입력
  • S3 버킷 리전: AWS WAF 로그를 저장한 S3 버킷이 속한 리전
  • S3 버킷 이름: AWS WAF 로그를 저장한 S3 버킷 이름
  • WAF ACL 이름: 웹 액세스 제어 목록 이름
  • 대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)
  • AWS 프로파일: AWS 접속 프로파일 이름

단계 5: AWS Shield 로그 수집 설정

AWS GuardDuty 로그 수집 설정

다음은 필수 입력 항목입니다.

  • 이름: 수집기를 식별할 고유한 이름

  • 주기: 5초

  • 적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택

  • 수집 모델: AWS Shield 선택

  • 테이블: AWS_SHIELD로 시작하는 이름 입력

  • AWS 프로파일: AWS 접속 프로파일 이름

단계 6: AWS ALB 로그 수집 설정

AWS 로드밸런서의 속성 탭에서 액세스 로그를 활성화하고 S3 버킷에 저장할 수 있습니다. AWS ALB 수집기는 S3 버킷에 저장된 액세스 로그를 수집합니다.

AWS ALB 로그 수집 설정

다음은 필수 입력 항목입니다.

  • 이름: 수집기를 식별할 고유한 이름

  • 주기: 5초

  • 적재 위치/수집 위치: 로그프레소 플랫폼 구성에 따라 적합한 노드 선택

  • 수집 모델: AWS ALB 선택

  • 테이블: AWS_ALB로 시작하는 이름 입력

  • S3 버킷 리전: AWS ALB 로그를 저장한 S3 버킷이 속한 리전

  • S3 버킷 이름: AWS ALB 로그를 저장한 S3 버킷 이름

  • 대상 기간: 수집 대상 로그의 기간 범위(기본값: 0)

  • AWS 프로파일: AWS 접속 프로파일 이름

단계 7: AWS Aurora DB 로그 수집 설정

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)

마무리

이제 모든 설치 작업이 완료되었습니다. 수집 메뉴에서 데이터가 잘 수집되는지 확인하고, 대시보드로 이동하세요!