Kinesis Data Firehose에서 Amazon Elasticsearch Service로의 교차 계정 스트리밍을 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 4월 15일

다른 계정의 Amazon Elasticsearch Service(Amazon ES) 클러스터로 데이터를 전송하는 Amazon Kinesis Data Firehose 스트림을 설정하려고 합니다. 서로 다른 여러 계정 간에 내 데이터 리소스를 스트리밍하려면 어떻게 해야 합니까? 

간략한 설명

Kinesis Data Firehose와 해당 종속 항목(예: Amazon Simple Storage Service(Amazon S3) 및 Amazon CloudWatch)을 설정하여 서로 다른 여러 계정 간에 스트리밍할 수 있습니다. 스트리밍 데이터 전송은 Amazon ES 클러스터가 공개적으로 액세스 가능하고 노드 간 암호화가 비활성화된 경우에만 작동합니다. 노드 간 암호화 기능을 해제하려면 세분화된 액세스 제어 사용 설정을 선택 취소해야 합니다.

Data Firehose 스트림에서 Amazon ES 클러스터로 데이터를 전송하도록 설정하려면 다음 단계를 수행하십시오.

1.    계정 A에서 Amazon S3 버킷을 생성합니다.

2.    계정 A에서 CloudWatch 로그 그룹 및 로그 스트림을 생성합니다.

3.    계정 A에서 Data Firehose 역할 및 정책을 생성합니다.

4.    계정 B에서 Elasticsearch 클러스터를 생성하고 계정 A의 Data Firehose 역할에서의 데이터를 허용하는 정책을 적용합니다.

5.    계정 A의 Data Firehose 역할에서 정책을 수정하여 계정 B의 Elasticsearch 클러스터로 데이터를 전송할 수 있도록 합니다.

6.    계정 A에서 Data Firehose를 생성합니다.

7.    교차 계정 스트림을 테스트합니다.

해결 방법

계정 A에서 Amazon S3 버킷 생성

계정 A에서 S3 버킷을 생성하십시오. S3 버킷은 Amazon 리소스 이름(ARN)을 생성합니다.

참고: 전체 ARN은 나중에 이 S3 버킷에서 레코드를 저장하고 검색할 수 있는 액세스 권한을 Data Firehose에 부여하는 데 사용됩니다.

계정 A에서 CloudWatch 로그 그룹 및 로그 스트림 생성

CloudWatch 로그 그룹을 생성하려면 다음 단계를 수행하십시오.

1.    CloudWatch 콘솔을 엽니다.

2.    탐색 창에서 [로그 그룹]을 선택합니다.

3.    [작업]을 선택합니다.

4.    [로그 그룹 생성]을 선택합니다.

5.    로그 그룹 이름을 입력합니다.

6.    [로그 그룹 생성] 버튼을 선택하여 새 로그 그룹을 저장합니다.

7.    새로 생성된 로그 그룹을 검색하여 선택합니다. 이 작업이 완료되면 이제 로그 스트림을 생성할 수 있는 것입니다.

CloudWatch 로그 스트림을 생성하려면 다음 단계를 수행하십시오.

1.    [로그 스트림 생성]을 선택합니다.

2.    [로그 스트림 이름]을 입력합니다.

3.    [로그 스트림 생성]을 선택합니다. 이 작업은 새로 생성된 로그 스트림을 저장합니다.

중요: Data Firehose 역할 정책을 생성할 때 CloudWatch 로그 그룹과 CloudWatch 로그 스트림의 이름이 필요합니다.

계정 A에서 Data Firehose 역할 및 정책 생성

1.    AWS Identity and Access Management(IAM) 콘솔로 이동합니다.

2.    Data Firehose가 스트림 로그는 CloudWatch에, 레코드는 S3에, 데이터 스트림은 Elasticsearch 클러스터에 저장할 수 있도록 하는 IAM 정책을 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {          
            "Effect": "Allow",    
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
    "Resource": [
                "<Bucket ARN>",
                "<Bucket ARN>/*"    
            ]
        },
        {    
            "Effect": "Allow",
                "Action": [
                "logs:PutLogEvents"
            ],           
                "Resource": [
                "arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:log-stream:<log-stream-name>"           
            ]
        }
    ]
}

참고: 계정 B의 클러스터를 먼저 생성해야 하므로 나중에 적절한 권한을 추가하여 Elasticsearch 클러스터 정책을 스트리밍하십시오.

3.    정책을 저장합니다.

4.    [역할 생성]을 선택합니다.

5.    새로 생성된 정책을 Kinesis Data Firehose 역할에 추가합니다.

계정 B에서 Elasticsearch 클러스터를 생성하고 계정 A의 Data Firehose 역할에서의 데이터를 허용하는 정책 적용

[공개적으로 액세스할 수 있음] 설정이 활성화된 Elasticsearch 클러스터를 생성합니다. 또한 계정 B에 대해 [노드 간 암호화] 설정이 비활성화되어 있는지 확인합니다. [노드 간 암호화]를 비활성화하려면 [세분화된 액세스 제어 사용] 설정을 선택 해제해야 합니다.

중요: 역할에서 Data Firehose를 통한 스트리밍이 가능하도록 보안 설정을 구성해야 합니다.

[액세스 정책]에서 [사용자 지정 액세스 정책]을 선택하고 [IAM], [허용]을 차례로 선택한 후 IAM 콘솔에서 사용자 ARN을 입력합니다.

클러스터가 생성된 후에는 Amazon ES 도메인 ARN이 나타나야 합니다. [작업]으로 이동하여 클러스터의 정책을 변경합니다. 그런 다음 [액세스 정책 관리]를 다음과 같이 수정합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Firehose Role ARN in Account A>"
      },
      "Action": [
        "es:ESHttpPost",
        "es:ESHttpPut"
      ],
      "Resource": [
        "<ES Domain ARN in Account B>",
        "<ES Domain ARN in Account B>/*"
      ]
    },
    {    
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Firehose Role ARN in Account A>"
      },
      "Action": "es:ESHttpGet",
      "Resource": [
        "<ES Domain ARN in Account B>/_all/_settings",
        "<ES Domain ARN in Account B>/_cluster/stats",
        "<ES Domain ARN in Account B>/index-name*/_mapping/type-name",
        "<ES Domain ARN in Account B>/roletest*/_mapping/roletest",
        "<ES Domain ARN in Account B>/_nodes",
        "<ES Domain ARN in Account B>/_nodes/stats",
        "<ES Domain ARN in Account B>/_nodes/*/stats",
        "<ES Domain ARN in Account B>/_stats",
        "<ES Domain ARN in Account B>/index-name*/_stats",
        "<ES Domain ARN in Account B>/roletest*/_stats"
      ]
    }
  ]
}

Elasticsearch 정책 내 권한에 대한 자세한 내용은 Amazon ES 대상으로 교차 계정 전송을 참조하십시오.

계정 A의 Data Firehose 역할에서 계정 B의 Elasticsearch 클러스터로 데이터를 전송할 수 있도록 정책 수정

Elasticsearch 클러스터로 데이터를 전송할 수 있도록 Data Firehose 정책을 수정합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {          
            "Effect": "Allow",    
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "<Bucket ARN>",
                "<Bucket ARN>/*"    
            ]
        },
        {    
            "Effect": "Allow",
                "Action": [
                "logs:PutLogEvents"
            ],           
                "Resource": [
                "arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:log-stream:<log-stream-name>"
            ]
        },    
         {
            "Effect": "Allow",
            "Action": [
                "es:ESHttpPost",
                "es:ESHttpPut",
                "es:DescribeElasticsearchDomain",    
                "es:DescribeElasticsearchDomains",
                "es:DescribeElasticsearchDomainConfig"
            ],
            "Resource": [
                "<ES Domain ARN in Account B>",
                "<ES Domain ARN in Account B>/*"
            ]
        },
        {        
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet"
            ],
            "Resource": [
                "<ES Domain ARN in Account B>/_all/_settings",
                "<ES Domain ARN in Account B>/_cluster/stats",
                "<ES Domain ARN in Account B>/index-name*/_mapping/superstore",
                "<ES Domain ARN in Account B>/_nodes",
                "<ES Domain ARN in Account B>/_nodes/stats",
                "<ES Domain ARN in Account B>/_nodes/*/stats",
                "<ES Domain ARN in Account B>/_stats",
                "<ES Domain ARN in Account B>/index-name*/_stats"
            ]
        }
    ]
}

Elasticsearch 클러스터로 Data Firehose 데이터를 전송하는 방법에 대한 자세한 내용은 Amazon ES 대상에 액세스할 수 있는 권한을 Kinesis Data Firehose에 부여를 참조하십시오.

계정 A에서 Data Firehose 생성

교차 계정 Elasticsearch 클러스터로 Data Firehose를 생성하려면 AWS CLI를 사용하고 구성합니다.

다음 명령을 사용하여 AWS CLI가 최신 버전인지 확인합니다.

aws --version

AWS CLI를 업데이트한 후 다음 내용을 포함하는 input.json이라는 파일을 생성합니다.

{
    "DeliveryStreamName": "<Firehose name>",
    "DeliveryStreamType": "DirectPut",
    "ElasticsearchDestinationConfiguration": {
        "RoleARN": "<Firehose Role ARN of Account A>",
        "ClusterEndpoint": "<ES Domain cluster Endpoint of Account B>",
        "IndexName": "local",
        "TypeName": "TypeName",
        "IndexRotationPeriod": "OneDay",
        "BufferingHints": {
            "IntervalInSeconds": 60,
            "SizeInMBs": 50
        },
        "RetryOptions": {
            "DurationInSeconds": 60
        },
        "S3BackupMode": "FailedDocumentsOnly",
        "S3Configuration": {
            "RoleARN": "<Firehose Role ARN of Account A>",
            "BucketARN": "<S3 Bucket ARN of Account A>",
            "Prefix": "",
            "BufferingHints": {
                "SizeInMBs": 128,
                "IntervalInSeconds": 128
            },
            "CompressionFormat": "UNCOMPRESSED"
        },
        "CloudWatchLoggingOptions": {
            "Enabled": true,
            "LogGroupName": "<Log group name>",
            "LogStreamName": "<Log stream name>"
        }
    }
}

ClusterEndpoint 속성 필드에 엔드포인트 값이 올바르게 입력되었는지 확인합니다.

참고: Elasticsearch 버전 7.x에서는 유형이 더 이상 사용되지 않습니다. Elasticsearch 버전 7.x의 경우 TypeName 속성을 제거해야 합니다.

그런 다음 input.json 파일의 위치와 동일한 디렉터리에서 다음 AWS CLI 명령을 실행합니다.

aws firehose create-delivery-stream --cli-input-json file://input.json

그러면 계정 A에 Data Firehose가 생성되고 계정 B에 Elasticsearch 클러스터가 생성됩니다.

교차 계정 스트림 테스트

Kinesis Data Generator를 사용하여 계정 A의 Data Firehose로 레코드를 스트리밍합니다.

Kinesis Data Generator는 매 초마다 많은 레코드를 생성합니다. Amazon ES는 이를 통해 레코드 구조의 올바른 매핑을 결정하기에 충분한 데이터 포인트를 확보할 수 있습니다.

Kinesis Data Generator에서 사용되는 템플릿 구조는 다음과 같습니다.

{
    "device_id": {{random.number(5)}},
    "device_owner": "{{name.firstName}}  {{name.lastName}}",
    "temperature": {{random.number(
        {
            "min":10,
            "max":150
        }
    )}},
    "timestamp": "{{date.now("DD/MMM/YYYY:HH:mm:ss Z")}}"
}

교차 계정 스트리밍이 성공했는지 확인하려면 Elasticsearch 클러스터의 [인덱스] 탭에 ‘local’이라는 로컬 인덱스가 있는지 확인합니다.

참고: Amazon ES가 올바른 매핑을 결정하는 데는 몇 분이 걸릴 수 있습니다.


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

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?