如何設定從 Kinesis Data Firehose 至 Amazon OpenSearch Service 的跨帳戶串流?

5 分的閱讀內容
0

我想要設定 Amazon Kinesis Data Firehose 串流,以將資料傳送至另一個帳戶中的 Amazon OpenSearch Service 叢集。

簡短描述

設定 Kinesis Data Firehose 及其相依性 (例如 Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudWatch),以跨不同的帳戶進行串流。無論是否開啟精細的存取控制 (FGAC),串流資料交付都適用於可公開存取的 OpenSearch Service 叢集。

若要設定 Kinesis Data Firehose 串流,以便將資料傳送至 OpenSearch Service 叢集,請完成下列步驟:

  1. 在帳戶 A 中建立 Amazon S3 儲存貯體。
  2. 在帳戶 A 中建立 CloudWatch 日誌群組和日誌串流。
  3. 在帳戶 A 中建立 Kinesis Data Firehose 角色和政策。
  4. 在帳戶 B 中建立可公開存取的 OpenSearch Service 叢集,以便帳戶 A 中的 Kinesis Data Firehose 角色在其中對資料進行串流。
  5. (選用) 如果已開啟 FGAC,請登入 OpenSearch 儀表板並新增角色映射。
  6. 更新帳戶 A 中您的 Kinesis Data Firehose 角色的 AWS Identity Access Management (IAM) 角色政策,以將資料傳送至帳戶 B。
  7. 在帳戶 A 中建立 Kinesis Data Firehose 串流。
  8. 測試 OpenSearch Service 叢集的跨帳戶串流。

解決方案

在帳戶 A 中建立 Amazon S3 儲存貯體

在帳戶 A 中建立 S3 儲存貯體。Amazon S3 儲存貯體會產生 Amazon Resource Name (ARN)。

**注意事項:**稍後使用完整的 ARN 授予 Kinesis Data Firehose 存取權,以儲存和擷取 Amazon S3 儲存貯體中的記錄。

在帳戶 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. 建立 IAM 政策,以允許 Kinesis Data Firehose 執行下列操作:
    將串流日誌儲存至 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 角色。

在帳戶 B 中建立可公開存取的 OpenSearch Service 叢集,以便帳戶 A 中的 Kinesis Data Firehose 角色對資料進行串流

  1. 在帳戶 B 中建立可公開存取的 OpenSearch Service 叢集
  2. 記錄 OpenSearch Service 網域 ARN。您可以在稍後的步驟中使用 ARN。
  3. 設定叢集的安全設定。
    **重要事項:**您必須設定 OpenSearch Service 安全設定,以允許帳戶 A 中的 Kinesis Data Firehose 角色串流至您的 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。

若要登入 OpenSearch 儀表板並新增角色映射,請完成下列步驟:

  1. 開啟儀表板。
  2. 選擇安全索引標籤。
  3. 選擇角色
  4. 選擇 all_access 角色。
  5. 選擇映射的使用者標籤。
  6. 選擇管理映射
  7. 後端角色區段中,輸入 Kinesis Data Firehose 角色。
  8. 選擇映射

更新帳戶 A 中您的 Kinesis Data Firehose 角色的 IAM 角色政策,以將資料傳送至帳戶 B

若要將資料從帳戶 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 對 Amazon OpenSearch Service 目的地的存取權

在帳戶 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

此命令語法會在帳戶 A 中建立 Kinesis Data Firehose 串流,目的地為帳戶 B 中的 OpenSearch Service 叢集。

測試 OpenSearch Service 叢集的跨帳戶串流

使用 Kinesis Data Generator (KDG) 將記錄串流到帳戶 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 Streams 寫入 Kinesis Data Firehose

AWS 官方
AWS 官方已更新 5 個月前