로그 그룹 수준 구독 필터 - 아마존 CloudWatch 로그

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

로그 그룹 수준 구독 필터

Amazon Kinesis Data Streams와 함께 구독 필터를 사용할 수 있습니다. AWS Lambda또는 Amazon Data Firehose를 예로 들 수 있습니다. 구독 필터를 통해 서비스로 전송되는 로그는 base64로 인코딩되고 gzip 형식으로 압축됩니다. 이 섹션에서는 Firehose, Lambda 및 Kinesis Data CloudWatch Streams로 로그 데이터를 전송하는 로그 구독 필터를 생성하기 위해 따를 수 있는 예를 제공합니다.

참고

로그 데이터를 검색하려면 필터 및 패턴 구문을 참조하십시오.

예제 1: Kinesis Data Streams에 대한 구독 필터

다음 예제는 구독 필터를 다음을 포함하는 로그 그룹과 연결합니다. AWS CloudTrail 이벤트. 구독 필터는 “Root”가 기록한 모든 활동을 전달합니다. AWS Kinesis Data Streams의 스트림에 대한 자격 증명 RootAccess “.” 전송 방법에 대한 자세한 내용은 AWS CloudTrail 이벤트를 CloudWatch 로그로 보내려면 CloudWatch 로그에 CloudTrail 이벤트 전송을 참조하십시오. AWS CloudTrail 사용 설명서.

참고

스트림을 생성하기 전에 생성할 로그 데이터의 볼륨을 계산합니다. 이 볼륨을 처리하기에 충분한 샤드로 스트림을 생성해야 합니다. 스트림에 샤드가 충분하지 않을 경우에는 로그 스트림에서 병목 현상이 발생합니다. 스트림 볼륨 제한에 대한 자세한 내용은 할당량 및 제한을 참조하세요.

제한된 결과물은 최대 24시간 동안 재시도됩니다. 24시간이 지나면 실패한 결과물이 삭제됩니다.

제한의 위험을 완화하려면 다음 단계를 수행하세요.

  • PutSubscriptionFilter또는 random 를 사용하여 구독 필터를 생성할 distribution 시기를 put-subscription-filter지정하십시오. 기본적으로 스트림 필터 배포는 로그 스트림별로 이루어지므로 병목 현상이 발생할 수 있습니다.

  • 측정치를 사용하여 CloudWatch 스트림을 모니터링하세요. 이렇게 하면 제한을 식별하고 그에 따라 구성을 조정할 수 있습니다. 예를 들어, DeliveryThrottling 지표를 사용하여 구독 대상으로 데이터를 전달할 때 로그가 병목 현상이 발생한 CloudWatch 로그 이벤트 수를 추적할 수 있습니다. 모니터링에 대한 자세한 내용은 CloudWatch 메트릭을 사용한 모니터링 섹션을 참조하세요.

  • Kinesis Data Streams의 스트림에 대해 온디맨드 용량 모드를 사용합니다. 온디맨드 모드는 워크로드가 확장 또는 축소될 때 즉시 워크로드를 수용합니다. 온디맨드 용량 모드에 대한 자세한 내용은 온디맨드 모드를 참조하세요.

  • Kinesis Data Streams의 스트림 용량과 일치하도록 CloudWatch 구독 필터 패턴을 제한하십시오. 스트림에 너무 많은 데이터를 전송하는 경우 필터 크기를 줄이거나 필터 기준을 조정해야 할 수 있습니다.

Kinesis Data Streams에 대한 구독 필터를 생성하려면
  1. 다음 명령을 사용하여 대상 스트림을 생성합니다.

    $ C:\> aws kinesis create-stream --stream-name "RootAccess" --shard-count 1
  2. 스트림이 활성 상태가 될 때까지 기다립니다(1~2분 정도 소요). 다음 Kinesis Data Streams 설명-스트림 명령을 사용하여 확인할 수 있습니다. StreamDescription StreamStatus속성. 또한 나중 단계에서 필요하므로 StreamDescription.Stream ARN 값을 기록해 둡니다.

    aws kinesis describe-stream --stream-name "RootAccess"

    다음은 예 출력입니다.

    { "StreamDescription": { "StreamStatus": "ACTIVE", "StreamName": "RootAccess", "StreamARN": "arn:aws:kinesis:us-east-1:123456789012:stream/RootAccess", "Shards": [ { "ShardId": "shardId-000000000000", "HashKeyRange": { "EndingHashKey": "340282366920938463463374607431768211455", "StartingHashKey": "0" }, "SequenceNumberRange": { "StartingSequenceNumber": "49551135218688818456679503831981458784591352702181572610" } } ] } }
  3. 스트림에 데이터를 넣을 수 있는 권한을 CloudWatch Logs (로그) 에 부여하는 IAM 역할을 생성하세요. 먼저 신뢰 정책을 파일로 생성해야 합니다(예: ~/TrustPolicyForCWL-Kinesis.json). 텍스트 편집기를 사용하여 이 정책을 생성하세요. IAM콘솔을 사용하여 만들지 마세요.

    이 정책에는 혼동된 대리자 보안 문제를 방지하는 데 도움이 되는 aws:SourceArn 글로벌 조건 컨텍스트 키가 포함되어 있습니다. 자세한 내용은 혼동된 대리자 방지 단원을 참조하십시오.

    { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } } } }
  4. create-role 명령을 사용하여 신뢰 정책 파일을 지정하여 IAM 역할을 생성합니다. 이후 단계에서 필요할 수 있기 때문에 반환된 Role.Arn 값을 적어둡니다.

    aws iam create-role --role-name CWLtoKinesisRole --assume-role-policy-document file://~/TrustPolicyForCWL-Kinesis.json

    다음은 출력의 예제입니다.

    { "Role": { "AssumeRolePolicyDocument": { "Statement": { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Condition": { "StringLike": { "aws:SourceArn": { "arn:aws:logs:region:123456789012:*" } } } } }, "RoleId": "AAOIIAH450GAB4HC5F431", "CreateDate": "2015-05-29T13:46:29.431Z", "RoleName": "CWLtoKinesisRole", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/CWLtoKinesisRole" } }
  5. 권한 정책을 생성하여 CloudWatch 로그가 계정에서 수행할 수 있는 작업을 정의합니다. 먼저 권한 정책을 파일로 생성합니다(예: ~/PermissionsForCWL-Kinesis.json). 텍스트 편집기를 사용하여 이 정책을 생성하세요. IAM콘솔을 사용하여 만들지 마세요.

    { "Statement": [ { "Effect": "Allow", "Action": "kinesis:PutRecord", "Resource": "arn:aws:kinesis:region:123456789012:stream/RootAccess" } ] }
  6. 다음 put-role-policy명령을 사용하여 권한 정책을 역할에 연결합니다.

    aws iam put-role-policy --role-name CWLtoKinesisRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL-Kinesis.json
  7. 스트림이 활성 상태가 되고 IAM 역할을 만든 후에는 CloudWatch 로그 구독 필터를 만들 수 있습니다. 그 즉시 구독 필터는 실시간으로 선택한 로그 그룹에서 스트림으로 로그 데이터를 이동시키기 시작합니다.

    aws logs put-subscription-filter \ --log-group-name "CloudTrail/logs" \ --filter-name "RootAccess" \ --filter-pattern "{$.userIdentity.type = Root}" \ --destination-arn "arn:aws:kinesis:region:123456789012:stream/RootAccess" \ --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisRole"
  8. 구독 필터를 설정하면 CloudWatch Logs는 필터 패턴과 일치하는 모든 수신 로그 이벤트를 스트림에 전달합니다. Kinesis Data Streams 샤드 반복자를 확보하고 Kinesis Data Streams get-records 명령을 사용해 몇몇 Kinesis Data Streams 레코드를 가져와서 이러한 작업이 수행되고 있는지 확인할 수 있습니다.

    aws kinesis get-shard-iterator --stream-name RootAccess --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON
    { "ShardIterator": "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiK2OSh0uP" }
    aws kinesis get-records --limit 10 --shard-iterator "AAAAAAAAAAFGU/kLvNggvndHq2UIFOw5PZc6F01s3e3afsSscRM70JSbjIefg2ub07nk1y6CDxYR1UoGHJNP4m4NFUetzfL+wev+e2P4djJg4L9wmXKvQYoE+rMUiFq+p4Cn3IgvqOb5dRA0yybNdRcdzvnC35KQANoHzzahKdRGb9v4scv+3vaq+f+OIK8zM5My8ID+g6rMo7UKWeI4+IWiK2OSh0uP"

    이 호출을 몇 차례 반복해야 Kinesis Data Streams가 데이터 반환을 시작할 수 있습니다.

    레코드 어레이에서 응답을 확인할 수 있습니다. Kinesis Data Streams 레코드의 데이터 속성은 base64로 인코딩되고 gzip 형식으로 압축됩니다. 다음 Unix 명령을 사용하여 명령줄에서 원시 데이터를 검토할 수 있습니다.

    echo -n "<Content of Data>" | base64 -d | zcat

    base64로 디코딩되고 압축 해제된 데이터의 형식은 다음과 같습니다JSON.

    { "owner": "111111111111", "logGroup": "CloudTrail/logs", "logStream": "111111111111_CloudTrail/logs_us-east-1", "subscriptionFilters": [ "Destination" ], "messageType": "DATA_MESSAGE", "logEvents": [ { "id": "31953106606966983378809025079804211143289615424298221568", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" }, { "id": "31953106606966983378809025079804211143289615424298221569", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" }, { "id": "31953106606966983378809025079804211143289615424298221570", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" } ] }

    위의 데이터 구조에서 키 요소는 다음과 같습니다.

    owner

    The AWS 원본 로그 데이터의 계정 ID.

    logGroup

    원본 로그 데이터의 로그 그룹 이름입니다.

    logStream

    원본 로그 데이터의 로그 스트림 이름입니다.

    subscriptionFilters

    원본 로그 데이터과 일치한 구독 필터 이름 목록입니다.

    messageType

    데이터 메시지는 "DATA_MESSAGE" 유형을 사용합니다. CloudWatch Logs는 주로 대상에 연결할 수 있는지 확인하기 위해 CONTROL "MESSAGE_" 유형의 Kinesis Data Streams 레코드를 내보내는 경우가 있습니다.

    logEvents

    로그 이벤트 레코드 어레이 형태로 표현되는 실제 로그 데이터입니다. "ID" 속성은 모든 로그 이벤트의 고유 식별자입니다.

예 2: 다음을 포함하는 구독 필터 AWS Lambda

이 예시에서는 CloudWatch 로그 데이터를 다음 주소로 보내는 Logs 구독 필터를 만들어 보겠습니다. AWS Lambda 함수.

참고

Lambda 함수를 생성하기 전에 생성할 로그 데이터의 볼륨을 계산합니다. 이 볼륨을 처리할 수 있는 함수를 생성해야 합니다. 함수에 볼륨이 충분하지 않을 경우에는 로그 스트림에서 병목 현상이 발생합니다. Lambda 한도에 대한 자세한 내용은 을 참조하십시오. AWS Lambda 한도.

Lambda에 대한 구독 필터를 생성하려면
  1. 생성하기 AWS Lambda 함수.

    Lambda 실행 역할이 설정되었는지 확인합니다. 자세한 내용은 2.2단계: IAM 역할 (실행 역할) 생성을 참조하십시오. AWS Lambda 개발자 가이드.

  2. 다음 콘텐츠로 텍스트 편집기를 열고 helloWorld.js라는 파일을 생성합니다.

    var zlib = require('zlib'); exports.handler = function(input, context) { var payload = Buffer.from(input.awslogs.data, 'base64'); zlib.gunzip(payload, function(e, result) { if (e) { context.fail(e); } else { result = JSON.parse(result.toString()); console.log("Event Data:", JSON.stringify(result, null, 2)); context.succeed(); } }); };
  3. helloWorld.js 파일을 압축하고 이름과 helloWorld.zip 함께 저장합니다.

  4. 역할이 첫 단계에서 설정한 Lambda 실행 역할인 경우에는 다음 명령을 사용하세요.

    aws lambda create-function \ --function-name helloworld \ --zip-file fileb://file-path/helloWorld.zip \ --role lambda-execution-role-arn \ --handler helloWorld.handler \ --runtime nodejs12.x
  5. CloudWatch Logs에 함수 실행 권한을 부여합니다. 다음 명령을 사용하여 자리 표시자 계정을 자체 계정으로, 자리 표시자 그룹을 처리할 로그 그룹으로 바꿉니다.

    aws lambda add-permission \ --function-name "helloworld" \ --statement-id "helloworld" \ --principal "logs.amazonaws.com" \ --action "lambda:InvokeFunction" \ --source-arn "arn:aws:logs:region:123456789123:log-group:TestLambda:*" \ --source-account "123456789012"
  6. 다음 명령을 사용하여 구독 필터를 생성하여 자리 표시자 계정을 자체 계정으로, 자리 표시자 그룹을 처리할 로그 그룹으로 바꿉니다.

    aws logs put-subscription-filter \ --log-group-name myLogGroup \ --filter-name demo \ --filter-pattern "" \ --destination-arn arn:aws:lambda:region:123456789123:function:helloworld
  7. (선택 사항) 샘플 로그 이벤트를 사용하여 테스트합니다. 명령 프롬프트에서 다음 명령을 실행하여 구독된 스트림으로 간단한 로그 메시지를 보냅니다.

    Lambda 함수의 출력을 보려면 /aws/lambda/helloworld에 출력이 표시되는 Lambda 함수를 탐색합니다.

    aws logs put-log-events --log-group-name myLogGroup --log-stream-name stream1 --log-events "[{\"timestamp\":<CURRENT TIMESTAMP MILLIS> , \"message\": \"Simple Lambda Test\"}]"

    Lambda 어레이에서 응답을 확인할 수 있습니다. Lambda 레코드의 데이터 속성은 base64로 인코딩되고 gzip 형식으로 압축됩니다. Lambda가 수신하는 실제 페이로드는 { "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} } 형식을 따릅니다. 다음 Unix 명령을 사용하여 명령줄에서 원시 데이터를 검토할 수 있습니다.

    echo -n "<BASE64ENCODED_GZIP_COMPRESSED_DATA>" | base64 -d | zcat

    base64로 디코딩되고 압축 해제된 데이터의 형식은 다음과 같습니다JSON.

    { "owner": "123456789012", "logGroup": "CloudTrail", "logStream": "123456789012_CloudTrail_us-east-1", "subscriptionFilters": [ "Destination" ], "messageType": "DATA_MESSAGE", "logEvents": [ { "id": "31953106606966983378809025079804211143289615424298221568", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" }, { "id": "31953106606966983378809025079804211143289615424298221569", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" }, { "id": "31953106606966983378809025079804211143289615424298221570", "timestamp": 1432826855000, "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root\"}" } ] }

    위의 데이터 구조에서 키 요소는 다음과 같습니다.

    owner

    The AWS 원본 로그 데이터의 계정 ID.

    logGroup

    원본 로그 데이터의 로그 그룹 이름입니다.

    logStream

    원본 로그 데이터의 로그 스트림 이름입니다.

    subscriptionFilters

    원본 로그 데이터과 일치한 구독 필터 이름 목록입니다.

    messageType

    데이터 메시지는 "DATA_MESSAGE" 유형을 사용합니다. 때때로 CloudWatch Logs는 주로 대상에 도달할 수 있는지 확인하기 위해 CONTROL "MESSAGE_" 유형의 Lambda 레코드를 내보낼 수 있습니다.

    logEvents

    로그 이벤트 레코드 어레이 형태로 표현되는 실제 로그 데이터입니다. "ID" 속성은 모든 로그 이벤트의 고유 식별자입니다.

예제 3: Amazon Data Firehose를 사용한 구독 필터

이 예시에서는 정의된 필터와 일치하는 수신 로그 이벤트를 Amazon Data Firehose 전송 스트림으로 보내는 CloudWatch Logs 구독을 생성합니다. CloudWatch Logs에서 Amazon Data Firehose로 전송된 데이터는 이미 gzip 레벨 6 압축으로 압축되었으므로 Firehose 전송 스트림 내에서 압축을 사용할 필요가 없습니다. 그런 다음 Firehose의 압축 해제 기능을 사용하여 로그의 압축을 자동으로 해제할 수 있습니다. 자세한 내용은 로그를 사용하여 Kinesis Data CloudWatch Firehose에 쓰기를 참조하십시오.

참고

Firehose 스트림을 만들기 전에 생성될 로그 데이터의 양을 계산하세요. 이 볼륨을 처리할 수 있는 Firehose 스트림을 만들어야 합니다. 스트림이 볼륨을 처리할 수 없는 경우에는 로그 스트림에서 병목 현상이 발생합니다. Firehose 스트림 볼륨 제한에 대한 자세한 내용은 Amazon 데이터 Firehose 데이터 제한을 참조하십시오.

Firehose용 구독 필터를 만들려면
  1. Amazon Simple Storage Service(S3) 버킷을 생성합니다. CloudWatch 로그용으로 특별히 만든 버킷을 사용하는 것이 좋습니다. 그러나 기존 버킷을 사용하고 싶으면 2단계로 건너뛸 수 있습니다.

    다음 명령을 실행하여 자리 표시자 리전을 사용하고자 하는 리전으로 바꿉니다.

    aws s3api create-bucket --bucket my-bucket --create-bucket-configuration LocationConstraint=region

    다음은 예 출력입니다.

    { "Location": "/my-bucket" }
  2. Amazon Data Firehose에 Amazon S3 버킷에 데이터를 넣을 수 있는 권한을 부여하는 IAM 역할을 생성합니다.

    자세한 내용은 Amazon Data Firehose 개발자 안내서의 Amazon Data Firehose를 사용한 액세스 제어를 참조하십시오.

    먼저 텍스트 편집기를 사용하여 신뢰 정책을 다음과 같은 ~/TrustPolicyForFirehose.json 파일로 생성합니다.

    { "Statement": { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } }
  3. create-role 명령을 사용하여 역할을 생성하고 신뢰 정책 IAM 파일을 지정합니다. 이후 단계에서 필요할 수 있기 때문에 반환된 Role.Arn 값을 적어둡니다.

    aws iam create-role \ --role-name FirehosetoS3Role \ --assume-role-policy-document file://~/TrustPolicyForFirehose.json { "Role": { "AssumeRolePolicyDocument": { "Statement": { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" } } }, "RoleId": "AAOIIAH450GAB4HC5F431", "CreateDate": "2015-05-29T13:46:29.431Z", "RoleName": "FirehosetoS3Role", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/FirehosetoS3Role" } }
  4. 권한 정책을 만들어 Firehose가 계정에서 수행할 수 있는 작업을 정의하세요. 먼저 텍스트 편집기를 사용하여 권한 정책을 ~/PermissionsForFirehose.json 파일로 생성합니다.

    { "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } ] }
  5. 다음 put-role-policy 명령어를 사용하여 권한 정책을 역할에 연결합니다.

    aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json
  6. 다음과 같이 대상 Firehose 전송 스트림을 만들고 역할 및 버킷의 자리 표시자 값을 ARNs 생성한 역할 ARNARN버킷으로 바꿉니다.

    aws firehose create-delivery-stream \ --delivery-stream-name 'my-delivery-stream' \ --s3-destination-configuration \ '{"RoleARN": "arn:aws:iam::123456789012:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::my-bucket"}'

    참고로 Firehose는 전달된 Amazon S3 객체에 대해 YYYY /MM/DD/HH UTC 시간 형식의 접두사를 자동으로 사용합니다. 시간 형식 접두사 앞에 추가할 또 다른 접두사를 지정할 수 있습니다. 슬래시(/)로 끝난 접두사는 Amazon S3 버킷에서 자리 표시자로 표시됩니다.

  7. 스트림이 활성 상태가 될 때가지 기다립니다(몇 분 소요). Firehose describe-delivery-stream명령을 사용하여 확인할 수 있습니다. DeliveryStreamDescription DeliveryStreamStatus속성. 또한 다음을 참고하십시오 DeliveryStreamDescription. DeliveryStreamARN값은 이후 단계에서 필요하므로 다음과 같습니다.

    aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream" { "DeliveryStreamDescription": { "HasMoreDestinations": false, "VersionId": "1", "CreateTimestamp": 1446075815.822, "DeliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/my-delivery-stream", "DeliveryStreamStatus": "ACTIVE", "DeliveryStreamName": "my-delivery-stream", "Destinations": [ { "DestinationId": "destinationId-000000000001", "S3DestinationDescription": { "CompressionFormat": "UNCOMPRESSED", "EncryptionConfiguration": { "NoEncryptionConfig": "NoEncryption" }, "RoleARN": "delivery-stream-role", "BucketARN": "arn:aws:s3:::my-bucket", "BufferingHints": { "IntervalInSeconds": 300, "SizeInMBs": 5 } } } ] } }
  8. Firehose 전송 스트림에 데이터를 넣을 수 있는 권한을 CloudWatch Logs 에 부여하는 IAM 역할을 만드세요. 먼저 텍스트 편집기를 사용하여 신뢰 정책을 ~/TrustPolicyForCWL.json 파일로 생성합니다.

    이 정책에는 혼동된 대리자 보안 문제를 방지하는 데 도움이 되는 aws:SourceArn 글로벌 조건 컨텍스트 키가 포함되어 있습니다. 자세한 내용은 혼동된 대리자 방지 단원을 참조하십시오.

    { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } } } }
  9. create-role 명령어를 사용하여 신뢰 정책 파일을 지정하여 IAM 역할을 생성합니다. 이후 단계에서 필요할 수 있기 때문에 반환된 Role.Arn 값을 적어둡니다.

    aws iam create-role \ --role-name CWLtoKinesisFirehoseRole \ --assume-role-policy-document file://~/TrustPolicyForCWL.json { "Role": { "AssumeRolePolicyDocument": { "Statement": { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } } } }, "RoleId": "AAOIIAH450GAB4HC5F431", "CreateDate": "2015-05-29T13:46:29.431Z", "RoleName": "CWLtoKinesisFirehoseRole", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole" } }
  10. 권한 정책을 생성하여 CloudWatch 로그가 계정에서 수행할 수 있는 작업을 정의합니다. 먼저 텍스트 편집기를 사용하여 권한 정책을 파일로 생성합니다(예: ~/PermissionsForCWL.json).

    { "Statement":[ { "Effect":"Allow", "Action":["firehose:PutRecord"], "Resource":[ "arn:aws:firehose:region:account-id:deliverystream/delivery-stream-name"] } ] }
  11. 다음 put-role-policy 명령을 사용하여 권한 정책을 역할과 연결합니다.

    aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL.json
  12. Amazon Data Firehose 전송 스트림이 활성 상태가 되고 IAM 역할을 생성한 후 CloudWatch Logs 구독 필터를 생성할 수 있습니다. 구독 필터는 선택한 로그 그룹에서 Amazon Data Firehose 전송 스트림으로의 실시간 로그 데이터 흐름을 즉시 시작합니다.

    aws logs put-subscription-filter \ --log-group-name "CloudTrail" \ --filter-name "Destination" \ --filter-pattern "{$.userIdentity.type = Root}" \ --destination-arn "arn:aws:firehose:region:123456789012:deliverystream/my-delivery-stream" \ --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole"
  13. 구독 필터를 설정하면 CloudWatch Logs는 필터 패턴과 일치하는 모든 수신 로그 이벤트를 Amazon Data Firehose 전송 스트림으로 전달합니다. Amazon Data Firehose 전송 스트림에 설정된 시간 버퍼 간격을 기준으로 데이터가 Amazon S3에 표시되기 시작합니다. 충분한 시간이 지나고 나면 Amazon S3 버킷을 확인하여 데이터를 확인할 수 있습니다.

    aws s3api list-objects --bucket 'my-bucket' --prefix 'firehose/' { "Contents": [ { "LastModified": "2015-10-29T00:01:25.000Z", "ETag": "\"a14589f8897f4089d3264d9e2d1f1610\"", "StorageClass": "STANDARD", "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250", "Owner": { "DisplayName": "cloudwatch-logs", "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b5" }, "Size": 593 }, { "LastModified": "2015-10-29T00:35:41.000Z", "ETag": "\"a7035b65872bb2161388ffb63dd1aec5\"", "StorageClass": "STANDARD", "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-35-40-7cc92023-7e66-49bc-9fd4-fc9819cc8ed3", "Owner": { "DisplayName": "cloudwatch-logs", "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b6" }, "Size": 5752 } ] }
    aws s3api get-object --bucket 'my-bucket' --key 'firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250' testfile.gz { "AcceptRanges": "bytes", "ContentType": "application/octet-stream", "LastModified": "Thu, 29 Oct 2015 00:07:06 GMT", "ContentLength": 593, "Metadata": {} }

    Amazon S3 객체의 데이터는 gzip 형식으로 압축됩니다. 다음 Unix 명령을 사용하여 명령줄에서 원시 데이터를 검토할 수 있습니다.

    zcat testfile.gz