使用Terraform玩转SLS数据加工自动化部署

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文主要介绍Terraform的安装、阿里云Terraform Provider的安装以及如何使用Terraform管理SLS数据加工。

一、什么是Terraform

Terraform是一种开源工具,用于安全高效地预览,配置和管理云基础架构和资源。Terraform的命令行接口(CLI)提供一种简单机制,用于将配置文件部署到阿里云或其他任意支持的云上,并对其进行版本控制。


Terraform的主要优势如下:

  • 多云部署

Terraform适用于多云方案,将类似的基础结构部署到阿里云、其他云提供商或者本地数据中心。开发人员能够使用相同的工具和相似的配置文件同时管理不同云提供商的资源。

  • 自动化管理

Terraform能够创建配置文件的模板,以可重复、可预测的方式定义、预配和配置ECS资源,减少因人为因素导致的部署和管理错误。能够多次部署同一模板,创建相同的开发、测试和生产环境。

  • 基础架构即代码(Infrastructure as Code)

可以用代码来管理维护资源。允许保存基础设施状态,从而使您能够跟踪对系统(基础设施即代码)中不同组件所做的更改,并与其他人共享这些配置

  • 降低开发成本

通过按需创建开发和部署环境来降低成本。并且,您可以在系统更改之前进行评估。


二、安装Terraform

参考在本地安装和配置Terraform


三、安装阿里云Terraform Provider

阿里云作为国内第一家与 Terraform 集成的云厂商,terraform-provider-alicloud目前已经提供了超过 163 个 Resource 和 113 个 Data Source,覆盖计算,存储,网络,负载均衡,CDN,容器服务,中间件,访问控制,数据库等超过35款产品,已经满足了大量大客户的自动化上云需求。


在安装完Terraform之后,有两种方式去安装阿里云的Terraform Provider:在线安装和本地编译安装。

3.1 在线安装

每个Terraform的Provider都有一个全网标识符,该标识符由三部分组成,分别为hostname,namespace和type,即//。hostname是指分发、下载Provider的域名,默认为registry.terraform.io。namspaces是指提供、开发Provider的组织的命名空间,默认为hashicorp。type是指Provider的具体类型,例如阿里云的Provider的type为alicloud


基于每个Provider的全网标识符,Terraform会自动下载和安装对应的Provider到本地。以阿里云的Provider为例,在线安装的步骤如下:

  1. 创建一个terraform工作目录(文件夹),并在该目录下创建一个名为terraform.tf的文件。

该文件用于维护后续所有terraform相关的配置。


  1. 在terraform.tf文件中配置如下内容
terraform {
    required_providers {
         alicloud = {
          source = "hashicorp/alicloud"
          version = "1.164.0"
        }
    }
}


  1. 在terraform工作目录下执行terraform init命令

上述命令会默认去registry.terraform.iohashicorp命名空间里下载Provideralicloud1.164.0版本,并安装到本地。执行完毕后,如果提示Terraform has been successfully initialized!表示安装成功。


3.2 本地编译安装

本地编译安装的原理是用户自行下载阿里云Provider的源码,在本地编译后,将编译好的Provider放到指定目录下,以此方式完成安装。其主要步骤如下。

1. 下载阿里云Provider源码

源码地址:https://github.com/aliyun/terraform-provider-alicloud

在上述地址下载源码的ZIP包到本地并解压;或者执行下面的命令下载

git clone git@github.com:aliyun/terraform-provider-alicloud.git


2. 编译Provider

进入Provider源码目录(terraform-provider-alicloud/),执行编译命令

make build

编译完成后,进入编译生成的bin/目录,执行以下命令,解压生成的编译包。

tar -zxvf terraform-provider-alicloud_darwin-amd64.tgz

注:编译一共生成3个编译包:xxx_darwin-amd64.tgzxxx_linux-amd64.tgzxxx_windows-amd64.tgz,分别对应于Mac OS、Linux和Windows操作系统,根据自己的操作系统选择对应的编译包解压即可。


解压完成后,进入解压出的bin/目录下即可看到编译生成的二进制文件terraform-provider-alicloud


3. 创建本地Provider目录

选择一个本地的目录(如/Users/licheng/terraform_lib/),在该目录下创建如下目录层级

/Users/licheng/terraform_lib/providers/registry.terraform.io/hashicorp/alicloud/1.164.0/darwin_amd64

上述目录的层级结构如下

base directory(e.g. /Users/licheng/terraform_lib/providers/)
└── <hostname>(e.g. registry.terraform.io)
    └── <namespace>(e.g. hashicorp)
        └── <type>(e.g. alicloud)
            └── <version>(e.g. 1.164.0)
                └── <your OS>(e.g. darwin_amd64)

其中和需要依据自己安装的阿里云Provider版本以及当前操作系统做修改。


4. 拷贝编译好的Provider

将第2步中编译好的二进制文件拷贝到第3步创建的目录之中

cp terraform-provider-alicloud xxx/providers/registry.terraform.io/hashicorp/alicloud/1.164.0/darwin_amd64


5. 安装Provider

安装步骤如下:

1)创建一个terraform工作目录(文件夹),并在该目录下创建一个名为terraform.tf的文件。该文件用于维护后续所有terraform相关的配置。


2)在terraform.tf文件中配置如下内容

terraform {
    required_providers {
         alicloud = {
          source = "hashicorp/alicloud"
          version = "1.164.0"
        }
    }
    backend "local" {}
}


3)在$HOME目录下创建.terraformrc文件

touch ~/.terraformrc

配置.terraformrc文件内容如下

provider_installation {
     filesystem_mirror {
         path    = "/Users/licheng/terraform_lib/providers"
         include = ["registry.terraform.io/*/*"]
    }
}

其中path的值填写上述步骤3中创建的目录(到providers这一级即可)


4)在terraform的工作目录下执行terraform init命令

执行完毕后,如果提示Terraform has been successfully initialized!表示安装成功。


注:不同于在线安装的方式,上述命令不再会去线上下载,而是会默认去/Users/licheng/terraform_lib/providers.terraformrc中配置的path目录)下寻找Provideralicloud1.164.0版本,并进行安装。


四、使用Terraform管理SLS

4.1 创建Project

如果想要使用terraform创建一个SLS Project:

  1. terraform.tf文件中增加如下配置内容
provider "alicloud" {
    access_key = "xxxxxx"
    secret_key = "xxxxxx"
    region     = "cn-hangzhou"
}
resource "alicloud_log_project" "test-project-1" {
  name        = "test-project-1"
  description = "create by terraform"
}


  1. 在terraform工作目录下执行terraform apply命令

输入yes确认执行后,如果提示Apply complete! Resources: 1 added, 0 changed, 0 destroyed.表示Project创建成功


4.2 创建Logstore

如果想要在上一步创建出的Project内,创建2个Logstore:

  1. terraform.tf文件中增加如下配置内容
resource "alicloud_log_store" "test-logstore-1" {
  project               = alicloud_log_project.test-project-1.name
  name                  = "test-logstore-1"
  retention_period      = 365
  shard_count           = 2
  auto_split            = true
  max_split_shard_count = 64
  append_meta           = true
}
resource "alicloud_log_store" "test-logstore-2" {
  project               = alicloud_log_project.test-project-1.name
  name                  = "test-logstore-2"
  retention_period      = 180
  shard_count           = 4
  auto_split            = true
  max_split_shard_count = 64
  append_meta           = true
}


  1. 在terraform工作目录下执行terraform apply命令

输入yes确认执行后,如果提示Apply complete! Resources: 2 added, 0 changed, 0 destroyed.表示两个Logstore成功在4.1步骤中的Project下创建出来。


4.3 删除Project&Logstore

如果想要删除某个Project或者Logsotre,只需要把terraform.tf中对应的配置删除,然后重新执行terraform apply命令即可。例如,需要删除步骤4.2中创建出的test-logsotre-2:

  1. terraform.tf中删除resource "alicloud_log_store" "test-logstore-2的相关配置
  2. 执行terraform apply命令,如果提示Apply complete! Resources: 0 added, 0 changed, 1 destroyed.表示删除成功。


4.4 更多SLS资源的相关操作

参考阿里云Provider官方文档中Log Service (SLS)相关的部分


五、使用Terraform玩转SLS数据加工

5.1 创建数据加工任务

5.1.1 创建一个基本的数据加工任务

接着上述第4节中的操作,我们已经利用Terraform创建出了一个Projecttest-project-1,该Project包含两个Logstoretest-logstore-1test-logstore-2。现在我们想要在test-logstore-1上创建一个数据加工任务,把该Logstore的数据加工处理后,传输到test-logstore-2之中。


对于上述需求,我们继续在Terrform的配置文件terraform.tf中增加以下配置内容

resource "alicloud_log_etl" "test-etl-job-1" {
  etl_name          = "etl_name_1"
  display_name      = "测试数据加工任务"
  description       = "created by terraform"
  project           = alicloud_log_project.test-project-1.name
  logstore          = alicloud_log_store.test-logstore-1.name
  access_key_id     = "xxxxxx"
  access_key_secret = "xxxxxx"
  script            = "e_set('source', 'terraform')"
  etl_sinks {
    name              = "target_name1"
    project           = alicloud_log_project.test-project-licheng-1.name
    logstore          = alicloud_log_store.test-logstore-2.name
    endpoint          = "cn-hangzhou.log.aliyuncs.com"
    access_key_id     = "xxxxxx"
    access_key_secret = "xxxxxx"
  }
}

上述配置将以test-logstore-1作为源Logstore,test-logstore-2作为目标Logstore,创建一个加工逻辑为e_set('source', 'terraform')的加工任务。该加工任务默认的加工时间范围是所有时间

,即从源Logstore的第一条日志开始,持续进行日志加工。


5.1.2 设置不同的鉴权方式

上述5.1.1中设置了使用密钥对(AK/SK)的方式进行鉴权,如果不想要使用此方式,也可以使用RAM角色的鉴权方式(数据加工默认角色或者自定义角色)。以数据加工默认角色为例,在完成RAM角色的创建和授权后,只需要把上述配置中的access_key_idaccess_key_secret参数替换为role_arn即可。

resource "alicloud_log_etl" "test-etl-job-1" {
  ...
  role_arn          = "acs:ram::xxxxxx:role/aliyunlogetlrole"
  ...
  etl_sinks {
    name              = "target_name1"
    project           = alicloud_log_project.test-project-licheng-1.name
    logstore          = alicloud_log_store.test-logstore-2.name
    role_arn          = "acs:ram::xxxxxx:role/aliyunlogetlrole"
  }

除此之外,还可以使用KMS加密后的AK/SK密钥对来进行鉴权,来提高AK/SK的安全性,防止泄露。具体用法参考kms_encrypted_access_key


5.1.3 设置多个输出目标

如果想要为加工任务配置多个输出目标,在配置中添加多个etl_sinks字段即可

resource "alicloud_log_etl" "test-etl-job-1" {
  etl_name          = "etl_name_1"
  ...
  etl_sinks {
    name              = "target_name1"
    project           = alicloud_log_project.test-project-licheng-1.name
    logstore          = alicloud_log_store.test-logstore-2.name
    ...
  }
  etl_sinks {
    name              = "target_name2"
    project           = alicloud_log_project.test-project-licheng-1.name
    logstore          = alicloud_log_store.test-logstore-3.name
    ...
  }
}


5.1.4 设置加工时间范围

上述5.1.1中的基本配置中,没有配置加工的时间范围,因此默认加工所有时间的日志,即从源Logstore的第一条日志开始,持续进行日志加工。如果想要自定义加工时间范围,使用from_timeto_time两个参数即可

resource "alicloud_log_etl" "test-etl-job-1" {
  etl_name          = "etl_name_1"
  display_name      = "测试数据加工任务"
  ...
  from_time         = 1650630000
  to_time           = 1650630600
  script            = "e_set('source', 'terraform')"
  etl_sinks {
    name              = "target_name1"
    ...
  }
}

其中from_timeto_time两个参数的格式均为时间戳(整数类型),分别表示加工任务处理的起始时间和结束时间。这两个参数均为可选参数,如果from_time不填的话,默认值为0,表示从第一条日志开始加工;如果to_time不填的话,默认值为0,表示会持续加工新来的日志。


5.2 管理数据加工任务

5.2.1 停止数据加工任务

如果想要停止一个正在运行中的数据加工任务,只需在Terraform配置中增加一个字段status,并将值设置为STOPPED即可。修改加工任务的Terrform配置如下:

resource "alicloud_log_etl" "test-etl-job-1" {
  status            = "STOPPED"
  etl_name          = "etl_name_1"
  display_name      = "测试数据加工任务"
  ...
  etl_sinks {
    name              = "target_name1"
    ...
  }
}

然后执行terraform apply命令,如果提示Apply complete! Resources: 0 added, 1 changed, 0 destroyed.表示停止任务成功。


5.2.2 启动数据加工任务

如果想要重启一个已经停止的数据加工任务,只需要修改字段status的值为RUNNING即可

resource "alicloud_log_etl" "test-etl-job-1" {
  status            = "RUNNING"
  etl_name          = "etl_name_1"
  display_name      = "测试数据加工任务"
  ...
  etl_sinks {
    name              = "target_name1"
    ...
  }
}

修改配置文件后,执行terraform apply命令,如果提示Apply complete! Resources: 0 added, 1 changed, 0 destroyed.表示重启任务成功。


5.2.3 删除数据加工任务

如果想要删除数据加工任务,只需要把terraform.tf中对应的配置删除,然后重新执行terraform apply命令即可。例如,需要删除上述步骤中创建出的测试数据加工任务:

  1. terraform.tf中删除resource "alicloud_log_etl" "test-etl-job-1的相关配置
  2. 执行terraform apply命令,如果提示Apply complete! Resources: 0 added, 0 changed, 1 destroyed.表示删除成功。


5.3 导入数据加工任务

上述步骤中所有的资源都是由Terraform创建出来的,如果线上的加工任务不是由Terraform创建出来,我们也想要把这些任务同步到本地,用Terraform来统一管理,那么可以执行如下Terraform的导入命令,来同步本地和线上的状态。

terraform import alicloud_log_etl.test-etl-job-2 test-project-1:etl_name_2

上述命令表示把Projecttest-project-1下的数据加工任务etl_name_2导入到本地Terraform的状态中。

其中test-project-1:etl_name_2是一个数据加工任务的ID,由Project名称test-project-1和数据加工的JobNameetl_name_2拼接而成,用于标识一个加工任务。test-etl-job-2是导入成功后,该任务在Terraform中的实例ID。


执行完后,如果提示Import Successful!则表示导入成功,用户可以查看Terraform工作目录下的terraform.tfstate文件内容,了解Terraform在当前环境的资产状态。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
24天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
162 4
|
1天前
|
存储 人工智能 人机交互
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
PC Agent 是上海交通大学与 GAIR 实验室联合推出的智能 AI 系统,能够模拟人类认知过程,自动化执行复杂的数字任务,如组织研究材料、起草报告等,展现了卓越的数据效率和实际应用潜力。
30 1
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
|
1月前
|
数据采集
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
本文介绍了如何使用Puppeteer结合代理IP和用户伪装技术,轻松绕过大众点评的Captcha验证,实现商家信息的高效采集。通过配置Puppeteer、设置代理和用户伪装参数、模拟人类操作等步骤,成功提取了目标页面的数据。该方法不仅提高了爬虫的稳定性和隐蔽性,还为市场研究和商业分析提供了有力支持。注意,数据采集需遵守法律法规及网站政策。
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
152 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
1月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
2月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
49 2
|
3月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
254 3

相关产品

  • 日志服务
  • 推荐镜像

    更多