本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用 Amazon OpenSearch Ingestion 将数据提取到域
本教程介绍如何使用 Amazon OpenSearch Ingestion 配置简单的管道,以及将数据摄取到 Amazon OpenSearch Service 域。管道是 OpenSearch Ingestion 预调配和管理的资源。您可以使用管道筛选、丰富、转换、规范化和聚合数据,以便在 OpenSearch Service 中执行下游分析和可视化。
本教程将指导您完成快速启动并运行管道的基本步骤。有关更多详细信息,请参阅 创建管道。
在本教程中,您将完成以下步骤:
在本教程中,您将创建以下资源:
-
名为
ingestion-pipeline
的管道 -
管道将写入的名为
ingestion-domain
的域 -
管道将担任一个名为
PipelineRole
的 IAM 角色,以便写入域
所需的权限
要完成本教程,您必须拥有正确的 IAM 权限。您的用户或角色必须已经附加基于身份的策略,并且具有以下最低权限。这些权限允许您创建管道角色 (iam:Create
)、创建或修改域 (es:*
) 以及使用管道 (osis:*
)。
此外,还需要对管道角色资源拥有 iam:PassRole
权限。此权限允许您将管道角色传递给 OpenSearch Ingestion,以便它可以将数据写入域。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Resource":"*", "Action":[ "osis:*", "iam:Create*", "es:*" ] }, { "Resource":[ "arn:aws:iam::
your-account-id
:role/PipelineRole" ], "Effect":"Allow", "Action":[ "iam:PassRole" ] } ] }
步骤 1:创建管道角色
首先,创建一个管道将担任的角色,以便访问 OpenSearch Service 域接收器。在本教程后面的部分中,您将在管道配置中包含此角色。
要创建管道角色
-
打开 Amazon Identity and Access Management 控制台,地址:https://console.aws.amazon.com/iamv2/
。 -
选择策略,然后选择创建策略。
-
在本教程中,您将数据摄取到名为
ingestion-domain
的域,该域将在下一步中创建。选择 JSON,然后将下面的策略粘贴到编辑器中。使用您的账户 ID 替换{your-account-id}
,并在必要时修改区域。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "es:DescribeDomain", "Resource": "arn:aws:es:
us-east-1
:your-account-id
:domain/ingestion-domain" }, { "Effect": "Allow", "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-east-1
:your-account-id
:domain/ingestion-domain/*" } ] }如果您想将数据写入现有域,请使用您的域名替换
ingestion-domain
。注意
为简单起见,本教程使用较为宽泛的访问策略。但是,在生产环境中,建议您对管道角色应用严格一些的访问策略。有关提供最低所需权限的策略示例,请参阅 向 Amazon OpenSearch Ingestion 管道授予访问域的权限。
-
依次选择下一步、下一步,然后命名您的策略 pipeline-policy。
-
选择创建策略。
-
然后,创建一个角色并将策略附加到该角色。选择 角色,然后选择 创建角色。
-
选择自定义信任策略,并将以下策略粘贴到编辑器中:
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"osis-pipelines.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
-
选择下一步。然后搜索并选择(您刚刚创建的)pipeline-policy。
-
选择下一步,将角色命名为 PipelineRole。
-
选择 创建角色。
请记住角色的 Amazon 资源名称(ARN)(例如,arn:aws:iam::
)。您创建管道时需要用到。your-account-id
:role/PipelineRole
步骤 2:创建域
接下来,创建一个名为 ingestion-domain
的域,以向其中摄取数据。
导航到位于 https://console.aws.amazon.com/aos/home
-
运行 OpenSearch 1.0 或更高版本,或 Elasticsearch 7.4 或更高版本
-
使用公有访问
-
不使用精准访问控制
注意
这些要求是为了让本教程简单易懂。在生产环境中,您可以配置具有 VPC 访问权限的域和/或使用精细访问控制。要使用精细访问控制,请参阅映射管道角色。
域必须拥有授予 PipelineRole
访问权限的访问策略,这是在上一步中创建的。管道将担任此角色(在管道配置中名为 sts_role_arn),以便将数据发送到 OpenSearch Service 域接收器。
确保该域具有以下域-级别访问策略,该策略授予对该域的 PipelineRole
访问权限。替换成您自己的区域和账户 ID:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
your-account-id
:role/PipelineRole" }, "Action": "es:*", "Resource": "arn:aws:es:us-east-1
:your-account-id
:domain/ingestion-domain/*" } ] }
有关创建域-级别访问策略的更多信息,请参阅基于资源的访问策略。
如果您已经创建了域,请修改其现有访问策略以向 PipelineRole
提供上述权限。
注意
记住域端点(例如 https://search-
)。在下一步中,您将使用它来配置管道。ingestion-domain
.us-east-1.es.amazonaws.com
步骤 3:创建管道
现在,您已经拥有了具有相应访问权限的域和角色,可以创建管道了。
要创建管道
-
在 Amazon OpenSearch Service 控制台的左侧导航窗格中,选择管道。
-
选择 创建管道。
-
选择空白管道,然后选择选择蓝图。
-
将管道命名为 ingestion-pipeline,并将容量设置保留为默认值。
-
在本教程中,您将创建一个使用 Http 源
插件的名为 log-pipeline
的简单子管道。此插件接受 JSON 数组格式的日志数据。您将指定一个 OpenSearch Service 域作为接收器,并将所有数据摄取到application_logs
索引中。在管道配置下,将以下 YAML 配置粘贴到编辑器中:
version: "2" log-pipeline: source: http: path: "/${pipelineName}/test_ingestion_path" processor: - date: from_time_received: true destination: "@timestamp" sink: - opensearch: hosts: [ "https://search-
ingestion-domain
.us-east-1
.es.amazonaws.com" ] index: "application_logs" aws: sts_role_arn: "arn:aws:iam::your-account-id
:role/PipelineRole" region: "us-east-1
"注意
该
path
选项指定用于提取的 URI 路径。对于基于拉取的源而言,此为必需选项。有关更多信息,请参阅 指定提取路径。 -
将
hosts
URL 替换为您在上一节中创建(或修改)的域的端点。将sts_role_arn
参数替换为PipelineRole
的 ARN。 -
选择验证管道并确保验证成功。
-
为简单起见,本教程为管道配置公有访问权限。在 网络下,选择 公有访问权限。
有关配置 VPC 访问权限的更多信息,请参阅 为 Amazon OpenSearch Ingestion 管道配置 VPC 访问。
-
保持日志发布为启用状态,以防您在完成本教程时遇到任何问题。有关更多信息,请参阅 监控管道日志。
指定以下日志组名称:
/aws/vendedlogs/OpenSearchIngestion/ingestion-pipeline/audit-logs
-
选择下一步。检查您的管道配置,然后选择创建管道。管道需要 5-10 分钟才能变为活动状态。
步骤 4:摄取一些示例数据
当管道状态为 Active
时,您可以开始将数据摄取到管道。您必须使用 Signature 版本 4 对向管道发出的所有 HTTP 请求进行签名。使用诸如 Postman
注意
签署请求的主体必须具有 osis:Ingest
IAM 权限。
首先,从管道设置页面获取摄取 URL:
然后,摄取一些示例数据。以下请求使用 awscurlapplication_logs
索引发送单个日志文件:
awscurl --service osis --region
us-east-1
\ -X POST \ -H "Content-Type: application/json" \ -d '[{"time":"2014-08-11T11:40:13+00:00","remote_addr":"122.226.223.69","status":"404","request":"GET http://www.k2proxy.com//hello.html HTTP/1.1","http_user_agent":"Mozilla/4.0 (compatible; WOW64; SLCC2;)"}]' \ https://pipeline-endpoint
.us-east-1
.osis.amazonaws.com/log-pipeline/test_ingestion_path
您现在会看到 200 OK
响应。如果您遇到身份验证错误,可能是因为您从与管道不同的账户提取数据。请参阅 修复权限问题。
现在,查询 application_logs
索引以确保成功提取您的日志条目:
awscurl --service es --region
us-east-1
\ -X GET \ https://search-ingestion-domain
.us-east-1
.es.amazonaws.com/application_logs/_search | json_pp
示例响应:
{ "took":984, "timed_out":false, "_shards":{ "total":1, "successful":5, "skipped":0, "failed":0 }, "hits":{ "total":{ "value":1, "relation":"eq" }, "max_score":1.0, "hits":[ { "_index":"application_logs", "_type":"_doc", "_id":"z6VY_IMBRpceX-DU6V4O", "_score":1.0, "_source":{ "time":"2014-08-11T11:40:13+00:00", "remote_addr":"122.226.223.69", "status":"404", "request":"GET http://www.k2proxy.com//hello.html HTTP/1.1", "http_user_agent":"Mozilla/4.0 (compatible; WOW64; SLCC2;)", "@timestamp":"2022-10-21T21:00:25.502Z" } } ] } }
修复权限问题
如果您按照教程中的步骤进行操作,但在尝试摄取数据时仍然看到身份验证错误,则可能是因为写入管道的角色与管道本身的 Amazon Web Services 账户 不同。在这种情况下,您需要创建并担任一个角色,该角色让您专门用来摄取数据。有关说明,请参阅 提供跨账户摄取访问权限。
相关资源
本教程介绍了一个通过 HTTP 摄取单个文档的简单用例。在生产场景中,您将配置客户端应用程序(例如 Fluent Bit、Kubernetes 或 OpenTelemetry Collector)以将数据发送到一个或多个管道。您的管道可能比本教程展示的简单示例复杂得多。
要开始配置您的客户端并摄取数据,请参阅以下资源: