계정 간에 CloudWatch Logs를 Kinesis Data Firehose로 푸시하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Kinesis Data Firehose에서 다른 AWS 리전의 다른 AWS 계정으로 Amazon CloudWatch Logs를 스트리밍하고 싶습니다.

간략한 설명

다른 리전에 있는 Kinesis Data Firehose 스트림으로 CloudWatch Logs를 보내려면 해당 리전에서 Kinesis Data Firehose를 지원해야 합니다. 해당 리전에서 Kinesis Data Firehose를 지원하는지 확인하세요.

Kinesis Data Firehose를 사용하여 다른 계정 및 지원 리전에서 로그를 스트리밍하려면 다음 단계를 완료하십시오.

  1. 대상 계정에 Amazon Simple Storage Service (Amazon S3) 버킷을 생성합니다. AWS Identity and Access Management(IAM) 역할을 생성합니다. 그런 다음 Kinesis Data Firehose가 데이터를 Amazon S3로 푸시하는 데 필요한 권한을 추가합니다.
  2. 대상 계정에 Kinesis Data Firehose의 대상을 생성합니다. CloudWatch Logs용 IAM 역할을 생성하여 데이터를 Kinesis Data Firehose로 푸시하세요. 그런 다음 로그를 푸시할 대상 전송 스트림을 생성합니다.
  3. Amazon Virtual Private Cloud(Amazon VPC) 흐름 로그를 켠 다음 소스 계정의 로그를 CloudWatch에 푸시합니다.
  4. 소스 계정에 대상 계정을 가리키는 구독 필터를 만듭니다.
  5. 대상 계정의 S3 버킷에서 로그 이벤트의 흐름을 검증합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하는 경우 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

다음 해결 방법에서는 아래 예제 값을 사용합니다. 예제 값을 사용자 고유 값으로 대체하여 사용하세요.

  • 대상 계정: 111111111111
  • Kinesis Data Firehose 리전: us-east-1
  • S3 버킷 리전: us-west-2
  • 대상 리전(소스 계정에서 로그 수신): us-east-2
  • 소스 계정(VPC 흐름 로그가 있는 곳): 222222222222
  • Amazon CloudWatch Logs 그룹 리전: us-east2
  • VPC 흐름 로그 리전: us-east-2

대상 계정 설정

1.    S3 버킷을 생성합니다.

aws s3api create-bucket --bucket my-bucket --create-bucket-configuration LocationConstraint=us-west-2 --region us-west-2

위치 제약 조건에 버킷이 us-west-2 리전에 생성됨이 나타냅니다.

2.    Kinesis Data Firehose에 필요한 권한을 부여하는 IAM 역할 및 신뢰 정책을 생성합니다.

{
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "Service": "firehose.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "sts:ExternalId": "111111111111"
      }
    }
  }
}

권한 설정은 Kinesis Data Firehose가 사용자가 만든 S3 버킷에 데이터를 넣을 수 있도록 허용해야 합니다.

3.    IAM 역할을 생성하고 신뢰 정책 파일을 지정합니다.

aws iam create-role \
    --role-name FirehosetoS3Role \
    --assume-role-policy-document file://~/TrustPolicyForFirehose.json

이후 단계에서 사용할 Role_Arn 값을 기록해 둡니다.

4.    Kinesis Data Firehose가 대상 계정에서 수행할 수 있는 작업을 정의하기 위해 JSON 파일에 권한 정책을 생성합니다.

{
    "Version": "2012-10-17",
    "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.    권한 정책을 IAM 역할에 연결합니다.

aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json

6.    Kinesis Data Firehose의 대상 전송 스트림을 생성합니다.

aws firehose create-delivery-stream --delivery-stream-name 'my-delivery-stream' --s3-destination-configuration RoleARN='arn:aws:iam::111111111111:role/FirehosetoS3Role',BucketARN='arn:aws:s3:::my-bucket' --region us-east-1

RolearnBucketArn을 생성한 역할 및 버킷 ARN으로 교체합니다.

참고: S3 객체를 Kinesis Data Firehose에 전달하면 custom 접두사timestamp 네임스페이스 표현식에 사용됩니다. 시간 형식 접두사 앞에 추가 접두사를 추가하여 지정할 수 있습니다(yyyy/MM/dd/HH/). 접두사가 슬래시(/)로 끝나면 S3 버킷에 폴더로 표시됩니다.

7.    describe-delivery-stream 명령을 실행하여 DeliveryStreamDescription.DeliveryStreamStatus 속성을 확인합니다.

aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream" --region us-east-1

스트림이 활성 상태인지 확인하려면 describe-delivery-stream 명령 출력을 확인합니다.

{
  "DeliveryStreamDescription": {
    "DeliveryStreamType": "DirectPut",
    "HasMoreDestinations": false,
    "DeliveryStreamEncryptionConfiguration": {
      "Status": "DISABLED"
    },
    "VersionId": "1",
    "CreateTimestamp": 1604484348.804,
    "DeliveryStreamARN": "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream",
    "DeliveryStreamStatus": "ACTIVE",
    "DeliveryStreamName": "my-delivery-stream",
    "Destinations": [
      {
        "DestinationId": "destinationId-000000000001",
        "ExtendedS3DestinationDescription": {
          "RoleARN": "arn:aws:iam::111111111111:role/FirehosetoS3Role2test",
          "BufferingHints": {
            "IntervalInSeconds": 300,
            "SizeInMBs": 5
          },
          "EncryptionConfiguration": {
            "NoEncryptionConfig": "NoEncryption"
          },
          "CompressionFormat": "UNCOMPRESSED",
          "S3BackupMode": "Disabled",
          "CloudWatchLoggingOptions": {
            "Enabled": false
          },
          "BucketARN": "arn:aws:s3:::my-bucket"
        },
        "S3DestinationDescription": {
          "RoleARN": "arn:aws:iam::111111111111:role/FirehosetoS3Role2test",
          "BufferingHints": {
            "IntervalInSeconds": 300,
            "SizeInMBs": 5
          },
          "EncryptionConfiguration": {
            "NoEncryptionConfig": "NoEncryption"
          },
          "CompressionFormat": "UNCOMPRESSED",
          "CloudWatchLoggingOptions": {
            "Enabled": false
          },
          "BucketARN": "arn:aws:s3:::my-bucket"
        }
      }
    ]
  }
}

이후 단계에서 DeliveryStreamDescription.DeliveryStreamARN 값을 사용해야 합니다.

8.    CloudWatch Logs에 Kinesis Data Firehose 스트림에 데이터를 넣을 수 있는 권한을 부여하는 IAM 역할 및 신뢰 정책을 생성합니다. 로그가 푸시되는 리전을 추가했는지 확인하세요.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "Service": "logs.us-east-1.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringLike": {
        "aws:SourceArn": [
          "arn:aws:logs:region:sourceAccountId:*",
          "arn:aws:logs:region:recipientAccountId:*"
        ]
      }
    }
  }
}

9.    IAM 역할을 생성하고 신뢰 정책 파일을 지정하려면 create-role 명령을 사용합니다.

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

반환된 Role_Arn 값을 기록해 두었다가 이후 단계에서 사용하세요.

10.    권한 정책을 생성하여 대상 계정에서 CloudWatch Logs가 수행할 작업을 정의합니다. 이전 단계에서 기록해 둔 DeliveryStreamDescription.DeliveryStreamStatus 및 Role_Arn 값을 사용하세요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "firehose:ListDeliveryStreams",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole"
        },
        {
            "Effect": "Allow",
            "Action": [
                "firehose:DescribeDeliveryStream"
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream"
        }
    ]
}

11.    put-role-policy 명령을 사용해 권한 정책을 역할에 연결합니다.

aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL.json

12.    put-destination API 호출을 사용해 대상 계정에 대상을 만듭니다. 이는 소스 계정이 전송하는 모든 로그를 받을 대상입니다.

aws logs put-destination --destination-name "myDestination" --target-arn "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream"
--role-arn "arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole" --region us-east-2

참고: 전송 스트림의 대상은 Kinesis Data Firehose가 지원되는 어떤 리전에도 만들 수 있습니다. 대상을 생성하는 지역은 로그 소스 지역과 동일해야 합니다.

13.    CloudWatch 대상에 대한 액세스 정책을 만듭니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "222222222222"
      },
      "Action": "logs:PutSubscriptionFilter",
      "Resource": "arn:aws:logs:us-east-2:111111111111:destination:myDestination"
    }
  ]
}

14.    액세스 정책을 CloudWatch 대상과 연결합니다.

aws logs put-destination-policy --destination-name "myDestination" --access-policy file://~/AccessPolicy.json --region us-east-2

15.    대상을 확인하려면 다음 명령을 실행합니다.

aws logs describe-destinations --region us-east-2

소스 계정 설정

참고: 소스 계정의 IAM 관리자 또는 루트 사용자이어야 합니다.

1.    IAM 역할 및 신뢰 정책을 생성하여 CloudWatch Logs 로그 그룹에 데이터를 전송할 권한을 VPC 흐름 로그에 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2.    IAM 역할을 생성하고 생성한 신뢰 정책 파일을 지정하려면 다음 명령을 사용합니다.

aws iam create-role --role-name PublishFlowLogs --assume-role-policy-document file://~/TrustPolicyForVPCFlowLogs.json

반환된 ARN 값을 기록하여 이후 단계에서 VPC 흐름 로그에 전달합니다.

3.    권한 정책을 만들어 VPC 흐름 로그가 소스 계정에서 수행할 수 있는 작업을 정의합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

4.    권한 정책을 IAM 역할에 연결하려면 다음 명령을 실행합니다.

aws iam put-role-policy --role-name PublishFlowLogs --policy-name Permissions-Policy-For-VPCFlowLogs --policy-document file://~/PermissionsForVPCFlowLogs.json

5.    CloudWatch Logs 로그 그룹을 생성하여 VPC 흐름 로그의 대상을 구성합니다.

aws logs create-log-group --log-group-name vpc-flow-logs --region us-east-2

6.    VPC 흐름 로그를 사용하려면 다음 명령을 실행합니다.

aws ec2 create-flow-logs --resource-type VPC --resource-ids vpc-12345678 --traffic-type ALL --log-group-name vpc-flow-logs --deliver-logs-permission-arn arn:aws:iam::222222222222:role/PublishFlowLogs --region us-east-2

참고: --resource-ids--deliver-logs-permission-arn 값을 VPC ID 및 VPC 흐름 로그 역할로 바꿉니다.

7.    대상 계정의 CloudWatch 로그 그룹을 Kinesis Data Firehose에 구독합니다.

aws logs put-subscription-filter --log-group-name "vpc-flow-logs" --filter-name "AllTraffic" --filter-pattern "" --destination-arn
"arn:aws:logs:us-east-2:111111111111:destination:myDestination" --region us-east-2

대상 계정의 --destination ARN 값을 업데이트하고 111111111111을 대상 계정 번호로 바꿉니다.

8.    S3 버킷을 확인하여 로그가 게시되었는지 확인합니다.

관련 정보

DeliveryStreamDescription

AWS 공식
AWS 공식업데이트됨 일 년 전