Elastic 即代码:自动化的不只是基础设施

作者:来自 Elastic kylerozanitis

Elastic 即代码:自动化不只是基础设施

Terraform 是工程师常用的工具,用来通过一种叫 Infrastructure as Code( IaC )的模式创建、修改和删除基础设施。它通常用于管理云资源,比如应用负载均衡器( ALB )、数据库和虚拟机,但它同样也可以用来管理 Elastic 集群。不过,在很多 Elastic 环境中,集群创建之后的所有事情都发生在 Kibana 里 ------ 索引模板、索引生命周期管理( ILM )策略、检测规则等等。

这会导致没有源码控制、无法回滚变更、无法进行漂移检测,也没有关于谁在什么时候、为什么修改了什么的审计记录。

Elastic 是一个 API 驱动的平台,这意味着你在 Kibana 中几乎能做的所有事情,也都可以通过 APIs 来完成。这表示我们不仅可以把基础设施作为代码来管理,还可以把更多内容代码化,从而获得可复现的环境、可审计性,以及对整个技术栈的信心。

在今天的博客中,我将展示如何只用一条 terraform apply 命令,就能创建一个 Elastic Cloud 集群、一个 ILM 策略、一个索引模板以及一个检测规则 ------ 所有内容都在 Git 中进行版本控制。

理念

当你刚开始使用 Elastic、学习某个功能如何工作,或者调试一个用于 detection rule 的 ES|QL 查询时,Kibana 非常好用。但最终的目标,应该是尽可能把所有东西都作为代码来管理。这让你可以自由实验,同时仍然能够 rollback 到一个可用的版本。它也确保从 DEV 到 PROD 的变更是经过 review 和 approval 的。就像发布一个新的应用代码版本可能是灾难性的,对 Security Operations Center ( SOC ) 中运行的 detection rule 进行修改,同样可能非常危险。

Elastic 为平台的几乎每一个部分都暴露了 API。因此,通过结合 Terraform Elastic Cloud Provider 和 Elastic Stack Provider,我们可以构建一个可复现的 Elastic-as-Code 工作流,用来部署一个 cloud cluster、ILM 策略、index template,以及 detection rule。

第 1 步:部署一个 Elastic Cloud 集群

使用 Elastic Cloud provider,在你的根 main.tf 文件中定义一个 ec_deployment resource:

ini 复制代码
`

1.  resource "ec_deployment" "demo" {
2.    name                   = "advent-demo"
3.    region                 = "us-east-1"
4.    version                = "9.2.2"
5.    deployment_template_id = "aws-cpu-optimized-faster-warm-arm"

7.    elasticsearch = {
8.      hot = {
9.        autoscaling = {}
10.      }
11.    }

13.    kibana = {
14.      topology = {}
15.    }
16.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这会创建一个完全托管的 Elastic Cloud 部署。请注意,即使没有显式指定 hot 层节点规格,仍然需要包含 hot = { autoscaling = {} }。关于部署模板的更多信息,可以参考 Deployment templates 文档。

第 2 步:定义一个 ILM 策略

使用 Elasticstack provider,通过 elasticstack_elasticsearch_index_lifecycle 资源来定义一个 ILM 策略:

arduino 复制代码
`

1.  resource "elasticstack_elasticsearch_index_lifecycle" "advent_logs_ilm" {
2.    name = "advent-logs-ilm"
3.    delete {
4.      min_age = "30d"

6.      delete {}
7.    }
8.  }

`AI写代码

为了简单起见,这个 ILM 策略会将数据保留在 hot 层 30 天,然后删除。用代码来管理 ILM 策略非常有价值,因为改动可能会对数据以及整个集群健康产生连锁影响。想象这样一个场景:一位工程师决定添加一个 cold 层,设置为 1 个 primary shard 和 1 个 replica shard,但实际上只有一个 cold 节点。你可以想象,很快就会开始看到警告。

第 3 步:绑定 ILM 的 Index Template

在这一步中,我们将使用 elasticstack_elasticsearch_index_template 资源来定义我们的 index template,并引用前一步中定义的 ILM 策略:

ini 复制代码
`

1.  resource "elasticstack_elasticsearch_index_template" "advent_logs_template" {
2.    name           = "advent-logs-template"
3.    index_patterns = ["advent-logs-*"]
4.    priority       = 200

6.    template {
7.      settings = jsonencode({
8.        index = {
9.          lifecycle = {
10.            name = "advent-logs-ilm"
11.          }
12.        }
13.      })

15.      mappings = jsonencode({
16.        properties = {
17.          "@timestamp" = {
18.            type = "date"
19.          }
20.          "message" = {
21.            type = "text"
22.          }
23.          "user" = {
24.            type = "keyword"
25.          }
26.        }
27.      })
28.    }
29.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

步骤 4:检测规则

作为一个经常使用检测规则来处理从传统 SIEM 到更复杂欺诈用例的人来说,Discover 和 Kibana Detection Rules 是一个强大的组合,但一旦你确定了最终配置,最好使用 elasticstack_kibana_security_detection_rule 资源把它存储到 Git 中:

ini 复制代码
`

1.  resource "elasticstack_kibana_security_detection_rule" "failed_login_rule" {
2.    name        = "Multiple Failed Logins (Elastic as Code demo)"
3.    description = "Detects multiple failed login events in advent-logs indices for the Elastic-as-Code demo."
4.    rule_id     = "advent-multiple-failed-logins"

6.    # Detection logic
7.    type     = "query"
8.    query    = "event.action:\"failed-login\""
9.    language = "kuery"
10.    index  = ["advent-logs-*"]

12.    # Scheduling
13.    from     = "now-5m"
14.    to       = "now"
15.    interval = "5m"

17.    # Risk/severity
18.    severity   = "medium"
19.    risk_score = 50

21.    # Misc metadata
22.    enabled = true
23.    tags    = ["terraform", "advent-demo", "elastic-as-code"]
24.    author = ["Kyle Rozanitis"]

26.    # Human context field
27.    license         = "Elastic License v2"
28.    false_positives = ["Legitimate user mistyping their password during normal usage"]
29.    references      = ["https://elastic.github.io/detection-rules-explorer/"]
30.    note            = "Investigate source IP, username, and host. Check for brute force behavior."
31.    setup           = "Ensure authentication events are indexed into 'advent-logs-*'."
32.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

第 5 步:让一切真正运行起来

你的代码仓库现在看起来应该像这样:

markdown 复制代码
`

1.  ├── main.tf
2.  ├── ilm.tf
3.  ├── template.tf
4.  ├── rule.tf

`AI写代码

现在只需运行:

go 复制代码
`terraform apply`AI写代码

Terraform 会创建:

  • 一个新的 Elastic Cloud 集群
  • 一个 ILM 策略
  • 一个与该 ILM 策略关联的索引模板
  • 一个检测规则

这就是 Elastic 平台应有的使用方式。

结语

如果你看到这里,感谢阅读!所有内容都可以在名为 elastic-as-code 的 GitHub 仓库中找到。只需克隆仓库,创建一个 Elastic Cloud API key 并获取你的 Organization ID,将它们添加到 .env 文件中,安装 Terraform,然后运行 terraform apply。

今天的目标是展示如何用 Terraform 管理远不止云基础设施。在我的个人环境中,我甚至会进一步创建 JSON 文件来管理尚未有 Terraform 资源的功能,比如异常检测任务。由于 Elastic 在 Kibana 和 API 之间提供了功能一致性,你可以轻松自动化创建其余资源。

能够回滚错误更改、在更新前进行同行评审、通过分支从 DEV → STAGING → PROD、检测平台漂移,以及用单条命令重建整个栈,这些都是非常强大的能力。

自动化愉快,节日快乐!

原文:discuss.elastic.co/t/dec-7th-2...

相关推荐
Dxy12393102163 小时前
如何基于 Elasticsearch 构建亿级相似图片搜索系统
大数据·elasticsearch·搜索引擎
paj1234567895 小时前
elasticsearch 导出数据命令
大数据·elasticsearch·搜索引擎
shaominjin1236 小时前
使用Git自带的SSH协议搭建git服务器
大数据·elasticsearch·搜索引擎
码--到成功6 小时前
elasticsearch同时启动两个冲突问题
大数据·elasticsearch·bisheng
CodeAmaz6 小时前
Elasticsearch 数据建模详解:nested vs parent-child
elasticsearch·数据扁平·netsted
一个很帅的帅哥6 小时前
部署chat-vue
大数据·git·elasticsearch
初次攀爬者7 小时前
知识库-向量化功能-EXCEL文件向量化
后端·elasticsearch
Elasticsearch7 小时前
使用 Elasticsearch 中的结构化输出创建可靠的 agents
elasticsearch
CodeAmaz8 小时前
Elasticsearch 实际工作中的分页方案详解
elasticsearch·分页·深度分页