기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
계정 수준 구독 필터
중요
구독 필터는 무한 재귀 루프를 발생시킬 위험이 있으며, 이를 해결하지 않으면 수집 요금 청구가 크게 증가할 수 있습니다. 이러한 위험을 완화하려면 계정 수준 구독 필터에서 선택 기준을 사용하여 구독 전송 워크플로의 일부인 리소스에서 로그 데이터를 수집하는 로그 그룹을 제외하는 것이 좋습니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 로그 재귀 방지 섹션을 참조하세요.
계정의 로그 그룹 하위 집합을 포함하는 계정 수준 구독 정책을 설정할 수 있습니다. 계정 구독 정책은 Amazon Kinesis Data Streams AWS Lambda또는 Amazon Data Firehose에서 작동할 수 있습니다. 계정 수준 구독 정책을 통해 서비스로 전송되는 로그는 base64로 인코딩되고 gzip 형식으로 압축됩니다. 이 섹션에서는 Kinesis Data Streams, Lambda, Firehose의 계정 수준 구독을 생성하기 위해 따를 수 있는 예제를 제공합니다.
참고
계정의 모든 구독 필터 정책 목록을 보려면 --policy-type
파라미터 값 SUBSCRIPTION_FILTER_POLICY
를 사용하여 describe-account-policies
명령을 사용합니다. 자세한 내용은 describe-account-policies¶를 참조하세요.
예시
예제 1: Kinesis Data Streams에 대한 구독 필터
계정 수준 구독 정책과 함께 사용할 Kinesis Data Streams 데이터 스트림을 생성하기 전에 생성될 로그 데이터의 볼륨을 계산합니다. 이 볼륨을 처리하기에 충분한 샤드로 스트림을 생성해야 합니다. 스트림에 샤드가 충분하지 않은 경우 스트림이 스로틀링됩니다. 스트림 볼륨 제한에 대한 자세한 내용은 Kinesis Data Stream 설명서의 할당량 및 제한을 참조하세요.
주의
여러 로그 그룹의 로그 이벤트가 대상에 전달되므로 스로틀링의 위험이 있습니다. 제한된 결과물은 최대 24시간 동안 재시도됩니다. 24시간이 지나면 실패한 결과물이 삭제됩니다.
제한의 위험을 완화하려면 다음 단계를 수행하세요.
CloudWatch 지표를 사용하여 Kinesis Data Streams 스트림을 모니터링합니다. 이렇게 하면 스로틀링을 식별하고 그에 따라 구성을 조정할 수 있습니다. 예를 들어
DeliveryThrottling
지표는 데이터를 구독 대상에 전달할 때 CloudWatch Logs에 스로틀링이 발생한 로그 이벤트 수를 추적합니다. 자세한 내용은 CloudWatch 지표를 사용한 모니터링 단원을 참조하십시오.Kinesis Data Streams의 스트림에 대해 온디맨드 용량 모드를 사용합니다. 온디맨드 모드는 워크로드가 확장 또는 축소될 때 즉시 워크로드를 수용합니다. 자세한 내용은 온디맨드 모드를 참조하세요.
Kinesis Data Streams의 스트림 용량과 일치하도록 CloudWatch Logs 구독 필터 패턴을 제한합니다. 스트림에 너무 많은 데이터를 전송하는 경우 필터 크기를 줄이거나 필터 기준을 조정해야 할 수 있습니다.
다음 예제에서는 계정 수준 구독 정책을 사용하여 모든 로그 이벤트를 Kinesis Data Streams의 스트림에 전달합니다. 필터 패턴은 모든 로그 이벤트를 Test
텍스트와 대조하고 이를 Kinesis Data Streams의 스트림에 전달합니다.
Kinesis Data Streams의 계정 수준 구독 정책을 생성하려면
-
다음 명령을 사용하여 대상 스트림을 생성합니다.
$
C:\>
aws kinesis create-stream —stream-name "TestStream" —shard-count 1 -
스트림이 활성화될 때까지 몇 분 정도 기다립니다. 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" } } ] } } -
스트림에 데이터를 입력하는 데 필요한 권한을 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:*" } } } } -
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" } } -
CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 권한 정책을 파일로 생성합니다(예:
~/PermissionsForCWL-Kinesis.json
). 텍스트 편집기를 사용하여 이 정책을 생성하세요. IAM 콘솔을 사용하여 정책을 생성하지 마세요.{ "Statement": [ { "Effect": "Allow", "Action": "kinesis:PutRecord", "Resource": "arn:aws:kinesis:
region
:123456789012
:stream/TestStream" } ] } -
다음 put-role-policy 명령을 사용하여 권한 정책을 역할에 연결합니다.
aws iam put-role-policy --role-name
CWLtoKinesisRole
--policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL-Kinesis.json
-
스트림이 Active 상태에 있고 IAM 역할을 생성하고 나면 CloudWatch Logs 구독 필터 정책을 생성할 수 있습니다. 이 정책은 스트림으로 가는 실시간 로그 데이터 흐름을 즉시 시작합니다. 이 예제에서는
LogGroupToExclude1
과LogGroupToExclude2
라는 로그 그룹의 이벤트를 제외하고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" -
구독 필터를 설정하고 나면 CloudWatch Logs는 모든 수신 로그 이벤트 중에서 필터 패턴 및 선택 기준과 일치하는 이벤트를 스트림으로 전달합니다.
selection-criteria
필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 로그 재귀 방지 섹션을 참조하세요. 현재 NOT IN은selection-criteria
에 지원되는 유일한 연산자입니다.Kinesis Data Streams 샤드 반복자를 사용하고 Kinesis Data Streams
get-records
명령을 사용하여 몇몇 Kinesis Data Streams 레코드를 가져와 로그 이벤트 흐름을 확인할 수 있습니다.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 Logs는 주로 대상이 도달 가능한지 확인하기 위한 목적으로 "CONTROL_MESSAGE" 유형을 가진 Kinesis Data Streams 레코드를 출력할 수 있습니다.
- owner
-
발신 로그 데이터의 AWS 계정 ID입니다.
- logGroup
-
원본 로그 데이터의 로그 그룹 이름입니다.
- logStream
-
원본 로그 데이터의 로그 스트림 이름입니다.
- subscriptionFilters
-
원본 로그 데이터과 일치한 구독 필터 이름 목록입니다.
- logEvents
-
로그 이벤트 레코드 어레이 형태로 표현되는 실제 로그 데이터입니다. "ID" 속성은 모든 로그 이벤트의 고유 식별자입니다.
- policyLevel
-
정책이 적용된 수준입니다. “ACCOUNT_LEVEL_POLICY”는 계정 수준 구독 필터 정책의
policyLevel
입니다.
예제 2:를 사용한 구독 필터 AWS Lambda
이 예제에서는 로그 데이터를 AWS Lambda 함수로 전송하는 CloudWatch Logs 계정 수준 구독 필터 정책을 생성합니다.
주의
Lambda 함수를 생성하기 전에 생성할 로그 데이터의 볼륨을 계산합니다. 이 볼륨을 처리할 수 있는 함수를 생성해야 합니다. 함수가 볼륨을 처리할 수 없는 경우에는 로그 스트림에 스로틀링이 발생합니다. 모든 로그 그룹 또는 계정 로그 그룹의 하위 집합의 로그 이벤트가 대상으로 전달되므로 스로틀링의 위험이 있습니다. AWS Lambda 제한에 대한 자세한 내용은 Lambda 제한을 참조하세요.
Lambda의 계정 수준 구독 필터 정책을 생성하려면
-
AWS Lambda 함수를 생성합니다.
Lambda 실행 역할이 설정되었는지 확인합니다. 자세한 내용은 AWS Lambda 개발자 안내서의 2.2단계: IAM 역할 생성(실행 역할)을 참조하세요.
-
다음 콘텐츠로 텍스트 편집기를 열고
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(); } }); };
-
helloWorld.js 파일을 압축하고
helloWorld.zip
라는 이름으로 저장합니다. -
역할이 첫 단계에서 설정한 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
-
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" -
다음 명령을 사용하고 자리 표시자 계정을 자신의 계정으로 바꾸어 계정 수준 구독 필터 정책을 생성합니다. 이 예제에서는
LogGroupToExclude1
과LogGroupToExclude2
라는 로그 그룹의 이벤트를 제외하고ERROR
문자열을 포함하는 모든 로그 이벤트가 스트리밍됩니다.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
에 지원되는 유일한 연산자입니다. -
(선택 사항) 샘플 로그 이벤트를 사용하여 테스트합니다. 명령 프롬프트에서 다음 명령을 실행하여 구독된 스트림으로 간단한 로그 메시지를 보냅니다.
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 Logs는 주로 대상이 도달 가능한지 확인하기 위한 목적으로 "CONTROL_MESSAGE" 유형을 가진 Kinesis Data Streams 레코드를 출력할 수 있습니다.
- owner
-
발신 로그 데이터의 AWS 계정 ID입니다.
- logGroup
-
원본 로그 데이터의 로그 그룹 이름입니다.
- logStream
-
원본 로그 데이터의 로그 스트림 이름입니다.
- subscriptionFilters
-
원본 로그 데이터과 일치한 구독 필터 이름 목록입니다.
- logEvents
-
로그 이벤트 레코드 어레이 형태로 표현되는 실제 로그 데이터입니다. "ID" 속성은 모든 로그 이벤트의 고유 식별자입니다.
- policyLevel
-
정책이 적용된 수준입니다. “ACCOUNT_LEVEL_POLICY”는 계정 수준 구독 필터 정책의
policyLevel
입니다.
예제 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 구독 필터를 생성하려면
-
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
" } -
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" } }
-
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
" } } -
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
/*" ] } ] } -
다음 put-role-policy 명령을 사용하여 권한 정책을 역할에 연결합니다.
aws iam put-role-policy --role-name
FirehosetoS3Role
--policy-namePermissions-Policy-For-Firehose
--policy-documentfile://~/PermissionsForFirehose
.json -
다음과 같이 대상 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:::amzn-s3-demo-bucket2
"}'Firehose는 제공된 Amazon S3 객체에서 YYYY/MM/DD/HH UTC 시간 형식의 접두사를 자동으로 사용합니다. 시간 형식 접두사 앞에 추가할 또 다른 접두사를 지정할 수 있습니다. 슬래시(/)로 끝난 접두사는 Amazon S3 버킷에서 자리 표시자로 표시됩니다.
-
스트림이 활성화될 때까지 몇 분 정도 기다립니다. 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 } } } ] } } -
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
:*" } } } } -
create-role 명령을 사용하여 신뢰 정책 파일을 지정하는 IAM 역할을 생성합니다. 이후 단계에서 필요하므로 반환된 Role.Arn 값을 적어둡니다.
aws iam create-role \ --role-name
CWLtoKinesisFirehoseRole
\ --assume-role-policy-documentfile://~/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
" } } -
CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 텍스트 편집기를 사용하여 권한 정책을 파일로 생성합니다(예:
~/PermissionsForCWL.json
).{ "Statement":[ { "Effect":"Allow", "Action":["firehose:PutRecord"], "Resource":[ "arn:aws:firehose:
region
:account-id
:deliverystream/delivery-stream-name
"] } ] } -
put-role-policy 명령을 사용하여 권한 정책을 역할에 연결합니다.
aws iam put-role-policy --role-name
CWLtoKinesisFirehoseRole
--policy-namePermissions-Policy-For-CWL
--policy-documentfile://~/PermissionsForCWL.json
-
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" -
구독 필터를 설정하고 나면 CloudWatch Logs는 수신 로그 이벤트 중에서 필터 패턴과 일치하는 이벤트를 Amazon Data Firehose 전송 스트림으로 전달합니다.
selection-criteria
필드는 선택 사항이지만 구독 필터에서 무한 로그 재귀를 일으킬 수 있는 로그 그룹을 제외하는 데 중요합니다. 이 문제와 제외할 로그 그룹 결정에 대한 자세한 내용은 로그 재귀 방지 섹션을 참조하세요. 현재 NOT IN은selection-criteria
에 지원되는 유일한 연산자입니다.Amazon Data Firehose 전송 스트림에 설정된 시간 버퍼 간격에 따라 Amazon S3에 데이터가 나타나기 시작합니다. 충분한 시간이 지나고 나면 Amazon S3 버킷을 확인하여 데이터를 확인할 수 있습니다.
aws s3api list-objects --bucket '
amzn-s3-demo-bucket2
' --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 '
amzn-s3-demo-bucket2
' --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