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东西,你会发现在今天的野外。每天都有新的东西出现,而且这些东西的盛行程度也常常起起落落。幸运的是,这些东西中的大多数都以十分类似的方法作业,使得在它们之间移动十分简略。


