使用Terraform Cloud进行Datadog管理

我们公司使用Terraform来管理Datadog的配置设置。

如果您对管理对象的功能或其操作方式感兴趣的话,我相信您可能会在去年公司的圣诞日历中找到相关说明。

 

简单来说,割爱是指以下的内容。

    • 会社としては Datadog Dashboard, Monitor, Synthetic Test, APM, RUM, SLO などの機能を使用している

 

    • そのうち以下について Terraform 管理下に置いている

Monitor
Synthetic Test
Integrations (AWS, GCP )

GitHub Actions を用いて CI/CD を実施している。

以下のような Lint ツールを用いてレビュープロセスを自動化している

tooldescriptiontflinttf ファイルの lint ツールtfsectf ファイル中にセキュリティ的に問題がある記述がないかチェックtfcmtterraform plan した結果を PullRequest に投稿するツールtfupdateterraorm 本体や provider などのバージョンチェックツール。 tfupdate-action と組み合わせて最新版があれば自動的に PullRequest を生成actionlintterraform と直接関係ないですが、GitHub Actions の構文に問題がないかチェック

这篇文章主要介绍了关于使用Terraform Cloud进行Datadog管理和配置的方法和设置。以上是去年的内容,但今年我们将引入Terraform Cloud作为更新。

关于 Terraform Cloud

Terraform Cloud 是由 Hashicorp 公司提供的 SaaS 服务。
在以往,我们通常需要在每台本地PC、工作环境、CI工具等环境中执行 terraform 命令行来进行操作。但是,通过使用 Terraform Cloud,我们可以在「Hashicorp 提供的云环境」上执行 terraform 命令。

从2023年5月开始,价格体系将发生变化,可以以免费计划使用500个资源。

image.png

在 Terraform 云上,我们提供以下环境。

Terraform 実行環境

Hashicorp が提供するクラウド環境上で terraform plan , apply の実行が可能

tfstate file の管理

Terraform Cloud が提供するセキュアな環境に tfstate ファイルの管理を移譲することができる
変更履歴や、現在の設定値の閲覧等、管理用の UI も提供されている

実行時の環境変数、Secret (Sensitive Variables) の管理

イベント通知機能

terraform apply が行われたら特定の Slack チャンネルへの通知を行う、ということが可能

実行履歴等、Terraform Cloud に関する情報が確認できる UI の提供
各種 API の提供

terraform コマンドとの integration サポート

terraform login コマンドを実行して Terraform Cloud アカウントとの連携を行うことで、既存の terraform コマンド実行時に Terraform Cloud 環境上で plan や apply を実行可能

个人认为,Terraform Cloud的重要优点是能在一个稳定的环境中集中管理设置、文件等,并且能够在更安全的环境中运行terraform命令。

Terraform Cloud的基本配置设置

在Terraform Cloud上,您可以在组织/工作区(Organization / Workspace)中创建空间,并在其中管理TF文件。

组织/工作空间之间的协作在以下的 terraform cloud block 中描述。

terraform {
  cloud {
    organization = "some_organization"

    workspaces {
      name = "some_workspace"
    }
  }
}

与 Datadog 的集成设置

使用Terraform时,通常可以使用Datadog Provider来使用Datadog。

在Terraform Cloud上,可以以”变量”的形式注册变量。注册值可以是明文,但也可以以”敏感变量”的形式注册密钥信息。

因此,当使用Terraform Cloud时,可以将提供程序传递的凭据信息注册为敏感变量,并引用该值。

由于变量可以在组织/工作空间级别进行设置,因此可以根据使用情况在合适的位置进行设置。

image.png

在上述的方式中注册变量后,可以按照以下定义记录,从变量中获取值。

terraform {
  required_version = "1.6.5"
  required_providers {
    datadog = {
      source  = "DataDog/datadog"
      version = "3.33.0"
    }
  }
}

variable "datadog_api_key" {
  type = string
}
variable "datadog_app_key" {
  type = string
}

provider "datadog" {
  api_key = var.datadog_api_key
  app_key = var.datadog_app_key
}

在本地环境中运行通常的terraform命令时,秘密信息的管理,例如Datadog的API密钥,将成为一个问题。然而,如果使用Terraform Cloud,就可以在Terraform Cloud中集中管理秘密信息,并且无论从哪个环境启动,都可以实现计划(plan)和应用(apply)的执行环境的统一,这是一个优点。

与 GitHub Actions 进行集成设置

以下的描述不仅限于 GitHub Actions,但可以使用从 Terraform Cloud 分配的 Token 信息来与 Terraform Cloud 进行协作。

因此,只需在GitHub Actions等CI环境中设置令牌,即可使用Terraform Cloud环境。
具体操作是将令牌信息注册到GitHub Actions Secret中,并进行以下描述。

      - name: setup terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.6.5
          cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}

与Slack的集成设置。

在一般的Terraform环境中,设置在terraform apply时通知到Slack等工具,可能会很麻烦。但是,在Terraform Cloud中,这个功能是作为标准功能提供的,只需在Terraform Cloud上进行设置即可实现集成。

image.png

只需要某些必要的设置才能使用Terraform Cloud,然后terraform命令就可以像以前一样使用,同时大部分CI/CD环境的设置也可以直接使用。此外,由于可以享受Terraform Cloud提供的便利性,所以非常推荐使用Terraform Cloud服务。在Datadog管理方面,我也感受到了使用Terraform Cloud集中管理API密钥的优点。

附加内容:关于与Terraform Cloud无直接关系的技巧

以上就是关于Terraform Cloud和Datadog的集成的讨论,但是以下,作为额外内容,我会写两点关于今年在Terraform管理方面为Dadadog所做的工作。

将监视设置模块化

Terraform中的模块功能是将多个资源的定义打包成一组的功能。

作为module的典型使用案例,常常提到将AWS的各种资源(例如负载均衡器、EC2/ECS、ElastiCache、RDS/Aurora等)的配置整合在一起,以便高效构建相似的环境。当然,这种例子也非常实用,但我认为像Datadog这样能够跨多个组件进行类似配置的解决方案更符合模块化的思想,并且更容易进行通用处理的打包。

在中国,只需要一种选项,将以下内容用中文进行同义改述:

设定例

在我手上的环境中,我将目录结构设置如下。
在terraform/modules目录下创建了各种云服务提供商的目录,并在terraform/modules/(provider)/modules下分别放置与各个提供商相关的模块。

├ terraform
  ├ modules
    ├ aws
     ├ modules
       ├ ec2
       ├ ...
    ├ gcp
    ├ datadog
    ├ ...
  ├ roots
    ├ some_terraform_root
    ├ ...
image.png

每个模块的文件结构如下所示。

file namenoteREADME.mdこの module の使い方、設定方法などの解説provider.tfこの module が使用する provider の設定variables.tfこの module で設定する変数の定義(resource name).tf各環境の設定

例如,对于针对 EC2 的 Datadog 监视设置(datadog_monitor),通常会执行以下类似的监视项目,而且在大多数情况下,监视项目在所有环境中都是相同的。

    • CPU Utilization

 

    • Load Average

 

    • Memory Utilization

 

    • Disk Space

 

    • Network

 

    etc…

如果事先定义一个可以统一执行上述 EC2 监控设置的模块,那么只需调用该模块即可编写设置说明,并且消除了各环境设置项的波动,从而可以高效地进行监控设置管理。对于阈值和报警通知对象等在不同环境中不同的设置,我们将其作为变量传递,并且确保可以从模块调用方进行指定。以下是调用该模块的简单说明示例。

module "monitor_aws_ec2" {
  source = "../../modules/aws/modules/ec2"

  tags          = var.tags
  (snip.)
}

通过将Datadog监控设置模块化,我们能够轻松地向新环境添加监控设置,并且消除了不同环境间的监控设置差异,使得Datadog管理更加容易。

通过使用import block命令导入现有的配置。

Terraform 的配置通常是从头开始创建 TF 文件,但如果配置项比较复杂的资源的话,有时我们可能想要从现有的配置中导入。
特别是对于 Datadog,不论是监控还是仪表板的描述都很复杂,因此从零开始编写查询也很麻烦,我们可能希望将事先在 Datadog 上创建好的内容导入到 Terraform 中。

在以前,我们已经能够进行导入处理了,但从terraform 1.5版本开始,发布了名为”import block”的功能,使导入比以前更加容易。

 

import {
  id = 1234567890
  to = datadog_monitor.sada_activity
}

以下是用于将DataDog监控定义导入特定资源的定义。
id字段包含监控的id(URL结尾处的内容)
to字段包含生成后的TF文件资源的名称。

在以上状态下运行 “terraform plan” 命令,它会对比 tfstate 文件和本地的 tf 文件,检查是否有差异,并将差异内容显示出来。
如果将设置与已消除差异后运行 “terraform apply” 命令,则完成导入。

只需要一个选项:由于可以在 Terraform 文件中以声明性方式编写 import 过程,因此在工作中感到很安心,而且作为一种方便的功能,可以很轻松地执行导入步骤。

广告
将在 10 秒后关闭
bannerAds