使用Terraform配置Logtail采集配置
Terraform是一種開源工具,用于安全高效地預(yù)覽、配置和管理云基礎(chǔ)架構(gòu)和資源。本文介紹如何使用Terraform調(diào)用接口創(chuàng)建Logtail采集配置。
前提條件
已安裝Terraform。
在Cloud Shell中使用Terraform:Cloud Shell默認(rèn)安裝配置了Terraform和阿里云賬號信息,無需任何額外配置。更多信息,請參見Cloud Shell。
在本地安裝和配置Terraform:操作步驟請參見在本地安裝和配置Terraform,在第4步中確保
registry.terraform.io/aliyun/alicloud
版本為1.219.0及以上。
配置步驟
在Cloud Shell中使用Terraform
步驟一:配置日志服務(wù)的中心化地域
# Region ID
export ALICLOUD_REGION="cn-shanghai"
使用Cloud Shell無需配置身份信息,建議使用RAM用戶登錄阿里云控制臺,降低密鑰泄露造成的安全風(fēng)險。
參數(shù) | 說明 |
ALICLOUD_REGION | 日志服務(wù)Project所在地域,更多信息,請參考開服地域。 |
步驟二:創(chuàng)建日志服務(wù)Project
執(zhí)行以下命令,創(chuàng)建一個Terraform工作目錄,名稱例如
sls
。mkdir sls
執(zhí)行以下命令,切換到剛創(chuàng)建的目錄下。
cd sls
在該目錄下創(chuàng)建一個文件,名稱例如
terraform.tf
。touch terraform.tf
在
terraform.tf
文件中,添加如下內(nèi)容。resource "alicloud_log_project" "project_example" { project_name = "terraform-example" description = "terraform-example" }
alicloud_log_project
為資源類型,相關(guān)參數(shù)說明如下。完整參數(shù)說明,請參見Terraform-Alicloud Log Project。參數(shù)
是否必填
說明
project_example
是
Resource名稱。
project_name
是
SLS日志服務(wù)project 名稱,需要保證唯一性。
description
否
project的描述。
按下鍵盤上的Esc鍵退出編輯模式,然后輸入
:wq
保存并退出文件。在工作目錄
sls
下,執(zhí)行如下命令,初始化Terraform工作目錄。terraform init
返回如下結(jié)果,表示初始化成功。
Terraform has been successfully initialized!
在工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建日志服務(wù)Project。terraform apply
返回如下信息,表示成功創(chuàng)建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.
步驟三:創(chuàng)建Logstore
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Log Store。參數(shù)
是否必填
說明
logstore_example
是
Resource名稱。
project_name
是
LogStore所屬的Project名,此處例子引用的是alicloud_log_project類型資源下的project_example Resource的project_name屬性值。
logstore_name
是
LogStore的名稱。
retention_period
否
數(shù)據(jù)保留時間(以天為單位),默認(rèn)30天。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建Logstore
。terraform apply
返回如下結(jié)果,表示初始化成功。
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.
步驟四:創(chuàng)建Logtail采集配置
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Logtail Config。參數(shù)
是否必填
說明
config_test
是
Resource名稱。
project
是
config所屬的Project名稱。
logstore
是
config所屬的Logstore名稱。
name
是
Logtail配置的名稱,在其所屬Project內(nèi)必須唯一。創(chuàng)建Logtail配置成功后,無法修改其名稱。
命名規(guī)則如下:
只能包括小寫字母、數(shù)字、短劃線(-)和下劃線(_)。
必須以小寫字母或數(shù)字開頭和結(jié)尾。
長度必須在2~128個字符之間。
input_type
是
日志輸入的方式。可選值如下:
plugin:通過Logtail插件采集日志。
file:通過固定模式(正則模式、分隔符模式等)采集文本文件中的日志。
output_type
是
日志輸出的方式,只支持LogService,即只支持將數(shù)據(jù)上傳到日志服務(wù)。
input_detail
是
日志輸入的相關(guān)配置。更多信息,請參見Logtail配置。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建Logtail配置。terraform apply
返回如下結(jié)果,表示創(chuàng)建成功。
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.
步驟五:創(chuàng)建機器組
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Log Machine Group。參數(shù)
是否必填
說明
machine_group_example
是
Resource名稱。自定義配置。
project
是
機器組所屬的project名
name
是
機器組名稱,Project下唯一
identify_type
否
機器組的標(biāo)識類型,分為IP和userdefined兩種,默認(rèn)為IP
topic
否
機器組Topic,默認(rèn)為空。
identify_list
是
具體的機器標(biāo)識,可以是IP或userdefined-id。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建機器組。terraform apply
返回如下結(jié)果,表示初始化成功。
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.
步驟六:應(yīng)用Logtail采集配置到機器組
在
terraform.tf
文件中,添加如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Logtail Attachment。參數(shù)
是否必填
說明
example
是
Resource名稱。自定義配置。
project
是
project名
logtail_config_name
是
Logtail配置名
machine_group_name
是
機器組名
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,將Logtail配置應(yīng)用到機器組。terraform apply
返回如下結(jié)果,表示初始化成功。
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
步驟一:配置AccessKey和日志服務(wù)的中心化地域
# alicloud AK
export ALICLOUD_ACCESS_KEY="AccessKey ID"
export ALICLOUD_SECRET_KEY="AccessKey Secret"
# Region ID
export ALICLOUD_REGION="cn-shanghai"
參數(shù) | 說明 |
ALICLOUD_ACCESS_KEY | 阿里云賬號的訪問密鑰AccessKey ID。更多信息,請參見訪問密鑰。 重要 建議使用RAM用戶的AccessKey ID和AccessKey Secret,降低密鑰泄露造成的安全風(fēng)險。 |
ALICLOUD_SECRET_KEY | 阿里云賬號的訪問密鑰AccessKey Secret。更多信息,請參見訪問密鑰。 |
ALICLOUD_REGION | 日志服務(wù)Project所在地域,更多信息,請參考開服地域。 |
步驟二:創(chuàng)建日志服務(wù)Project
執(zhí)行以下命令,創(chuàng)建一個Terraform工作目錄,名稱例如
sls
。mkdir sls
執(zhí)行以下命令,切換到剛創(chuàng)建的目錄下。
cd sls
在該目錄下創(chuàng)建一個文件,名稱例如
terraform.tf
。touch terraform.tf
在
terraform.tf
文件中,添加如下內(nèi)容。resource "alicloud_log_project" "project_example" { project_name = "terraform-example" description = "terraform-example" }
alicloud_log_project
為資源類型,相關(guān)參數(shù)說明如下。完整參數(shù)說明,請參見Terraform-Alicloud Log Project。參數(shù)
是否必填
說明
project_example
是
Resource名稱。
project_name
是
SLS日志服務(wù)project 名稱,需要保證唯一性。
description
否
project的描述。
按下鍵盤上的Esc鍵退出編輯模式,然后輸入
:wq
保存并退出文件。在工作目錄
sls
下,執(zhí)行如下命令,初始化Terraform工作目錄。terraform init
返回如下結(jié)果,表示初始化成功。
Terraform has been successfully initialized!
在工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建日志服務(wù)Project。terraform apply
返回如下信息,表示成功創(chuàng)建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.
步驟三:創(chuàng)建Logstore
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Log Store。參數(shù)
是否必填
說明
logstore_example
是
Resource名稱。
project_name
是
LogStore所屬的Project名,此處例子引用的是alicloud_log_project類型資源下的project_example Resource的project_name屬性值。
logstore_name
是
LogStore的名稱。
retention_period
否
數(shù)據(jù)保留時間(以天為單位),默認(rèn)30天。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建Logstore
。terraform apply
返回如下結(jié)果,表示初始化成功。
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.
步驟四:創(chuàng)建Logtail采集配置
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Logtail Config。參數(shù)
是否必填
說明
config_test
是
Resource名稱。
project
是
config所屬的Project名稱。
logstore
是
config所屬的Logstore名稱。
name
是
Logtail配置的名稱,在其所屬Project內(nèi)必須唯一。創(chuàng)建Logtail配置成功后,無法修改其名稱。
命名規(guī)則如下:
只能包括小寫字母、數(shù)字、短劃線(-)和下劃線(_)。
必須以小寫字母或數(shù)字開頭和結(jié)尾。
長度必須在2~128個字符之間。
input_type
是
日志輸入的方式。可選值如下:
plugin:通過Logtail插件采集日志。
file:通過固定模式(正則模式、分隔符模式等)采集文本文件中的日志。
output_type
是
日志輸出的方式,只支持LogService,即只支持將數(shù)據(jù)上傳到日志服務(wù)。
input_detail
是
日志輸入的相關(guān)配置。更多信息,請參見Logtail配置。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建Logtail配置。terraform apply
返回如下結(jié)果,表示創(chuàng)建成功。
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.
步驟五:創(chuàng)建機器組
在
terraform.tf
文件中,新增如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Log Machine Group。參數(shù)
是否必填
說明
machine_group_example
是
Resource名稱。自定義配置。
project
是
機器組所屬的project名
name
是
機器組名稱,Project下唯一
identify_type
否
機器組的標(biāo)識類型,分為IP和userdefined兩種,默認(rèn)為IP
topic
否
機器組Topic,默認(rèn)為空。
identify_list
是
具體的機器標(biāo)識,可以是IP或userdefined-id。
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,創(chuàng)建機器組。terraform apply
返回如下結(jié)果,表示初始化成功。
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.
步驟六:應(yīng)用Logtail采集配置到機器組
在
terraform.tf
文件中,添加如下內(nèi)容。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
為資源類型,相關(guān)參數(shù)說明如下,完整參數(shù)說明,請參見Terraform-Alicloud Logtail Attachment。參數(shù)
是否必填
說明
example
是
Resource名稱。自定義配置。
project
是
project名
logtail_config_name
是
Logtail配置名
machine_group_name
是
機器組名
在您所創(chuàng)建的工作目錄
sls
下,執(zhí)行如下命令,將Logtail配置應(yīng)用到機器組。terraform apply
返回如下結(jié)果,表示初始化成功。
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.
在資源編排服務(wù)ROS中使用Terraform
Terraform是一個開源的自動化資源編排工具。資源編排服務(wù)ROS(Resource Orchestration Service)為Terraform提供了托管的能力,您可以創(chuàng)建Terraform類型的模板和資源棧,編排阿里云、AWS或Azure的資源。Terraform功能兼容ROS API,您只需創(chuàng)建Terraform類型模板,即可調(diào)用ROS API實現(xiàn)相應(yīng)功能。
登錄資源編排控制臺。
在左側(cè)導(dǎo)航欄,選擇模板>我的模板,單擊創(chuàng)建模板。
創(chuàng)建Terraform模板:單擊Terraform模板,輸入以下模板內(nèi)容,然后單擊頁面底部的保存模板。模板的參數(shù)說明,請參見另一個頁簽在本地使用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 }
使用Terraform創(chuàng)建資源棧。
在下拉列表選擇已創(chuàng)建的模板,按照配置向?qū)нM行操作。
完整配置模板
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
}
配置效果
創(chuàng)建的Project、Logstore和Logtail采集配置
Logtail采集配置
機器組配置
相關(guān)操作
更新Terraform目錄
terraform init --upgrade
導(dǎo)入已有配置
如果您在SLS已創(chuàng)建Project、Logstore等資源,您可以在本地配置好terraform.tf文件后使用terraform import命令導(dǎo)入。
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
執(zhí)行完畢后,您可以查看terraform工作目錄下的terraform.tfstate
文件內(nèi)容。terraform.tfstate
文件內(nèi)容即為導(dǎo)入的采集配置。
如果需要將導(dǎo)入的采集配置遷移到terraform.tf
文件中,需要手動拷貝,并對格式做適當(dāng)調(diào)整,滿足terraform.tf
文件的格式要求。
如果您已經(jīng)在當(dāng)前的terraform工作目錄執(zhí)行過terraform apply或者terraform import命令,則此時再次執(zhí)行terraform import命令會失敗。您需要刪除當(dāng)前目錄下的terraform.tfstate文件后再重新執(zhí)行terraform import命令。
查看當(dāng)前配置。
terraform show
查看當(dāng)前terraform.tf文件與已生效的采集配置的差異。
terraform plan
常見問題
為什么出現(xiàn)預(yù)期外的Diff情況?
如果在執(zhí)行terraform plan
或terraform apply
時,出現(xiàn)預(yù)期外的diff情況,例如:discardUnmatch在未修改的情況下也出現(xiàn)了diff情況。
請您升級registry.terraform.io/hashicorp/alicloud到1.219.0及以上版本,該問題會在您升級到最新版本且成功terraform apply一次該配置后解決。