Kinesis Data Firehose에서 Amazon OpenSearch Service로 크로스 계정 스트리밍을 설정하려면 어떻게 해야 하나요?

7분 분량
0

다른 계정에 있는 Amazon OpenSearch Service 클러스터로 데이터를 전송하는 Amazon Kinesis Data Firehose 스트림을 설정하고 싶습니다.

간략한 설명

Kinesis Data Firehose와 종속 항목(예: Amazon Simple Storage Service(S3) 및 Amazon CloudWatch)을 설정해 여러 계정 간에 스트리밍할 수 있습니다. 스트리밍 데이터 전송은 FGAC(Fined-grained access control) 활성화 여부에 관계없이 공개적으로 액세스할 수 있는 OpenSearch 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 대시보드에 로그인하여 역할 매핑을 추가합니다.
  6. 계정 A의 Kinesis Data Firehose 역할로 계정 B에 데이터를 전송할 수 있도록 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. 로그 그룹 생성을 선택합니다.
  4. 로그 그룹 이름을 입력합니다.
  5. 새 로그 그룹을 저장하려면 로그 그룹 생성 버튼을 선택합니다.
  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에서 클러스터를 생성해야 합니다.

  1. 정책을 저장합니다.
  2. 역할 생성을 선택합니다.
  3. 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 정의 액세스 정책을 선택합니다. IAM 정책에는 다음 권한이 있어야 합니다.

    {
      "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에 요청을 보낼 수 있습니다.

OpenSearch 대시보드에 로그인하고 역할 매핑을 추가하려면 다음 단계를 따르세요.

  1. 대시보드를 엽니다.
  2. 보안 탭을 선택합니다.
  3. 역할을 선택합니다.
  4. all_access 역할을 선택합니다.
  5. 매핑된 사용자 탭을 선택합니다.
  6. 매핑 관리를 선택합니다.
  7. 백엔드 역할 섹션에서 Kinesis Data Firehose 역할을 입력합니다.
  8. 을 선택합니다.

계정 A의 Kinesis Data Firehose 역할로 계정 B에 데이터를 전송할 수 있도록 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"
      ]
    }
  ]
}

자세한 내용은 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에서 유형은 더 이상 사용되지 않습니다. Elasticsearch 버전 7.x의 경우, input.json 파일에서 TypeName 속성을 제거합니다.

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

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

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

OpenSearch Service 클러스터로 크로스 계정 스트리밍 테스트

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

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

크로스 계정 스트리밍이 성공했는지 확인하려면 클러스터의 인덱스 탭에서 인덱스 항목을 검토하세요. 현재 날짜에 접두사 “local”을 사용하는 인덱스 이름이 있는지 확인합니다. OpenSearch 대시보드에 레코드가 있는지 확인할 수도 있습니다.

참고: OpenSearch Service에서 올바른 매핑을 결정하는 데 몇 분 정도 걸립니다.

관련 정보

Amazon Kinesis Data Firehose 전송 스트림 생성

Kinesis Data Firehose을 사용해 Kinesis Data Firehose에 쓰기

AWS 공식
AWS 공식업데이트됨 6달 전