使用Terraform配置Logtail采集配置

Terraform是一种开源工具,用于安全高效地预览、配置和管理云基础架构和资源。本文介绍如何使用Terraform调用接口创建Logtail采集配置。

前提条件

已安装Terraform

  • 在Cloud Shell中使用Terraform:Cloud Shell默认安装配置了Terraform和阿里云账号信息,无需任何额外配置。更多信息,请参见在Cloud Shell中使用Terraform

  • 在本地安装和配置Terraform:操作步骤请参见在本地安装和配置Terraform,在第4步中确保registry.terraform.io/aliyun/alicloud版本为1.219.0及以上。

配置步骤

步骤一:配置AccessKey和日志服务的中心化地域

在环境变量中配置阿里云账号AccessKey和日志服务中心Project所在的地域。

Cloud Shell中使用Terraform

# Region ID
export ALICLOUD_REGION="cn-shanghai"
重要

使用Cloud Shell无需配置身份信息,建议使用RAM用户登录阿里云控制台,降低密钥泄露造成的安全风险。

参数

说明

ALICLOUD_REGION

日志服务Project所在地域,更多信息,请参考开服地域

在本地使用Terraform

# alicloud AK
export ALICLOUD_ACCESS_KEY="AccessKey ID"
export ALICLOUD_SECRET_KEY="AccessKey Secret"
# Region ID
export ALICLOUD_REGION="cn-shanghai"

参数

说明

ALICLOUD_ACCESS_KEY

阿里云账号的访问密钥AccessKey ID。更多信息,请参见访问密钥

重要

建议使用RAM用户的AccessKey ID和AccessKey Secret,降低密钥泄露造成的安全风险。

ALICLOUD_SECRET_KEY

阿里云账号的访问密钥AccessKey Secret。更多信息,请参见访问密钥

ALICLOUD_REGION

日志服务Project所在地域,更多信息,请参考开服地域

步骤二:创建日志服务Project

  1. 执行以下命令,创建一个Terraform工作目录,名称例如sls

    mkdir sls
  2. 执行以下命令,切换到刚创建的目录下。

    cd sls
  3. 在该目录下创建一个文件,名称例如terraform.tf

    touch terraform.tf
  4. terraform.tf文件中,添加如下内容。

    resource "alicloud_log_project" "project_example" {
      project_name = "terraform-example"
      description = "terraform-example"
    }

    alicloud_log_project为资源类型,相关参数说明如下。完整参数说明,请参见Terraform-Alicloud Log Project

    参数

    是否必填

    说明

    project_example

    Resource名称。

    project_name

    SLS日志服务project 名称,需要保证唯一性。

    description

    project的描述。

  5. 按下键盘上的Esc键退出编辑模式,然后输入:wq保存并退出文件。

  6. 在工作目录sls下,执行如下命令,初始化Terraform工作目录。

    terraform init

    返回如下结果,表示初始化成功。

    Terraform has been successfully initialized!
  7. 在工作目录sls下,执行如下命令,创建日志服务Project。

    terraform apply

    返回如下信息,表示成功创建Project。

    alicloud_log_project.project_example: Creating...
    alicloud_log_project.project_example: Creation complete after 2s [id=terraform-example]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

步骤三:创建Logstore

  1. terraform.tf文件中,新增如下内容。

    resource "alicloud_log_store" "logstore_example" {
      project_name = alicloud_log_project.project_example.project_name
      logstore_name = "logstore_example"
      retention_period = 3
    }

    其中alicloud_log_store为资源类型,相关参数说明如下,完整参数说明,请参见Terraform-Alicloud Log Store

    参数

    是否必填

    说明

    logstore_example

    Resource名称。

    project_name

    LogStore所属的Project名,此处例子引用的是alicloud_log_project类型资源下的project_example Resource的project_name属性值。

    logstore_name

    LogStore的名称。

    retention_period

    数据保留时间(以天为单位),默认30天。

  2. 在您所创建的工作目录sls下,执行如下命令,创建Logstore

    terraform apply

    返回如下结果,表示初始化成功。

    alicloud_log_project.project_example: Creating...
    alicloud_log_project.project_example: Creation complete after 2s [id=terraform-example]
    alicloud_log_store.logstore_example: Creating...
    alicloud_log_store.logstore_example: Creation complete after 1s [id=terraform-example:logstore_example]
    
    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

步骤四:创建Logtail采集配置

  1. terraform.tf文件中,新增如下内容。

    resource "alicloud_logtail_config" "config_test" {
      project     = alicloud_log_store.logstore_example.project_name
      logstore    = alicloud_log_store.logstore_example.logstore_name
      name        = "config-sample"
      input_type  = "file"
      output_type = "LogService"
      input_detail = jsonencode(
      	{
    		"logPath": "/logPath",
    		"filePattern": "access.log",
    		"logType": "json_log",
    		"topicFormat": "default",
    		"discardUnmatch": false,
    		"enableRawLog": true,
    		"fileEncoding": "gbk",
    		"maxDepth": 10
    	}
      )
    }

    其中alicloud_logtail_config为资源类型,相关参数说明如下,完整参数说明,请参见Terraform-Alicloud Logtail Config

    参数

    是否必填

    说明

    config_test

    Resource名称。

    project

    config所属的Project名称。

    logstore

    config所属的Logstore名称。

    name

    Logtail配置的名称,在其所属Project内必须唯一。创建Logtail配置成功后,无法修改其名称。

    命名规则如下:

    • 只能包括小写字母、数字、短划线(-)和下划线(_)。

    • 必须以小写字母或数字开头和结尾。

    • 长度必须在2~128个字符之间。

    input_type

    日志输入的方式。可选值如下:

    • plugin:通过Logtail插件采集日志。

    • file:通过固定模式(正则模式、分隔符模式等)采集文本文件中的日志。

    output_type

    日志输出的方式,只支持LogService,即只支持将数据上传到日志服务。

    input_detail

    日志输入的相关配置。更多信息,请参见Logtail配置

  2. 在您所创建的工作目录sls下,执行如下命令,创建Logtail配置。

    terraform apply

    返回如下结果,表示创建成功。

    alicloud_logtail_config.config_test: Creating...
    alicloud_logtail_config.config_test: Creation complete after 0s [id=terraform-example-yangfei:logstore_example:config-sample]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

步骤五:创建机器组

  1. terraform.tf文件中,新增如下内容。

    resource "alicloud_log_machine_group" "machine_group_example" {
      project     = alicloud_log_store.logstore_example.project_name
      name          = "terraform-example"
      identify_type = "ip"
      topic         = "terraform"
      identify_list = ["10.0.0.1", "10.0.0.2"]
    }

    其中alicloud_log_machine_group为资源类型,相关参数说明如下,完整参数说明,请参见Terraform-Alicloud Log Machine Group

    参数

    是否必填

    说明

    machine_group_example

    Resource名称。自定义配置。

    project

    机器组所属的project名

    name

    机器组名称,Project下唯一

    identify_type

    机器标识类型,分为IP和userdefined两种,默认为IP

    topic

    机器组Topic,默认为空。

    identify_list

    具体的机器标识,可以是IP或userdefined-id。

  2. 在您所创建的工作目录sls下,执行如下命令,创建机器组。

    terraform apply

    返回如下结果,表示初始化成功。

    alicloud_log_machine_group.machine_group_example: Creating...
    alicloud_log_machine_group.machine_group_example: Creation complete after 0s [id=terraform-example:terraform-example]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

步骤六:应用Logtail采集配置到机器组

  1. terraform.tf文件中,添加如下内容。

    resource "alicloud_logtail_attachment" "example" {
      project     = alicloud_log_store.logstore_example.project_name
      logtail_config_name = alicloud_logtail_config.config_test.name
      machine_group_name  = alicloud_log_machine_group.machine_group_example.name
    }

    其中alicloud_logtail_attachment为资源类型,相关参数说明如下,完整参数说明,请参见Terraform-Alicloud Logtail Attachment

    参数

    是否必填

    说明

    example

    Resource名称。自定义配置。

    project

    project名

    logtail_config_name

    Logtail配置名

    machine_group_name

    机器组名

  2. 在您所创建的工作目录sls下,执行如下命令,将Logtail配置应用到机器组。

    terraform apply

    返回如下结果,表示初始化成功。

    alicloud_logtail_attachment.example: Creating...
    alicloud_logtail_attachment.example: Creation complete after 0s [id=terraform-example:config-sample:terraform-example]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

完整配置模板

Terraform模板

resource "alicloud_log_project" "project_example" {
  project_name = "terraform-example"
  description = "terraform-example"
}

resource "alicloud_log_store" "logstore_example" {
  project_name = alicloud_log_project.project_example.project_name
  logstore_name = "logstore_example"
  retention_period = 3
}

resource "alicloud_logtail_config" "config_test" {
  project     = alicloud_log_store.logstore_example.project_name
  logstore    = alicloud_log_store.logstore_example.logstore_name
  name        = "config-sample"
  input_type  = "file"
  output_type = "LogService"
  input_detail = jsonencode(
  	{
		"logPath": "/logPath",
		"filePattern": "access.log",
		"logType": "json_log",
		"topicFormat": "default",
		"discardUnmatch": false,
		"enableRawLog": true,
		"fileEncoding": "gbk",
		"maxDepth": 10
	}
  )
}
resource "alicloud_log_machine_group" "machine_group_example" {
  project     = alicloud_log_store.logstore_example.project_name
  name          = "terraform-example"
  identify_type = "ip"
  topic         = "terraform"
  identify_list = ["10.0.0.1", "10.0.0.2"]
}

resource "alicloud_logtail_attachment" "example" {
  project     = alicloud_log_store.logstore_example.project_name
  logtail_config_name = alicloud_logtail_config.config_test.name
  machine_group_name  = alicloud_log_machine_group.machine_group_example.name
}

配置效果

创建的Project、Logstore和Logtail采集配置

image

Logtail采集配置

image

机器组配置

image

相关操作

更新Terraform目录

terraform init --upgrade

导入已有配置

如果您在SLS已创建Project、Logstore等资源,您可以在本地配置好terraform.tf文件后使用terraform import命令导入。

terraform import alicloud_log_project.project_example terraform-example
terraform import alicloud_log_store.logstore_example terraform-example:logstore_example
terraform import alicloud_logtail_config.config_test terraform-example:logstore_example:config-sample
terraform import alicloud_log_machine_group.machine_group_example terraform-example:terraform-example
terraform import alicloud_logtail_attachment.example terraform-example:config-sample:terraform-example

执行完毕后,您可以查看terraform工作目录下的terraform.tfstate文件内容。terraform.tfstate文件内容即为导入的采集配置。

重要

如果需要将导入的采集配置迁移到terraform.tf文件中,需要手动拷贝,并对格式做适当调整,满足terraform.tf文件的格式要求。

如果您已经在当前的terraform工作目录执行过terraform apply或者terraform import命令,则此时再次执行terraform import命令会失败。您需要删除当前目录下的terraform.tfstate文件后再重新执行terraform import命令。

查看当前配置。

terraform show

查看当前terraform.tf文件与已生效的采集配置的差异。

terraform plan

常见问题

为什么出现预期外的Diff情况?

如果在执行terraform planterraform apply时,出现预期外的diff情况,例如:discardUnmatch在未修改的情况下也出现了diff情况。

请您升级registry.terraform.io/hashicorp/alicloud到1.219.0及以上版本,该问题会在您升级到最新版本且成功terraform apply一次该配置后解决。

相关文档