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

최종 업데이트 날짜: 2021년 7월 23일

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

간략한 설명

Kinesis Data Firehose와 해당 종속 항목(예: Amazon Simple Storage Service(Amazon S3) 및 Amazon CloudWatch)을 설정하여 서로 다른 여러 계정 간에 스트리밍할 수 있습니다. 스트리밍 데이터 전송은 세분화된 액세스 제어(FGAC) 활성화 여부에 관계없이 공개적으로 액세스할 수 있는 OpenSearch Service 클러스터에서 작동합니다. 이 문서에서는 두 가지 사용 사례를 다룹니다.

참고: Amazon OpenSearch Service는 Amazon Elasticsearch Service의 후속입니다.

Kinesis Data Firehose 스트림에서 OpenSearch Service 클러스터로 데이터를 전송하도록 설정하려면 다음 단계를 수행합니다.

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

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

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

4.    계정 A의 Kinesis Data Firehose 역할이 데이터를 스트리밍할 계정 B에서 공개적으로 액세스 가능한 OpenSearch Service 클러스터를 생성합니다.

5.    (선택 사항) 세분화된 액세스 제어(FGAC)가 활성화된 경우 OpenSearch 대시보드에 로그인하여 역할 매핑을 추가합니다.

참고: OpenSearch 대시보드는 Kibana의 후속입니다.

6.    계정 B로 데이터를 전송하도록 계정 A의 Kinesis Data Firehose 역할에 대한 AWS Identity Access Management(IAM) 역할 정책을 업데이트합니다.

7.    계정 A에서 Kinesis Data Firehose 스트림을 생성합니다.

8.    OpenSearch Service 클러스터로의 교차 계정 스트리밍을 테스트합니다.

해결 방법

계정 A에서 Amazon S3 버킷 생성

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

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

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

CloudWatch 로그 그룹을 생성하려면 다음 단계를 수행하세요.

1.    CloudWatch 콘솔을 엽니다.

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

3.    로그 그룹 생성(Create log group)을 선택합니다.

4.    로그 그룹(Log Group) 이름을 입력합니다.

5.    로그 그룹 생성(Create log group) 버튼을 선택하여 새 로그 그룹을 저장합니다.

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

Amazon CloudWatch 로그 스트림을 생성하려면 다음 단계를 수행합니다.

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

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

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

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

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

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

2.    Kinesis Data Firehose에서 다음을 수행하도록 허용하는 IAM 정책을 생성합니다.
스트림 로그를 CloudWatch에 저장
Amazon S3에 기록
데이터를 OpenSearch Service 클러스터로 스트리밍

예를 들면 다음과 같습니다.

{
    "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:/aws/kinesisfirehose/<Firehose Name>:log-stream:*"           
            ]
        }
    ]
}

참고: OpenSearch Service 클러스터로 스트리밍할 권한 정책은 나중에 추가할 것입니다. 하지만 먼저 계정 B에서 클러스터를 생성해야 합니다.

3.    정책을 저장합니다.

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

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

계정 A의 Kinesis Data Firehose 역할이 데이터를 스트리밍할 계정 B에서 공개적으로 액세스 가능한 OpenSearch Service 클러스터 생성

1.    계정 B에서 공개적으로 액세스 가능한 OpenSearch Service 클러스터를 생성합니다.

2.    OpenSearch Service 도메인 ARN을 기록해 둡니다. 이후 단계를 수행하려면 이 ARN이 필요합니다.

3.    클러스터에 대한 보안 설정을 구성합니다.

중요: 계정 A의 Kinesis Data Firehose 역할이 OpenSearch Service 클러스터로 스트리밍되도록 OpenSearch Service 보안 설정을 구성해야 합니다.

보안 설정을 구성하려면 다음 단계를 수행합니다.

1.    OpenSearch Service에서 액세스 정책으로 이동합니다.

2.    JSON 정의 액세스 정책을 선택합니다. 정책에는 다음과 같은 권한이 있어야 합니다.

{
  "Version": "2012-10-17",
  "Statement": [    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "<ES Domain ARN in Account B>/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "<Your IP Address for OpenSearch Dashboards access>"
        }
      }
    },
    {
      "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"
      ]
    }
  ]
}

OpenSearch Service 정책 내 권한에 대한 자세한 내용은 OpenSearch Service 대상으로 교차 계정 전송을 참조하세요.

3.    (선택 사항) 클러스터에서 세분화된 액세스 제어(FGAC)가 활성화된 경우 OpenSearch 대시보드에 로그인하여 역할 매핑을 추가합니다. 역할 매핑을 사용하면 Kinesis Data Firehose 역할이 OpenSearch Service에 요청을 전송할 수 있습니다.

(선택 사항) 세분화된 액세스 제어(FGAC)가 활성화된 경우 OpenSearch 대시보드에 로그인하여 역할 매핑을 추가합니다.

OpenSearch Service 클러스터에서 세분화된 액세스 제어가 활성화된 경우 OpenSearch 대시보드에 로그인하여 Kinesis Data Firehose 역할에 역할 매핑을 추가해야 합니다.  역할 매핑은 OpenSearch 서비스 클러스터로 스트리밍하기 위한 액세스 권한을 Kinesis Data Firehose 역할에 제공합니다.

OpenSearch 대시보드에 로그인하여 역할 매핑을 추가하려면 다음 단계를 수행합니다.

1.    대시보드를 엽니다.

2.    보안(Security) 탭을 선택합니다.

3.    역할(Roles)을 선택합니다.

4.    all_access 역할을 선택합니다.

5.    매핑된 사용자(Mapped users) 탭을 선택합니다.

6.    매핑 관리(Manage mapping)를 선택합니다.

7.    백엔드 역할 섹션에서 Kinesis Data Firehose 역할을 입력합니다.

8.    매핑(Map)을 선택합니다.

계정 B로 데이터를 전송하도록 계정 A의 Kinesis Data Firehose 역할에 대한 IAM 역할 정책을 업데이트합니다.

계정 A의 Kinesis Data Firehose 역할에서 계정 B의 OpenSearch Service 클러스터로 데이터를 전송하려면 다음과 같이 Kinesis 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:/aws/kinesisfirehose/<Firehose Name>:log-stream:*"
            ]
        },    
         {
            "Effect": "Allow",
            "Action": [
                "es:ESHttpPost",
                "es:ESHttpPut",
                "es:DescribeDomain",    
                "es:DescribeDomains",
                "es:DescribeDomainConfig"
            ],
            "Resource": [
                "<Domain ARN in Account B>",
                "<Domain ARN in Account B>/*"
            ]
        },
        {        
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet"
            ],
            "Resource": [
                "<Domain ARN in Account B>/_all/_settings",
                "<Domain ARN in Account B>/_cluster/stats",
                "<Domain ARN in Account B>/index-name*/_mapping/superstore",
                "<Domain ARN in Account B>/_nodes",
                "<Domain ARN in Account B>/_nodes/stats",
                "<Domain ARN in Account B>/_nodes/*/stats",
                "<Domain ARN in Account B>/_stats",
                "<Domain ARN in Account B>/index-name*/_stats"
            ]
        }
    ]
}

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

계정 A에서 Kinesis Data Firehose 스트림 생성

OpenSearch Service 클러스터에 대한 교차 계정 액세스 권한으로 Kinesis Data Firehose 스트림을 생성하려면 AWS Command Line Interface(AWS CLI)를 사용하고 구성합니다.

AWS CLI가 최신 버전인지 확인합니다.

aws --version

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인합니다.

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

{
    "DeliveryStreamName": "<Firehose Name>",
    "DeliveryStreamType": "DirectPut",
    "ElasticsearchDestinationConfiguration": {
        "RoleARN": "",
        "ClusterEndpoint": "",
        "IndexName": "local",
        "TypeName": "TypeName",
        "IndexRotationPeriod": "OneDay",
        "BufferingHints": {
            "IntervalInSeconds": 60,
            "SizeInMBs": 50
        },
        "RetryOptions": {
            "DurationInSeconds": 60
        },
        "S3BackupMode": "FailedDocumentsOnly",
        "S3Configuration": {
            "RoleARN": "",
            "BucketARN": "",
            "Prefix": "",
            "BufferingHints": {
                "SizeInMBs": 128,
                "IntervalInSeconds": 128
            },
            "CompressionFormat": "UNCOMPRESSED",
            "CloudWatchLoggingOptions": {
                "Enabled": true,
                "LogGroupName": "/aws/kinesisfirehose/<Firehose Name>",
                "LogStreamName": "S3Delivery"
            }
        },
        "CloudWatchLoggingOptions": {
            "Enabled": true,
            "LogGroupName": "/aws/kinesisfirehose/<Firehose Name>",
            "LogStreamName": "ElasticsearchDelivery"
        }
    }
}

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

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

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

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

이 명령 구문은 계정 B의 OpenSearch Service 클러스터를 대상으로 하여 계정 A의 Kinesis Data Firehose 스트림을 생성합니다.

OpenSearch Service 클러스터로의 교차 계정 스트리밍 테스트

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

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

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")}}"
}

교차 계정 스트리밍이 성공했는지 확인하려면 클러스터의 인덱스(Indices) 탭 아래에 있는 인덱스 항목을 검토합니다. 현재 날짜와 함께 접두사 ‘local’을 사용하는 인덱스 이름이 있는지 확인합니다. OpenSearch 대시보드에 레코드가 있는지 확인할 수도 있습니다.

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