Kinesis Data Firehose로 Amazon CloudWatch Logs 교차 계정을 푸시하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 11월 17일

Amazon Kinesis Data Firehose에서 다른 리전의 다른 계정으로 Amazon CloudWatch Logs를 스트리밍하려고 합니다. Kinesis Data Firehose에서 다른 리전의 Amazon Simple Storage Service(Amazon S3) 버킷으로 교차 계정 스트림을 설정하려면 어떻게 해야 하나요?

간략한 설명

Amazon CloudWatch Logs를 다른 AWS 리전에 있는 Amazon Kinesis Data Firehose 스트림으로 전송하려는 경우 실패할 수 있습니다. 

중요: 해당 리전에서 Kinesis Data Firehose를 지원하는지 확인하세요.

Kinesis Data Firehose를 사용하여 교차 계정 및 교차 리전 스트리밍을 설정하려면 다음 단계를 수행하세요.

1.    대상 계정에 S3 버킷을 생성합니다. AWS Identity and Access Management(IAM) 역할을 생성한 다음 Kinesis Data Firehose가 데이터를 S3로 푸시하는 데 필요한 권한을 연결합니다.

2.    대상 계정에 Kinesis Data Firehose의 대상을 생성합니다. Amazon CloudWatch Logs 서비스에 대한 IAM 역할을 생성하여 Amazon Kinesis Data Firehose로 푸시합니다. 그런 다음 로그를 푸시할 전송 스트림의 대상을 생성합니다.

3.    VPC Flow Logs를 활성화하고 소스 계정의 Amazon CloudWatch로 로그를 푸시합니다.

4.    소스 계정에서 대상 계정을 가리키는 구독 필터를 생성합니다.

5.    대상 계정의 S3 버킷에 있는 로그 이벤트의 흐름을 확인합니다. 

해결 방법

대상 계정 설정

1.    Amazon 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가 Amazon S3 버킷에 데이터를 넣을 수 있어야 합니다. 그런 다음 "111111111111"을 AWS 계정 ID로 바꿉니다.

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

aws iam create-role \
    --role-name FirehosetoS3Role \
    --assume-role-policy-document file://~/TrustPolicyForFirehose.json
참고: 이후 단계에서 Role_Arn 값을 사용해야 합니다.

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

{
  "Statement": [
    {
      "Effect":
    "Allow",
      "Action": [ 
          "s3:AbortMultipartUpload", 
          "s3:GetBucketLocation", 
          "s3:GetObject", 
          "s3:ListBucket", 
          "s3:ListBucketMultipartUploads", 
          "s3:PutObjectAcl",
          "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

“RoleARN” 및 “BucketARN"을 사용자가 생성한 역할 및 버킷 Amazon 리소스 이름(ARN)으로 바꿉니다.

참고: Amazon S3 객체가 Kinesis Data Firehose에 성공적으로 전송되면 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:707800713736: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:::kirubha-knowledge-article-test"
                }, 
                "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.    Kinesis Data Firehose 스트림에 데이터를 넣을 수 있는 권한을 CloudWatch Logs에 부여하는 IAM 역할 및 신뢰 정책을 생성합니다. 로그가 푸시되는 리전을 추가해야 합니다.

{
  "Statement": {
    "Effect": "Allow",
    "Principal": {
  "Service": [
    "logs.us-east-1.amazonaws.com",
    "logs.us-east-2.amazonaws.com"
    
  ]
},
    "Action": "sts:AssumeRole"
  }
}

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

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

참고: 이후 단계에서 반환된 Role_Arn 값을 사용해야 합니다.

10.    권한 정책을 생성하여 CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의합니다.

{
    "Statement":[
      {
        "Effect":"Allow",
        "Action":["firehose:*"],
       
    "Resource":["arn:aws:firehose:us-east-1:111111111111:*"]
      },
      {
        "Effect":"Allow",
        "Action":["iam:PassRole"],
       
    "Resource":["arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole"]
      }
    ]
}

7단계의 DeliveryStreamDescription.DeliveryStreamARN 값 및 9단계의 Role_Arn 값을 사용합니다.

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

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

12.    소스 계정에서 대상 원본의 ARN 값을 사용할 수 있도록 대상 계정에 대상을 생성합니다.

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/CWLtoKinesisRole" --region us-east-2

참고: Kinesis Data Firehose가 지원되는 모든 리전에서 전송 스트림의 대상을 생성할 수 있습니다. 대상을 생성하는 리전은 로그 원본 리전과 동일해야 합니다.

13.    Amazon 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"
    }
  ]
}

"22222222222222"를 Amazon Virtual Private Cloud(Amazon VPC)가 있는 AWS 소스 계정으로 바꿉니다.

14.    액세스 정책을 Amazon 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 Flow Logs로 전달해야 합니다.

3.    권한 정책을 생성하여 소스 계정에서 VPC Flow Logs가 수행할 수 있는 작업을 정의합니다.

{
    "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.   VPC Flow Logs의 대상을 구성하는 데 사용할 CloudWatch 로그 그룹을 생성합니다.

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

6.    다음 명령을 실행하여 VPC Flow Logs를 활성화합니다.

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 Flow Logs 역할로 바꿉니다.

7.    기본 계정의 Kinesis Data Firehose에 대한 CloudWatch Logs 로그 그룹을 구독하세요.

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

—target ARN 값을 업데이트하고 "1111111111111111"을 대상 계정 번호로 바꿉니다.

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

</p


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?