Terraform是一个令人难以置信的强大的基础设施即代码工具,但是当开始向基础设施添加复杂性时,可能会发现它偶尔需要帮助。让我们来看看目前在terrform管理的部署中使用的一些最流行的工具。
原生工具
Terraform Console
Terraform控制台可能是工具集中最容易被忽视的工具之一。这是令人惊讶的,因为它是原生的Terraform和打包在二进制文件中! terraform控制台命令提供了一个交互式控制台,可用于测试和计算可能希望在代码中使用的任何terraform表达式。Terraform Console允许在运行代码之前测试复杂的表达式,而不是无休止地进行实验, 让我们快速看一个例子:
$ terraform console
Terraform console version 0.15.1
> 10 + 20
30
> "hello, world"
"hello, world"
> length("hello, world")
12
> substr("hello, world", 0, 5)
"hello"
> exit
正如在上面看到的,在将表达式添加到代码之前对它们进行试验是很有用的。还可以对变量求值,并在需要的状态下操作任何其他东西。 需要注意的一点是,在terraform控制台命令工作之前,配置必须能够传递一个计划,因此请确保在进入控制台进行故障排除之前注释掉试图解决的任何问题。
IDE工具
Visual Studio Code
我不会再列举更多了。VS Code已经完全超越了开发世界中的其他ide。当然有一些很棒的ide,但是VS Code中的集成和插件是无与伦比的。 VS Code有两个非常流行的Terraform扩展:
一个是官方的HashiCorp Terraform扩展。它有更多的安装,但也有一些相当不确定的评论。每当我使用它时,它似乎都很稳定,但我通常默认使用Anton Kulikov的Terraform扩展。它一直很坚固,工作得很好。的组织可能对应该安装哪些扩展有一些策略,因此如果允许,应该使用它们。
Linting工具
TFLint
Tflint是一个非常方便的Terraform框架,它允许根据预先编写的规则集或自己的自定义规则来检查Terraform代码。这些规则是通过“插件”添加的。 一些最常见的问题,可能想要发现使用TFLint,从Github引用,是:
- 查找主要云提供商(包括AWS、GCP和Azure)可能出现的错误,例如无效的实例类型。
- 警告已弃用的语法和未使用的声明。
- 执行最佳实践和命名约定。
# example.tf
provider "aws" {
version = "2.70.0"
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
$ tflint
example.tf
on main.tf line 4:
4: version = "2.70.0"
| ^ Error: AWS provider version should be specified in the required format: X.Y.Z (e.g. 2.1.0)
Summary:
Count: 1
Invalid: 1
Warnings: 0
Errors: 1
安全工具
Open Policy Agent
Open Policy Agent并不是一个特定的Terraform框架或工具,但它可以直接与Terraform一起使用。OPA,通常被称为OPA,是用Rego语言编写的,它的灵感来自于旧的Datalog语言。在分析Terraform代码时,它也被一些工具用作策略语言。 诸如Terrascan、Spacelift、Terraform Cloud等工具都支持它,并在不同程度上使用它。例如,Spacelift将其用于体验的各个方面。从用户登录Spacelift到他们发射堆栈的那一刻,OPA政策就在那里,确保一切按计划进行。 下面是一个阻止Terraform部署AWS IAM访问密钥的策略示例:
package spacelift
# Note that the message here is dynamic and captures resource address to provide
# appropriate context to anyone affected by this policy. For the sake of your
# sanity and that of your colleagues, please a
#
# You can read more about plan policies here:
# https://docs.spacelift.io/concepts/policy/terraform-plan-policy
deny[sprintf(message, [resource.address])] {
message := "Static AWS credentials are evil (%s)"
resource := input.terraform.resource_changes[_]
resource.change.actions[_] == "create"
# This is what decides whether the rule captures a resource.
# There may be an arbitrary number of conditions, and they all must
# succeed for the rule to take effect.
resource.type == "aws_iam_access_key"
}
# Learn more about sampling policy evaluations here:
# https://docs.spacelift.io/concepts/policy#sampling-policy-inputs
sample = true
Terrascan
尽管“Terrascan”这个名字让人认为它是特定于terrraform的,但它实际上适用于许多IaC提供商。Terrascan支持Terraform、Kubernetes、Ansible、Cloudformation等,这要归功于它的大量预先编写的策略。当然,也可以为自定义用例编写自己的策略。 Terrascan集成了several CI/CD工具,在设计管道时非常灵活。
$ terrascan scan -t aws
results:
violations:
- rule_name: scanOnPushDisabled
description: Unscanned images may contain vulnerabilities
rule_id: AWS.ECR.DataSecurity.High.0578
severity: MEDIUM
category: Data Security
resource_name: scanOnPushDisabled
resource_type: aws_ecr_repository
file: ecr.tf
line: 1
count:
low: 0
medium: 1
high: 0
total: 1
Checkov
Checkov与Terrascan非常相似,但它使用 [Python policy-as-code](www.checkov.io/3.Custom Policies/Python Custom Policies.html)框架,而不是OPA中的Rego语法。由于Python是当今最流行的编程语言之一,许多工程师可能会发现这更容易接近。 尽管Python对许多人来说更容易接近,但语法仍然有点啰嗦,并且可能变得有点复杂,如下面的官方文档所示:
from lark import Token
from checkov.terraform.checks.resource.base_resource_check import BaseResourceCheck
from checkov.common.models.enums import CheckResult, CheckCategories
class S3PCIPrivateACL(BaseResourceCheck):
def __init__(self):
name = "Ensure PCI Scope buckets has private ACL (enable public ACL for non-pci buckets)"
id = "CKV_AWS_999"
supported_resources = ['aws_s3_bucket']
# CheckCategories are defined in models/enums.py
categories = [CheckCategories.BACKUP_AND_RECOVERY]
guideline = "Follow the link to get more info https://docs.bridgecrew.io/docs"
super().__init__(name=name, id=id, categories=categories, supported_resources=supported_resources, guideline=guideline)
def scan_resource_conf(self, conf):
"""
Looks for ACL configuration at aws_s3_bucket and Tag values:
https://www.terraform.io/docs/providers/aws/r/s3_bucket.html
:param conf: aws_s3_bucket configuration
:return: <CheckResult>
"""
if 'tags' in conf.keys():
environment_tag = Token("IDENTIFIER", "Scope")
if environment_tag in conf['tags'][0].keys():
if conf['tags'][0][environment_tag] == "PCI":
if 'acl' in conf.keys():
acl_block = conf['acl']
if acl_block in [["public-read"], ["public-read-write"], ["website"]]:
return CheckResult.FAILED
return CheckResult.PASSED
check = S3PCIPrivateACL()
Tfsec
tfsec工具是另一个基于rego的策略工具,与Terrascan和Checkov非常相似。其中一个突出的特性是它的多种策略创建格式。可以使用JSON、YAML或Rego。Rego将是最灵活和最强大的,但JSON和YAML可以创建需要的大多数策略,并且具有更可读的格式。 下面是一个在YAML中检查文件的例子:
checks:
- code: CUS001
description: Custom check to ensure the CostCentre tag is applied to EC2 instances
impact: By not having CostCentre we can't keep track of billing
resolution: Add the CostCentre tag
requiredTypes:
- resource
requiredLabels:
- aws_instance
severity: ERROR
matchSpec:
name: tags
action: contains
value: CostCentre
errorMessage: The required CostCentre tag was missing
relatedLinks:
- http://internal.acmecorp.com/standards/aws/tagging.html
漂移检测工具
Driftctl
Driftctl允许执行IaC管理中最重要的一个方面,即检测偏离期望状态的资源。它能够查找已漂移的托管资源以及在driftctl之外创建的非托管资源。 下面是一个示例输出:
Found missing resources:
aws_s3_bucket:
- driftctl-bucket-test-2
Found resources not covered by IaC:
aws_s3_bucket:
- driftctl-bucket-test-3
Found changed resources:
- driftctl-bucket-test-1 (aws_s3_bucket):
~ Versioning.0.Enabled: false => true
Found 3 resource(s)
- 33% coverage
- 1 covered by IaC
- 1 not covered by IaC
- 1 missing on cloud provider
- 1/1 changed outside of IaC
成本工具
Infracost
Infracost可能是在生产部署中与Terraform一起使用的最流行的工具之一。它查询提供程序的定价API,并根据计划部署的内容显示成本。 它不仅显示了成本,而且还可以使用策略工具(如Open policy Agent)编写可以基于成本阻止部署的策略。CI/CD工具,比如Spacelift,可以很容易地将这样的工具添加到部署管道中,只需要很少的配置。这就是CFO的梦想!社区版本是完全免费的,但需要一些自定义工具来获得上面提到的策略等功能。如果选择付费版本,所有这些都包括在内。甚至有一个VS Code 扩展,使事情更加精简。 以下是截断输出的示例:
Project: my-terraform-project
Region: us-west-2
+ aws_ebs_volume.my_volume
Type: aws_ebs_volume
Quantity: 1
Monthly cost: $10.50
+ aws_instance.my_instance
Type: aws_instance
Quantity: 1
Monthly cost: $100.00
Total monthly cost: $110.50
Terraform HCL生成工具
Terraformer
Terraformer是一个非常酷的产品,它可以扫描的云环境并输出必要的Terraform代码来重新部署它。这绝对不是整理资源的首选途径,因为到目前为止,大多数初创公司应该在第一天就开始使用Terraform。不幸的是,许多公司在Terraform成为今天的伟大工具之前就开始了,所以像Terraformer这样的工具是将事物置于新管理之下的理想工具。 Terraformer在很多方面都很棒,但是要非常小心如何导入资源,并且要真正理解它所创建的基础设施以及如何构建它。这些类型的工具很少能创建完美的代码,最坏的情况下会创建一堆不可读的代码。我强烈建议阅读所有创建的代码,并执行彻底的审计,以确保一切都在一个可读和可扩展的结构。
Pike
Pike是一个有趣的工具,它将分析希望使用Terraform创建的资源,并生成完成部署所需的必要IAM权限。 这里有一个例子:
./pike scan -d .\terraform\
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"ec2:MonitorInstances",
"ec2:UnmonitorInstances",
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeVolumes",
"ec2:DescribeInstanceTypes",
"ec2:RunInstances",
"ec2:DescribeInstanceCreditSpecifications",
"ec2:StopInstances",
"ec2:StartInstances",
"ec2:ModifyInstanceAttribute",
"ec2:TerminateInstances",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:CreateSecurityGroup",
"ec2:DescribeSecurityGroups",
"ec2:DescribeAccountAttributes",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteSecurityGroup",
"ec2:RevokeSecurityGroupEgress"
],
"Resource": "*"
}
}
与任何与安全相关的工具一样,确保事后审计权限以确保合规性。
与任何与安全相关的工具一样,确保事后审计权限以确保合规性。
文档生成工具
Terraform Docs
在现实中,编写文档并不是每个开发人员梦寐以求的工作。幸运的是,有一个很好的工具可以从配置文件自动生成Terraform文档。Terraform-docs在创建显示用户需要了解的内容的文档时非常有用且易于使用。它公开了可以添加到模板文件中的变量,并且它将以易于阅读的格式自动为生成章节。 可以在这里找到一个使用此功能的存储库示例。 格式示例如下:
content: |-
Any arbitrary text can be placed anywhere in the content
{{ .Header }}
and even in between sections
{{ .Providers }}
and they don't even need to be in the default order
{{ .Outputs }}
include any relative files
{{ include "relative/path/to/file" }}
{{ .Inputs }}
# Examples
```hcl
{{ include "examples/foo/main.tf" }}
Resources
{{ range .Module.Resources }}
- {{ .GetMode }}.{{ .Spec }} ({{ .Position.Filename }}#{{ .Position.Line }}) {{- end }}
## 管理工具
### [TFSwitch](https://tfswitch.warrensbox.com/)
TFSwitch是一个简单的实用程序,可以帮助管理多个Terraform版本。可以在任何可用的Terraform版本之间切换。如果需要,该工具还将下载需要的版本。当使用多个Terraform代码库时,如果正在处理已弃用或比当前版本更新的代码,这对于避免恼人的语法错误和其他令人头疼的问题至关重要。
要使用TFSwitch,只需要按照下面的说明安装它,然后运行TFSwitch命令来显示所有可用的版本:
```shell
tfswitch
Creating directory for terraform binary at: /home/user/.terraform.versions
Use the arrow keys to navigate: ↓ ↑ → ←
? Select Terraform version:
▸ 1.3.9
1.3.8
1.3.7
1.3.6
↓ 1.3.5
一旦选择了需要的版本,就可以自由使用Terraform了!
Terramate
Terramate是一个有趣的工具,它可以通过将代码分解成“堆栈”来帮助您管理大型Terraform部署。这些堆栈具有独立的状态,允许您的代码以较小的爆炸半径部署。它还具有与git一起工作的特性,可以在更改时自动部署。Terramate真正的亮点在于它保持你的代码DRY(不要重复你自己)的能力。它能够在栈之间共享变量、提供程序配置和其他数据,并自动生成纯Terraform中所需的任何代码。 该工具的所有功能都相当复杂,因此最好阅读发布博客,让您深入了解。
Terragrunt
Terragrunt是一个非常流行的Terraform工具,像Terramate一样,帮助保持你的Terraform代码DRY,管理多个栈等等。它可以更轻松地使用多个云帐户、模块以及其他功能,从而大大提高代码的效率。Terraform的最新版本确实赶上了Terragrunt的许多功能,但绝对不是全部。 下面是一个示例配置文件。
# Indicate where to source the terraform module from.
# The URL used here is a shorthand for
# "tfr://registry.terraform.io/terraform-aws-modules/vpc/aws?version=3.5.0".
# Note the extra `/` after the protocol is required for the shorthand
# notation.
terraform {
source = "tfr:///terraform-aws-modules/vpc/aws?version=3.5.0"
}
# Indicate what region to deploy the resources into
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
provider "aws" {
region = "us-east-1"
}
EOF
}
# Indicate the input values to use for the variables of the module.
inputs = {
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b", "us-east-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}
正如你在注释中看到的那样,它可以很容易地为所有模块生成提供者块,并在需要的地方注入变量,而不必手动传递它们。这绝对是一个有趣的项目,如果你开始处理很多模块,值得一试。 查看我们的Terragrunt vs. Terraform对比了解更多信息。
CI/CD Tools
Atlantis
Atlantis是一个很棒的开源项目,用于实现Terraform的pull-request自动化。虽然这听起来有点小众,但确定您的GitOps工作流程实际上非常重要。当与多个开发人员打交道时,提交代码、创建拉取请求以及让平台检查拉取请求并部署代码对于保持部署速度至关重要。 在Atlantis中,您还可以集成本文中列出的其他工具,以进一步丰富您的管道,并添加功能和护栏,以确保可靠的部署。Atlantis对它的pull request工作流相当固执己见,但是如果工作流适合您的GitOps策略,那么如果您将Terraform用于您的IaC,它是一个很好的开源选择。
Terraform Cloud
Terraform Cloud是Hashicorp云平台(HCP)的一部分,与Atlantis一样,它管理由提交到VCS触发的Terraform部署。 Terraform Cloud具有出色的状态管理特性,并且可以使用本文介绍的大多数工具对部署管道进行定制。不幸的是,集成外部应用程序的能力目前需要付费计划。使用Hashicorp专有的Sentinel引擎或OPA也可以将Policy作为代码,但也需要付费计划。 Terraform Cloud在其提供的服务中管理您的变量、秘密、资源等。它还允许您在Terraform中编写脚本,因此一切都可以自动化。虽然它只支持Terraform,但它做得很好。免费版本对于小团队来说是不错的选择
Spacelift
Spacelift与Atlantis、Terraform Cloud以及其他“Terraform自动化和协作软件”(TACOS)共享许多功能,但从您登录的那一刻起,就会考虑开发人员、策略和简单性。您可以使用来自VCS提供商的SSO登录Spacelift,并立即开始工作。Spacelift支持Terraform、Cloudformation、Ansible、Pulumi和Kubernetes,这使它与列表中提到的其他CI/CD工具区别开来。 Spacelift在构建时考虑了策略,并允许编写OPA策略,可以管理平台的几乎所有方面。从登录、堆栈访问、规划、部署等等。您还可以集成本文其他部分中提到的任何工具,例如Infracost和Terrascan,以便在部署前检查代码(请参阅更多示例:将安全工具与Spacelift集成)。根据这些工具的发现编写策略也是一个非常棒的功能,它允许您管理IaC策略的各个方面。 Spacelift还通过直观的用户界面或在Terraform中编写脚本来管理状态、秘密、云凭证等。如果需要运行多个堆栈,可以使用堆栈依赖关系将它们链接在一起。如果您需要在新创建的资源上运行Ansible剧本,这将非常有用。 Spacelift为单个用户提供了慷慨的免费套餐,涵盖了大部分功能。与Terraform Cloud一样,您需要升级以获得更高级的功能,例如私人工人,堆栈调度和非常有用的漂移检测功能。
总结
这是一个快速运行的几个流行的Terraform工具,你会发现在今天的野外。每天都有新的工具出现,并且这些工具的流行程度也经常起起落落。幸运的是,这些工具中的大多数都以非常相似的方式工作,使得在它们之间移动非常容易。