로그 그룹 수준 구독 필터 - Amazon CloudWatch Logs

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

로그 그룹 수준 구독 필터

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

참고

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

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

다음 예제에서는 AWS CloudTrail 이벤트를 포함하는 로그 그룹에 구독 필터를 연결합니다. 구독 필터는 'Root' AWS 보안 인증에 의해 기록된 모든 로그 활동을 'RootAccess'라는 Kinesis Data Streams의 스트림에 전달합니다. CloudWatch Logs로 AWS CloudTrail 이벤트를 보내는 방법에 대한 자세한 내용은 AWS CloudTrail 사용 설명서CloudWatch Logs로 CloudTrail 이벤트 보내기를 참조하세요.

참고

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

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

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

  • PutSubscriptionFilter 또는 put-subscription-filter를 사용하여 구독 필터를 생성할 때 distributionrandom을 지정합니다. 기본적으로 스트림 필터 배포는 로그 스트림에 의해 이루어지며 이로 인해 스로틀링이 발생할 수 있습니다.

  • CloudWatch 지표를 사용하여 스트림 모니터링합니다. 이렇게 하면 제한을 식별하고 그에 따라 구성을 조정할 수 있습니다. 예를 들어, DeliveryThrottling 지표는 데이터를 구독 대상으로 전송할 때 CloudWatch Logs에 병목 현상이 발생한 로그 이벤트 수를 추적하는 데 사용될 수 있습니다. 모니터링에 대한 자세한 내용은 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 describe-stream 명령을 사용하여 StreamDescription.StreamStatus 속성을 확인할 수 있습니다. 뿐만 아니라 이후 단계에서 필요할 수 있기 때문에 StreamDescription.StreamARN 값을 적어둡니다.

    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 Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 권한 정책을 파일로 생성합니다(예: ~/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. 스트림이 Active 상태에 있고 IAM 역할을 생성하고 나면 CloudWatch Logs 구독 필터를 생성할 수 있습니다. 그 즉시 구독 필터는 실시간으로 선택한 로그 그룹에서 스트림으로 로그 데이터를 이동시키기 시작합니다.

    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

    원본 로그 데이터의 AWS 계정 ID입니다.

    logGroup

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

    logStream

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

    subscriptionFilters

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

    messageType

    데이터 메시지는 "DATA_MESSAGE" 유형을 사용합니다. 때로 CloudWatch Logs는 주로 대상이 도달 가능한지 확인하기 위한 목적으로 "CONTROL_MESSAGE" 유형을 가진 Kinesis Data Streams 레코드를 출력할 수 있습니다.

    logEvents

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

예제 2: AWS Lambda에 대한 구독 필터

이 예제에서는 AWS Lambda 함수에 로그 데이터를 전송하는 CloudWatch Logs 구독 필터를 생성합니다.

참고

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

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

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

  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

    원본 로그 데이터의 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의 압축 해제 기능을 사용하여 로그를 자동으로 압축 해제할 수 있습니다. 자세한 내용은 CloudWatch Logs를 사용하여 Kinesis Data Firehose에 쓰기를 참조하세요.

참고

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

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

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

    aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region

    다음은 예 출력입니다.

    { "Location": "/amzn-s3-demo-bucket2" }
  2. Amazon S3 버킷에 데이터를 입력하는 데 필요한 권한을 Amazon Data Firehose에 부여하는 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:::amzn-s3-demo-bucket2", "arn:aws:s3:::amzn-s3-demo-bucket2/*" ] } ] }
  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 전송 시스템을 생성하여 RoleARNBucketARN의 자리 표시자 값을 생성한 역할 및 버킷 ARN으로 바꿉니다.

    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:::amzn-s3-demo-bucket2"}'

    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:::amzn-s3-demo-bucket2", "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 Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 텍스트 편집기를 사용하여 권한 정책을 파일로 생성합니다(예: ~/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 'amzn-s3-demo-bucket2' --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 'amzn-s3-demo-bucket2' --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