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

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

계정 수준 구독 필터

중요

구독 필터를 사용하면 무한 반복 루프가 발생하여 이를 해결하지 않으면 수집 요금이 크게 증가할 위험이 있습니다. 이러한 위험을 줄이려면 계정 수준 구독 필터의 선택 기준을 사용하여 구독 전송 워크플로의 일부인 리소스에서 로그 데이터를 수집하는 로그 그룹을 제외하는 것이 좋습니다. 이 문제에 대한 자세한 내용과 제외할 로그 그룹 결정에 대한 자세한 내용은 을 참조하십시오. 로그 재귀 방지

계정의 로그 그룹 하위 집합을 포함하는 계정 수준 구독 정책을 설정할 수 있습니다. 계정 구독 정책은 Kinesis Data Streams, Lambda 또는 Firehose와 함께 사용할 수 있습니다. 계정 수준 구독 정책을 통해 수신 서비스로 전송되는 로그는 base64로 인코딩되고 gzip 형식으로 압축됩니다.

참고

계정의 모든 구독 필터 정책 목록을 보려면 describe-account-policies 명령어를 매개변수 값과 함께 사용하십시오. SUBSCRIPTION_FILTER_POLICY --policy-type 자세한 내용은 describe-account-policies¶ 을 참조하십시오.

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

계정 수준 구독 정책과 함께 사용할 Kinesis Data Streams 데이터 스트림을 생성하기 전에 생성될 로그 데이터의 양을 계산하십시오. 이 볼륨을 처리하기에 충분한 샤드로 스트림을 생성해야 합니다. 스트림에 샤드가 충분하지 않으면 스트림에 병목 현상이 발생합니다. 스트림 볼륨 제한에 대한 자세한 내용은 Kinesis Data Streams 설명서의 할당량 및 제한을 참조하십시오.

주의

여러 로그 그룹의 로그 이벤트가 대상으로 전달되기 때문에 병목 현상이 발생할 위험이 있습니다. 제한된 결과물은 최대 24시간 동안 재시도됩니다. 24시간이 지나면 실패한 결과물이 삭제됩니다.

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

  • 지표로 Kinesis Data Streams를 CloudWatch 모니터링할 수 있습니다. 이를 통해 스로틀링을 식별하고 그에 따라 구성을 조정할 수 있습니다. 예를 들어, DeliveryThrottling 지표는 구독 대상으로 데이터를 전달할 때 로그가 병목 현상이 발생한 CloudWatch 로그 이벤트 수를 추적합니다. 자세한 정보는 CloudWatch 메트릭을 사용한 모니터링을 참조하세요.

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

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

다음 예에서는 계정 수준 구독 정책을 사용하여 Kinesis Data Streams의 스트림에 모든 로그 이벤트를 전달합니다. 필터 패턴은 모든 로그 이벤트를 텍스트와 Test 일치시키고 Kinesis Data Streams의 스트림으로 전달합니다.

Kinesis Data Streams에 대한 계정 수준 구독 정책을 생성하려면
  1. 다음 명령을 사용하여 대상 스트림을 생성합니다.

    $ C:\> aws kinesis create-stream —stream-name "TestStream" —shard-count 1
  2. 스트림이 활성화될 때까지 몇 분 정도 기다리십시오. describe-stream 명령을 사용하여 확인하면 스트림이 활성 상태인지 확인할 수 있습니다. StreamDescription StreamStatus속성.

    aws kinesis describe-stream --stream-name "TestStream"

    다음은 예 출력입니다.

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

    이 정책에는 혼동된 대리자 보안 문제를 방지하는 데 도움이 되는 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": "EXAMPLE450GAB4HC5F431", "CreateDate": "2023-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/TestStream" } ] }
  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 로그 구독 필터 정책을 생성할 수 있습니다. 정책은 스트림으로의 실시간 로그 데이터 흐름을 즉시 시작합니다. 이 예시에서는 이름이 LogGroupToExclude1LogGroupToExclude2 인 로그 그룹의 이벤트를 제외하고 해당 문자열을 포함하는 모든 로그 이벤트가 ERROR 스트리밍됩니다.

    aws logs put-account-policy \ --policy-name "ExamplePolicy" \ --policy-type "SUBSCRIPTION_FILTER_POLICY" \ --policy-document '{"RoleArn":"arn:aws:iam::123456789012:role/CWLtoKinesisRole", "DestinationArn":"arn:aws:kinesis:region:123456789012:stream/TestStream", "FilterPattern": "Test", "Distribution": "Random"}' \ --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \ --scope "ALL"
  8. 구독 필터를 설정하면 CloudWatch Logs는 필터 패턴 및 선택 기준과 일치하는 모든 수신 로그 이벤트를 스트림에 전달합니다.

    selection-criteria 필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 을 참조하십시오로그 재귀 방지. 현재 지원되는 연산자는 NOT IN뿐입니다selection-criteria.

    Kinesis Data Streams 샤드 이터레이터를 사용하고 Kinesis Data Streams 명령을 사용하여 일부 Kinesis get-records 데이터 스트림 레코드를 가져오면 로그 이벤트의 흐름을 확인할 수 있습니다.

    aws kinesis get-shard-iterator --stream-name TestStream --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으로 포맷됩니다.

    { "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "Example1", "logStream": "logStream1", "subscriptionFilters": [ "ExamplePolicy" ], "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\"}" } ], "policyLevel": "ACCOUNT_LEVEL_POLICY" }

    데이터 구조의 주요 요소는 다음과 같습니다.

    messageType

    데이터 메시지는 "DATA_MESSAGE" 유형을 사용합니다. 가끔 CloudWatch 로그에서 “CONTROL_MESSAGE” 유형의 Kinesis Data Streams 레코드를 내보낼 수 있는데, 이는 주로 대상에 도달할 수 있는지 확인하기 위한 것입니다.

    owner

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

    logGroup

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

    logStream

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

    subscriptionFilters

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

    logEvents

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

    정책 수준

    정책이 시행된 수준. “ACCOUNT_LEVEL_POLICY”는 계정 수준의 구독 필터 정책을 policyLevel 위한 것입니다.

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

이 예시에서는 함수에 CloudWatch 로그 데이터를 보내는 Logs 계정 수준 구독 필터 정책을 생성합니다. AWS Lambda

주의

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 nodejs18.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:123456789012:log-group:*" \ --source-account "123456789012"
  6. 다음 명령어를 사용하여 계정 수준의 구독 필터 정책을 생성하고 자리 표시자 계정을 자체 계정으로 대체합니다. 이 예시에서는 이름이 및 인 로그 그룹의 로그 이벤트를 제외하고 해당 문자열이 포함된 모든 로그 이벤트가 ERROR 스트리밍됩니다. LogGroupToExclude1 LogGroupToExclude2

    aws logs put-account-policy \ --policy-name "ExamplePolicyLambda" \ --policy-type "SUBSCRIPTION_FILTER_POLICY" \ --policy-document '{"DestinationArn":"arn:aws:lambda:region:123456789012:function:helloWorld", "FilterPattern": "Test", "Distribution": "Random"}' \ --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \ --scope "ALL"

    구독 필터를 설정하면 CloudWatch Logs는 필터 패턴 및 선택 기준과 일치하는 모든 수신 로그 이벤트를 스트림에 전달합니다.

    selection-criteria 필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 을 참조하십시오로그 재귀 방지. 현재 지원되는 연산자는 NOT IN뿐입니다selection-criteria.

  7. (선택 사항) 샘플 로그 이벤트를 사용하여 테스트합니다. 명령 프롬프트에서 다음 명령을 실행하여 구독된 스트림으로 간단한 로그 메시지를 보냅니다.

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

    aws logs put-log-events --log-group-name Example1 --log-stream-name logStream1 --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으로 포맷됩니다.

    { "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "Example1", "logStream": "logStream1", "subscriptionFilters": [ "ExamplePolicyLambda" ], "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\"}" } ], "policyLevel": "ACCOUNT_LEVEL_POLICY" }
    참고

    계정 수준 구독 필터는 대상 Lambda 함수의 로그 그룹에 적용되지 않습니다. 이는 무한 로그 재귀로 인해 수집 요금이 증가할 수 있는 것을 방지하기 위한 것입니다. 이 문제에 대한 자세한 내용은 을 참조하십시오. 로그 재귀 방지

    데이터 구조의 주요 요소는 다음과 같습니다.

    messageType

    데이터 메시지는 "DATA_MESSAGE" 유형을 사용합니다. 가끔 CloudWatch 로그에서 “CONTROL_MESSAGE” 유형의 Kinesis Data Streams 레코드를 내보낼 수 있는데, 이는 주로 대상에 도달할 수 있는지 확인하기 위한 것입니다.

    owner

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

    logGroup

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

    logStream

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

    subscriptionFilters

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

    logEvents

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

    정책 수준

    정책이 시행된 수준. “ACCOUNT_LEVEL_POLICY”는 계정 수준의 구독 필터 정책을 policyLevel 위한 것입니다.

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

이 예시에서는 정의된 필터와 일치하는 수신 CloudWatch 로그 이벤트를 Amazon Data Firehose 전송 스트림으로 보내는 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": "EXAMPLE50GAB4HC5F431", "CreateDate": "2023-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 전송 스트림을 생성하여 RoLearn 및 BucketARN의 플레이스홀더 값을 생성한 역할 및 버킷 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:::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-account-policy \ --policy-name "ExamplePolicyFirehose" \ --policy-type "SUBSCRIPTION_FILTER_POLICY" \ --policy-document '{"RoleArn":"arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole", "DestinationArn":"arn:aws:firehose:us-east-1:123456789012:deliverystream/delivery-stream-name", "FilterPattern": "Test", "Distribution": "Random"}' \ --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1", "LogGroupToExclude2"]' \ --scope "ALL"
  13. 구독 필터를 설정하면 CloudWatch Logs는 필터 패턴과 일치하는 수신 로그 이벤트를 Amazon Data Firehose 전송 스트림으로 전달합니다.

    selection-criteria 필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 을 참조하십시오로그 재귀 방지. 현재 지원되는 연산자는 NOT IN뿐입니다selection-criteria.

    Amazon Data Firehose 전송 스트림에 설정된 시간 버퍼 간격을 기준으로 데이터가 Amazon S3에 표시되기 시작합니다. 충분한 시간이 지나고 나면 Amazon S3 버킷을 확인하여 데이터를 확인할 수 있습니다.

    aws s3api list-objects --bucket 'my-bucket' --prefix 'firehose/' { "Contents": [ { "LastModified": "2023-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/2023/10/29/00/my-delivery-stream-2023-10-29-00-35-40-EXAMPLE-7e66-49bc-9fd4-fc9819cc8ed3", "Owner": { "DisplayName": "cloudwatch-logs", "ID": "EXAMPLE6be062b19584e0b7d84ecc19237f87b6" }, "Size": 5752 } ] }
    aws s3api get-object --bucket 'my-bucket' --key 'firehose/2023/10/29/00/my-delivery-stream-2023-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250' testfile.gz { "AcceptRanges": "bytes", "ContentType": "application/octet-stream", "LastModified": "Thu, 29 Oct 2023 00:07:06 GMT", "ContentLength": 593, "Metadata": {} }

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

    zcat testfile.gz