当前位置:首页 > 云原生安全 > 正文内容

Terraform快速入门到入土

UzJu2年前 (2022-04-17)云原生安全930

Terraform快速入门到入土

本文按照官方教程来进行学习,为了方便快速上手,不去看官方的机翻,所以对于文中的所有定义,都会进行解释,通俗易懂

Terraform安装

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"  

sudo apt-get update && sudo apt-get install terraform

ae11bc0cd83ce102bda1500f80f6018c.png

快速体验Nginx配置

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

快速使用docker创建Nginx

初始化项目,允许terraform下载与docker进行交互的插件

terraform init

3697597ab718ed810d1c9924cbf29fa3.png

如果出现下载失败的情况,需要使用科学上网

terraform apply

此时会输出一些需要我们确认的信息,如果没有问题,输入yes即可
a0a61b7eada45c9d59a3d73775db1bcb.png

d917588c7f50429ec536ac016a146a7d.png

我们访问8000端口即可看到Nginx页面
43d69d484bc09cf919ffaf60a1166067.png

如果想要删除这个Nginx容器,那么需要使用以下命令即可

terraform destroy

ff0c1368eb30a0c98ee64487a586e696.png

确认无误后,输入yes即可
752ecf55028747f0285b9ff64b05c05e.png

不过这里值得注意的是,可以看到使用docker ps -a 并没有找到我们停止的容器,所以这里是将这个容器删除了,因为我们正常停止一个容器的时候,使用docker stop,但是在docker ps -a中,我们可以看到已经停止的容器,可以使用docker start 重新将它启动,但是这里是直接将这个容器删除

Aws构建基础

下载Aws cli

Linux x86

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

Linux Arm

curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

MacOs

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

Windows

https://awscli.amazonaws.com/AWSCLIV2.msi

505a6322a03a544be48bb036b733f990.png

配置aws configure

aws configure

2ed6bd67d2f70864a75f3d85876d8006.png

创建EC2实例

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "us-west-2"
}

resource "aws_instance" "app_server" {
  ami           = "ami-830c94e3"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}

分别解释以上定义的含义

1、terraform{} 定义了,想用哪家平台的提供程序,说白了就是比如我要用docker,那在source就写docker,想用aws就写Aws,而中间的source为什么是hashicorp/aws呢,因为这里写的是提供的源,从那里提供的,它的全称是:registry.terraform.io/hashicorp/aws

2、然后在required_version中定义了,上面我使用的这个源的版本,required_version这个参数不是强制需要,如果为空,那么将默认下载最新的版本

3、provider “aws”{} 用于定义指定用哪个厂商或者平台,这里使用的aws,profile=default指向了使用AWS使用本地~/.aws/credentials中的密钥配置来操作AWS,region为在哪个地区创建EC2

4、resource中的定义,主要是用来指定我们要用什么东西,例如这里用了EC2,并指定了AMI,也就是使用的服务器镜像ID,instance_type指定了Aws EC2的实例类型,targs中定义的name,就是我们创建的EC2名称
e5911ba02e58feb7b9da3b6988be9254.png

terraform init

初始化时会自动下载与AWS交互所需要的插件等(注意需要使用科学上网)
8be591d68c32e03135cf1ce316f404c5.png

terraform fmt

为了保证编写的tf文件可读性强,使用该命令之后会自动更新文件中的格式和一致性

terrform validate

使用该命令可以检测当前.tf配置文件中的语法是否有效
a91c5fcb1c204452c69bf5a7d77499b3.png

terraform apply

创建EC2实例
2ebdd90eb21bd39b88a2b22e305e8c33.png

terraform show

可以查看我们创建的EC2状态等信息
43523f88d81550f8b8518ce3b571b668.png

可以看到在俄勒冈州创建了一个EC2
cb2ecd171d7bd1c54bea38686d3d41f2.png

更新EC2实例

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "us-west-2" 
}

resource "aws_instance" "app_server" {
  - ami = "ami-830c94e3" # 更改为 ami = "ami-08d70e59c07c61a3a"
  + ami = "ami-08d70e59c07c61a3a"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}

aa743cf5d005d68873b15a2f29d6fc3a.png

在创建好EC2之后,是无法更改镜像的,现在更换镜像,就相当于重装了

terraform apply

3fcdf549eb9dfcc2127b819d0b4976e7.png

c3a476edf256bc527db7e99dd2b4de88.png

fa42be58740347e395a1819c9beb27df.png

删除基础设施

terraform destroy

8e8215143dfacce98d80331c82a50fdb.png

可以看到全部都变成了null,输入yes即可
13fe5e34ee9d084545476fbdb4b574c6.png

回到AWS控制台可以看到,EC2已经被停止
96962b6232c51ac77d7c9c4b7b16b334.png

变量的调用

官方的机翻有一些生硬,不过理解下来就是,能在不同的文件中进行调用

比如在此之前,我们所有的操作都是通过一个main.tf进行启动的,那么中间有一些比如说名称,可以引用别的文件,也就相当于变量的引用

如下图

这里定义了实例名称,简介,类型,还有名称
7fd7ee3b2cd4699ab03a014a96f3717d.png

variable "instance_name" {
  description = "Value of the Name tag for the EC2 instance"
  type        = string
  default     = "ExampleAppServerInstance"
}

然后放在跟main.tf同一个目录中,然后再main.tf就可以调用这个变量,原理是,terraform会自动在同一个目录中找后缀为.tf的文件
6749371dc627651ade7a5820b9393b39.png

在tags中可以把name改成var.instance_name,也就是我们在variable.tf中定义的变量名称

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.27"
    }
  }

  required_version = ">= 0.14.9"
}

provider "aws" {
  profile = "default"
  region  = "us-west-2" 
}

resource "aws_instance" "app_server" {
  ami = "ami-08d70e59c07c61a3a"
  instance_type = "t2.micro"

  tags = {
    Name = var.instance_name
  }
}

然后输入terraform apply即可
b6297f8936a1660cda5c444182818f2b.png

6d891035c08086fac7e8bec4efceeda3.png

输入yes后等待即可
2b28f4652f7621fdbfb704fde6f0bfd9.png

6d04397340c166c35bf768067f2047ec.png

那么下次还想更改这个名称,可以通过命令行加上-var即可指定

terrform apply -var "instance_name=YetAnotherName"

004ecabbd441f2787b954345459f5017.png

可以看到更改的过程,输入yes即可
e761359cac4fcbba25b701a36350866c.png

8f72fde79fb4805288edbbb7e18859fa.png

输出EC2中配置

output "instance_id" {
  description = "ID of the EC2 instance"
  value       = aws_instance.app_server.id
}

output "instance_public_ip" {
  description = "Public IP address of the EC2 instance"
  value       = aws_instance.app_server.public_ip
}

可以通过定义output,来输出当前实例的ID和IP地址
c51b2689ee844a30ae6c425872d2afaf.png

f72ad58cf461b8da91c8e3c5d340c85e.png

输入yes等待即可
5f49eb0215080722bfd9a509ef9ad4c6.png

随后使用以下命令即可查看实例的ID和IP

terraform output

18861c08b2fb54b3a5f85d8b27b8aaa2.png

个人理解

对于这款工具的实现原理,个人理解是,通过调用不同的云厂商提供的SDK,来进行调用,这就跟自己用aws boto3这个库来进行调用aws服务一样。

在Github中搜索terraform可以看到一个官方提供的aws插件
5eae2f4e4c1d0295a38e0d1ef0b30b83.png

27a1ca3e26f800fdbed0cb85f681e743.png

在names.go中可以看到这里import了很多aws的sdk,那么就跟之前想的差不多了,相当于在实现原理上调用了SDK

扫描二维码推送至手机访问。

版权声明:本文由UzJu的安全屋发布,如需转载请注明出处。

SQL ERROR: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

本文链接:https://uzzju.com/post/44.java

分享给朋友:

相关文章

阿里云OSS对象存储攻防

阿里云OSS对象存储攻防

1、Bucket权限配置错误-公开访问在创建Bucket桶时,默认是private的权限,如果在错误的配置下,给了listobject权限,就会导致可遍历存储桶 在此时如果选择公有读的话,会出现两种情况 1、在只配置读写权限设置为公...

火线安全沙龙云安全专场-浅析云存储的攻击利用方式

火线安全沙龙云安全专场-浅析云存储的攻击利用方式

浅析云存储的攻击利用方式高鹏,火线云安全实验室成员,今天分享的主题是《浅析云存储的攻击利用方式》 本次的议题,关于云存储的一个攻击利用方式,在SRC漏洞挖掘,或在火线安全平台的众测项目中,我们也会收到很多关于对象存储的一个劫持和权...

六大云元数据地址速查

AWShttp://169.254.169.254/latest/meta-data/ Google Cloudhttp://metadata/computeMetadata/v1/ Azurehttp://169.254.169.25...

记录一下弹性计算云服务的一些词汇概念

记录一下弹性计算云服务的一些词汇概念

记录一下弹性计算云服务的一些词汇概念1、VPC(Virtaul Private Cloud)首先说一下自己的理解,VPC相当于一个局域网,相较于传统的网络,局域网下面有路由,子网等,在VPC中一样存在这些,所以我觉得这些交换机,路由,ACL...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。