公司新闻

Our News

使用 GitHub 和 Jenkins 管理 Amazon OpenSearch Service 的

公司新闻

使用 GitHub 和 Jenkins 管理 Amazon OpenSearch Service 的

2026-01-27 13:00:21 27

使用 GitHub 和 Jenkins 管理 Amazon OpenSearch Service 可视化、警报等

关键要点

本文介绍了如何利用 GitHub 和 Jenkins 部署 Amazon OpenSearch Service 中的储存对象,确保用户无法直接更改生产环境。方案设计包含三类角色:贡献者、用户和审核者,各自承担不同的职责。通过 CI/CD 流程自动化该过程,同时提高了数据的安全性和可追踪性。

Amazon OpenSearch Service 是一项完全托管的搜索和分析服务,帮助组织保护数据、执行搜索、实时监控应用程序并进行交互式日志分析。该服务具有可扩展性、可靠性和易用性,有助于企业优化数据驱动的决策,提高运营效率。 AWS 处理底层基础设施的管理,包括服务安装、配置、复制和备份,使您可以专注于应用程序的业务层面。

随着用户基础和 Amazon OpenSearch Service 域的增长,跟踪活动和对储存对象的更改变得越来越困难。建议制止贡献者直接对生产 OpenSearch Service 域做出更改,并实施控制流程以在将更改迁移到 OpenSearch Service 之前进行验证和测试。

在本文中,我们提供了一种利用 GitHub 和 Jenkins 部署储存对象的解决方案,同时防止用户直接更改 OpenSearch Service 域。

解决方案概述

该解决方案包含三类角色:

贡献者:负责创建、更新或删除储存对象,如警报或仪表盘。用户:使用仪表盘但不修改任何储存对象。审核者:在 GitHub 拉取请求中审核和批准储存对象的更改。

以下图表显示了在 OpenSearch Service 域中直接进行储存对象更改的架构。随着组织扩大 OpenSearch Service 域的使用,管理和跟踪多个域中的储存对象的更改变得越来越有挑战性。

下图显示了解决方案架构,通过持续集成和交付CI/CD管道管理储存对象。

建议解决方案

部署储存对象更改的工作流程包括以下步骤:

贡献者将更改提交为 JSON 文件到 GitHub 仓库。OpenSearch 服务管理员审核者审核更改,批准拉取请求并将更改合并到仓库。新的提交会触发 Jenkins 中的构建作业。Jenkins 从 GitHub 仓库检索 JSON 文件并进行验证。Jenkins 运行 OpenSearch Service API 以部署更改。

CI/CD 自动化代码集成、测试和部署:CI 专注于频繁的代码合并和自动化测试,CD 确保代码始终准备好进行部署,通常直接推送更新到生产。这样可以加快软件发布的速度,提高其可靠性。

在接下来的部分中,我们将展示如何使用 GitHub 和 Jenkins 构建 CI/CD 管道以部署 OpenSearch Service 的安全角色。通过在 Jenkins 中使用 多分支管道,您可以为不同类型的储存对象创建管道。您可以根据自己的需要调整提议的架构。

前提条件

要实施此解决方案,您需要一个 AWS 账户。如果没有,可以 创建一个账户。您还需要一个 Amazon OpenSearch Service 域。您可以使用现有的域或 创建新域。

建议将 OpenSearch Service 域部署在 VPC 中以确保安全性。

创建 IAM 角色

在此步骤中,您需要创建一个 AWS 身份与访问管理 (IAM) 角色 供 Jenkins 在连接 Amazon OpenSearch Service 时使用。然后将此角色映射到 Amazon OpenSearch Service 域的安全角色。

完成以下步骤:

在 IAM 控制台中,创建一个名为 CodeCommitPolicy 的策略,配置如下权限替换账号 ID 和 Amazon OpenSearch Service 域名:

json{ Version 20121017 Statement [ { Effect Allow Action esDescribeDomain Resource arnawses{youraccountid}domain/ } { Effect Allow Action esESHttp Resource arnawses{youraccountid}domain/{domainname}/ } ]}

将此策略分配给 IAM 角色 CodeCommitRole。在信任策略中,指定 Amazon Elastic Compute Cloud (Amazon EC2) 可以承担此角色:

json{ Version 20121017 Statement [ { Effect Allow Principal { Service ec2amazonawscom } Action stsAssumeRole } ]}

记下角色 ARN。使用 OpenSearch Dashboards URL 打开 Amazon OpenSearch Service 仪表盘。

在导航面板中,选择 安全性,然后选择 角色。将前面步骤中的 IAM 角色映射到 Amazon OpenSearch Service 域的 securitymanager 角色,以启用 API 调用。

您可以根据您所部署的储存对象类型将 IAM 角色映射到 Amazon OpenSearch Service 域角色。

启动 EC2 实例

请注意:确保在与 OpenSearch 域相同的 VPC 中部署 EC2 实例以托管 Jenkins。

完成以下步骤以设置 EC2 实例以安装 Jenkins:

启动 EC2 实例,选择最新的 Amazon Linux 2023 AMI。在高级设置中,选择 IAM 实例配置文件,并将之前创建的 CodeCommitRole 映射到该 EC2 实例。打开 22 端口以进行 SSH 连接,并打开 Jenkins 服务使用的 8080 端口。Python 已与最新的 Amazon Linux AMI 一同打包。确保 Python 版本在 270 以上:

bashpython3 version

在 EC2 服务器上安装和配置 Jenkins

在此步骤中,您将在 EC2 服务器上 安装和配置 Jenkins。在上一步创建的 Jenkins EC2 实例终端上完成以下步骤:

使用 系统管理器 连接到您的实例:

bashsudo dnf update

使用以下命令添加 Jenkins 存储库:

bashsudo wget O /etc/yumreposd/jenkinsrepo https//pkgjenkinsio/redhatstable/jenkinsrepo

飞跃加速器下载导入密钥文件以启用从软件包安装:

bashsudo rpm import https//pkgjenkinsio/redhatstable/jenkinsio2023key

升级所有 Yum 包:

bashsudo dnf upgrade

安装 Java适用于 Amazon Linux 2023:

bashsudo dnf install java17amazoncorretto y

安装 Jenkins:

bashsudo dnf install jenkins y

设置 Jenkins 服务在启动时自启:

bashsudo systemctl enable jenkins

启动 Jenkins 服务:

bashsudo systemctl start jenkins

配置 Jenkins 服务器

Jenkins 现在应该在 EC2 实例的 8080 端口运行。您可以通过连接到 EC2 实例的公有 IPv4 DNS,使用浏览器访问 Jenkins,这个地址可以在 Amazon EC2 控制台的 EC2 实例详情页面找到。默认情况下,Jenkins 服务器使用 HTTP 协议。为了确保安全性,您可以将其设置为在 应用负载均衡器 或 NGINX 代理后面运行。

使用下面的 URL 在浏览器中打开 Jenkins 网络控制台,并替换 EC2 IP 地址。http//EC2 IPv4 DNS8080

第一次打开 Jenkins 时,它会请求管理员密码。使用以下位置找到的管理员密码解锁 Jenkins:

bashsudo cat /var/lib/jenkins/secrets/initialAdminPassword

然后您可以创建管理员用户名和密码。

创建 GitHub 仓库

在此步骤中,您创建一个 GitHub 仓库,将 Amazon OpenSearch Service 安全角色以 JSON 格式存储。完成以下步骤:

访问 githubcom,登录或创建账户。

请注意:如果您在 VPC 内部部署 Jenkins 服务器,可以连接到 VPC 内可访问的仓库。要连接到公有 GitHub 仓库,请使用 互联网网关。

选择 新建仓库。提供仓库名称 openSearch2,并将其创建为私有仓库。在 设置 菜单中,选择 开发者设置,个人访问令牌,令牌经典,并创建一个令牌,该令牌将被 Jenkins 用来从 GitHub 仓库获取文件。

创建 Jenkins 作业

在此步骤中,您创建一个 Jenkins 作业,该作业将获取提交到 GitHub 仓库的新更改并对其进行验证和部署到 Amazon OpenSearch Service。

使用创建的用户名和密码打开 Jenkins 的网络界面,然后在 Jenkins 网络界面上完成以下步骤:

在 Jenkins 首页,选择 新建条目。输入管道名称并选择 自由风格项目。选择 确定 继续。提供 Jenkins 作业的描述。在 常规 部分中,选择 高级。设置自定义工作区,以便 Jenkins 可以在 GitHub 仓库中存储文件:

bash/var/lib/jenkins/workspace/opensearch

在源代码管理中,选择 Git。输入您所创建的 GitHub 仓库的 URLhttps//githubcom/ltaccountownergt/opensearchgit。在 凭证 部分中,选择 添加,添加为 GitHub 仓库创建的访问令牌。将其他设置保持为默认。在 构建触发器 部分,设置 轮询 SCM 为 H/05 。

一个真实的交付流水线会有多个阶段:一个用于构建、一个用于测试和一个用于部署,您可以在其中放入自定义逻辑以验证 JSON 文件的语法和业务逻辑,并在将文件部署到 OpenSearch Service 域之前采取一系列行动。在本文中,我们仅关注部署阶段。

groovyJenkinsfile (声明式流水线)pipeline { agent any options { skipStagesAfterUnstable() } stages { stage(Build) { steps { echo 构建中 } } stage(Test) { steps { echo 测试中 } } stage(Deploy) { steps { echo 部署中 } } }}

在构建步骤中输入以下命令并点击保存,以保存 Jenkins 作业:

bash/usr/bin/python3 /opensearch/rolespy

在 Jenkins 服务器上放置 Python 脚本并安装依赖项

在此步骤中,您将在 Jenkins 服务器上安装 Python 包并创建 Python 文件。这些文件将读取储存对象 JSON 文件,连接到 Amazon OpenSearch Service 域,并调用 OpenSearch Service 的 createrole API。

在 Jenkins 服务器上运行以下步骤:

安装 python3pip:

bashsudo yum install python3pip

安装所需的 Python 包:

bashsudo python3 m pip install opensearchpy requestsaws4auth boto3

在 Jenkins 服务器的 /opensearch 目录下创建一个名为 userspy 的新文件,并输入以下代码:

pythonfrom opensearchpy import OpenSearch RequestsHttpConnectionfrom requestsaws4auth import AWS4Authimport boto3import os

host = searchXXXXXXXXXXXXXXXXXXXXuseast1esamazonawscom # 例如 mytestdomainuseast1esamazonawscom,此地址对于 VPC 托管的域会有所不同region = useast1 # 例如 uswest1service = escredentials = boto3Session()getcredentials()awsauth = AWS4Auth(credentialsaccesskey credentialssecretkey region service sessiontoken=credentialstoken)

创建客户端。

search = OpenSearch( hosts=[{host host port 443}] httpauth=awsauth usessl=True verifycerts=True httpcompress=True # 启用请求正文的 gzip 压缩 connectionclass=RequestsHttpConnection)

pythonFiles = [file for dirs in oswalk(/var/lib/jenkins/workspace/opensearch2/ topdown=True) for file in dirs[2] if fileendswith(json)]for r in pythonFiles path = f/var/lib/jenkins/workspace/opensearch2/{r} print(path) rolename = rrsplit( 1)[0] data = open(path r)read() response = searchsecuritycreaterole(rolename body=data) print(response)

测试解决方案

要测试该解决方案,将新角色文件 itadminrolejson 推送到 GitHub 仓库,并建立一个作业,将在 Amazon OpenSearch 服务域中创建角色 itadminrole。

Jenkins 将获取更改并在下次扫描时运行作业。您也可以从 Jenkins 网站手动运行构建作业,这将会在 OpenSearch Service 域中创建角色 itadminrole。

使用 GitHub 和 Jenkins 管理 Amazon OpenSearch Service 的

我们观察到如何自动化构建周期,从推送安全角色的更改开始,继而进行 OpenSearch 管理员的审批和拉取请求合并。该操作触发 Jenkins 构建作业,处理验证、测试和部署。

清理

为避免未来产生额外费用,删除在构建此解决方案时创建的资源:

删除 Amazon OpenSearch Service 域。删除 GitHub 仓库。删除 EC2 实例。

结论

在本文中,我们展示了如何使用 GitHub 和 Jenkins 构建一个 CI/CD 管道,用于部署 Amazon OpenSearch Service 的安全角色。采用此方法可以防止用户直接提交更改到生产 OpenSearch Service 域。该解决方案跟踪每个用户所做的更改,并根据业务规则执行额外的验证检查和测试,最后将更改推送至 OpenSearch Service 域。此外,这种方法的另一个优势是能够通过更改