Terraform实战~基础篇~

首先

在SRE团队中使用Terraform时,我们需要周围的理解支持才行。
作为这篇文章的背景,我们希望通过增加内部的理解者,以便顺利引入工具。
因此,我写这篇文章的目的是为了举办内部Terraform共享会议,专为不属于内部基础架构专家,但是属于内部服务器端工程师之类的人而设。

目录

    • Infrastructure as Codeとは何か

 

    • Terraformの説明

 

    Terraformハンズオン

“什么是基础设施即代码?”

根据由O’Reilly Japan出版的《基础设施即代码》一书的引用,IaC可以被定义为以下内容。

基础设施即代码(Infrastructure as Code)是将软件开发的实践应用于基础设施自动化的方法。

为什么要进行基础设施即代码呢?因为我们期望能够获得以下效果。

● 不是以IT基础设施成为变化的障碍或约束,而是支持和实现变化。
● 系统更改不是用户或IT人员的压力和重大事件,而是日常工作。
● IT人员利用他们的能力为有价值的工作使用时间,而不是进行日常重复的任务。
● 用户不是依赖于IT人员,而是能够自己定义、提供和管理所需资源。
● 不是基于能够完全预防失败的前提,而是能够在发生失败时简单且快速地进行恢复。
● 不是通过昂贵而冒险的“大爆炸”项目,而是通过持续改进和改良来实现。
● 不是通过会议和文件讨论解决方案,而是通过实施、测试和测量来证明解决方案的效果。

我们将把软件开发中使用的版本管理、自动化测试库和部署编排等技术应用到基础设施管理中,以实现具体的操作。

Terraform 的解釋

基础设施即代码工具分类

根据“Infrastructure as Code”介绍的工具分类,Terraform属于以下4个工具之中的一个:基础设施定义工具。

    • ダイナミックインフラストラクチャプラットフォーム(AWS、GCP、Azure等)

 

    • インフラストラクチャ定義ツール(Terraform、CloudFormation等)

 

    • サーバー構成ツール(Ansible、Chef、Puppet等)

 

    インフラストラクチャサービス(Datadog、NewRelic、CircleCI等)

Terraform是一种工具/技术

image.png
    • HashiCorpが作成したオープンソースの構成管理ツール。

 

    • 例えばクラウドベンダー(AWS、GCP、Azure)のクラウドリソースのインフラ構成を宣言的に定義できるところが特徴。構成手順を書くのではなく、構成定義を書くという形になる。(Ansibleとの違い)

Providersには、物理マシン、VM、ネットワークスイッチ、コンテナ、監視ツール、データベース等の色々な選択肢がある。
ファイルはHashiCorp Configuration Language (HCL) で記述される。

Terraform的机制

Terraform会检查tfstate文件和HCL之间的差异,并将变更应用于必要的部分。
tfstate文件在首次使用Terraform进行应用后创建,并记录当前状态。

推荐查看岩本隆久先生的资料,通过图表能更容易理解。

Terraform 在使用上的好处

    • HCLで宣言的にリソース定義ができ、リソース作成順序を自動的に判断してくれるため、リソース変更作業者のケアレスミスを回避できる。

 

    • クラウドベンダーを選ばずTerraformでソースコード管理することができる。

 

    繰り返し行われるインフラ構築作業トイルを巻き取ってくれる可能性がある。

Terraform之劣势

    • HCLの記法や各構築対象サービスのお作法を学ぶ必要がある。

 

    • ツール自体開発が活発に行われている最中であるため、新しい記法やお作法の情報を追従することが必要になる。

 

    破壊的変更を伴う作業ができてしまうので対策が必要になる。

为了安全地使用Terraform

使用Terraform可以通过生命周期来定义阻止删除的规则。

lifecycle{
  prevent_destroy=true
}

只要在不想被删除的资源上设置了相关配置,就无法进行删除。
但是,即使设置了这个配置,也并不意味着是绝对安全的,如果删除了资源的定义本身,再进行apply操作,就会导致资源被删除。
在执行apply操作时,执行者的检查也变得非常重要。

Terraform实践工作坊

AWS的设置

创建AWS的IAM用户

image.png

亚马逊命令行接口 (AWS CLI)

我将使用pip3安装AWS CLI。安装完成后,我会尝试确认其版本。

$ pip3 install awscli --upgrade

# 確認
$ aws --version

将认证凭据设为环境变量。

从AWS管理控制台复制Access Key ID和Secret Access Key并导出。

$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX/XXXXXXXXXX/XXXXXXXXXX
$ export AWS_DEFAULT_REGION=ap-northeast-1

Terraform的配置设置

然后,迎来了Terraform的安装,为了考虑以后的版本管理,这里会介绍使用tfenv进行安装。

安装tfenv

tfenv是Terraform的版本管理器。在需要升级或降级版本的情况下,非常有效,推荐在此处进行安装。

# Macの場合
$ brew install tfenv
# 確認
$ tfenv --version
tfenv 1.0.1

# それ以外の場合
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
# 確認
$ tfenv --version
tfenv 1.0.1

在README中还提供了使用符号链接进行PATH设置的方法,因此可以根据个人喜好选择使用。

tfenv的使用方法

tfenv list-remote 可以被翻译为 “列出远程的 tfenv 版本”。

获取可安装版本的列表。

$ tfenv list-remote
0.12.12
0.12.11
0.12.10
0.12.9
...

安装tfenv

安装目标版本。

$ tfenv install 0.12.12

列出可用的Terraform版本列表。

确认已安装的版本。

$ tfenv list
* 0.12.12 (set by /usr/local/Cellar/tfenv/1.0.1/version)
  0.12.5

使用tfenv

如果要切換多個版本,請使用”use”。

$ tfenv use 0.12.5

尝试创建AWS EC2。

创建工作目录

为Terraform操作准备一个目录。

$ mkdir terraform_test
$ cd terraform_test
$ vim main.tf

在 main.tf 文件中,写入以下内容。

resource "aws_instance" "test" {
  ami           = "ami-04b9e92b5572fa0d1"
  instance_type = "t3.micro"
}

执行 terraform 初始化

编写完代码后,在包含main.tf文件的目录中运行terraform init命令,以下载二进制文件。

$ terraform init
Initializing the backend...
Terraform has been successfully initialized!

执行 “terraform plan” 命令,输出执行计划,以确认会有哪些更改被执行。

$ terraform plan
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.test will be created
  + resource "aws_instance" "test" {
      + ami                          = "ami-04b9e92b5572fa0d1"
      + arn                          = (known after apply)
      + associate_public_ip_address  = (known after apply)
      + availability_zone            = (known after apply)
      + cpu_core_count               = (known after apply)
      + cpu_threads_per_core         = (known after apply)
      + get_password_data            = false
      + host_id                      = (known after apply)
      + id                           = (known after apply)
      + instance_state               = (known after apply)
      + instance_type                = "t3.micro"
   ......}

Plan: 1 to add, 0 to change, 0 to destroy.

重要的是出现一个加号标记,这意味着要创建一个新资源。

执行terraform应用

让terraform apply命令执行实际上在计划中的更改。

$ terraform apply
......
Do you want to perform these actions? 
 Terraform will perform the actions described above.
 Only 'yes' will be accepted to approve.

 Enter a value:

如果在这里输入“是”,将会执行。

aws_instance.test: Creating...
aws_instance.test: Still creating... [10s elapsed]
aws_instance.test: Creation complete after 18s [id=i-095131324a66cb153]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

在AWS管理控制台上确认EC2实例已创建。

尝试更新AWS EC2的信息

如果EC2创建成功,尝试进行更改。
将刚刚创建的main.tf按照以下方式修改。

resource "aws_instance" "test" {
  ami           = "ami-04b9e92b5572fa0d1"
  instance_type = "t3.micro"

  tags = {
    Name = "test"
  }
}

修改代码后,执行terraform apply。

当从+标记改变为~标记时,将显示”aws_instance.test将就地更新”。这意味着要更改现有资源的配置。

在AWS管理控制台中,也可以确认添加了Name标签。

尝试重新创建AWS EC2。

为安装Nginx,按照以下方式修改main.tf并进行apply。

resource "aws_instance" "test" {
  ami           = "ami-04b9e92b5572fa0d1"
  instance_type = "t3.micro"

  user_data = <<EOF
    #!/bin/bash
    apt-get install nginx
    systemctl start nginx.service
EOF
}

今度は,aws_instance.testには-/+マークがついており,それはリソースの置き換えが必要であることを示しています。つまり,既存のリソースを削除して新しいリソースを作成する必要があります。

因为这项工作涉及删除资源,所以需要确认是否真的可以执行。

删除AWS EC2

可以使用terraform destroy命令删除创建的资源。

将显示一个带有 “aws_instance.test将被销毁” 信息的标记。这意味着要删除现有的资源。

请审阅

如果你想更详细地了解Terraform,我建议你购买这本书,因为本次只是简要介绍了一些内容。
野村 友規. 实践Terraform 在AWS系统设计和最佳实践中。

Kief Morris在2017年3月的《基础设施即代码》(宫下刚辅监译,长尾高弘译)一书中提到:“1.2 基础设施即代码是什么”(引自O’Reilly Japan)。
Kief Morris在2017年3月的《基础设施即代码》(宫下刚辅监译,长尾高弘译)一书中提到:“1.2.1 基础设施即代码的目标”(引自O’Reilly Japan)。
Kief Morris在2017年3月的《基础设施即代码》(宫下刚辅监译,长尾高弘译)一书中提到:“1.8 关于后续章节”(引自O’Reilly Japan)。
广告
将在 10 秒后关闭
bannerAds