使用EC2(亚马逊Linux 2)来构建Terraform执行环境

我在能够创建任何环境的EC2上,尝试使用terraform进行环境建设和操作测试。

环境建设

创建用于Terraform的IAM用户
我们将创建一个用于Terraform的IAM用户。请参考以下网址以创建IAM用户。
由于这是一个实践教程,因此我们将创建一个具有管理员权限的用户。
请注意,SecretAccessKey不会重新生成,如果您丢失了它,请重新创建您的账户。

创建IAM用户(控制台)

安装AWS CLI

安装AWS CLI并进行配置。
* 因为想要通过pip3升级awscli,所以将安装相关的模块。

yum -y install python3         # パイソン3のインストール
yum -y install python-pip      # pipのインストール
pip3 install boto3             # boto3のインストール
pip3 install awscli --upgrade  # pip3でawscliのアップグレード
yum install git-all            # gitインストール

完成安装后,进行AWS CLI的设置,并确认AWS CLI能够运行。

aws --version
aws configure
aws s3api list-buckets  # S3 のバケット一覧を表示するコマンド

通过使用tfenv安装Terraform。

由于Terraform的更新频繁,建议使用tfenv来方便地改变版本。

git clone https://github.com/tfutils/tfenv.git ~/.tfenv        # gitによるtfenvインストール
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

tfenv --version         # インストールされてるかの確認
tfenv list-remote       # インストール可能なバージョンをリモートから取得して列挙します。

tfenv install 0.12.5    # 0.12.5 をインストール

tfenv use 0.12.5        # 0.12.5を使用する
tfenv list            # インストール済み
terraform --version   # バージョン一覧

先来测试terraform的功能,试试用terraform来创建一个s3存储桶吧!

1. 创建可执行文件

创建名为terra-test的文件夹,并进入该文件夹。使用vi在main.tf文件中进行编辑。

terraform {
  required_version = ">= 0.12.5"
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "kaku-example-terraform-state"
  versioning {
    enabled = true
  }
}
terraform init
terraform plan
terraform apply
aws s3api list-buckets | grep バケット名
[root@ip-172-31-40-118 terra-test]# terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

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_s3_bucket.terraform_state will be created
  + resource "aws_s3_bucket" "terraform_state" {
      + acceleration_status         = (known after apply)
      + acl                         = "private"
      + arn                         = (known after apply)
      + bucket                      = "kaku-example-terraform-state"
      + bucket_domain_name          = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + versioning {
          + enabled    = true
          + mfa_delete = false
        }
    }

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

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
-----------------------
[root@ip-172-31-40-118 terra-test]# terraform apply

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_s3_bucket.terraform_state will be created
  + resource "aws_s3_bucket" "terraform_state" {
      + acceleration_status         = (known after apply)
      + acl                         = "private"
      + arn                         = (known after apply)
      + bucket                      = "kaku-example-terraform-state"
      + bucket_domain_name          = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + versioning {
          + enabled    = true
          + mfa_delete = false
        }
    }

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

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

  Enter a value: yes

aws_s3_bucket.terraform_state: Creating...
aws_s3_bucket.terraform_state: Creation complete after 2s [id=kaku-example-terraform-state]

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

输入一个值:と来たら
如果不输入yes,则不会生效。
通过grep来确认创建是否成功。
aws s3api list-buckets | grep バケット名

请在创建的S3存储桶中进行设置,以管理tfstate文件。

terraform {
  required_version = ">= 0.12.5"
  backend "s3" {
    bucket = "kaku-example-terraform-state" # 作成したS3バケット
    region = "ap-northeast-1"
    key = "terraform.tfstate"
    encrypt = true
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "kaku-example-terraform-state"
  versioning {
    enabled = true
  }
}

在插入这个后端的描述之后,通过运行terraform init命令,可以将terraform.tfstate文件复制到S3存储桶中。

删除创建的S3存储桶

销毁 Terraform



使用命令行参数进行指定

运行命令时,可以使用-var选项来指定值。
试着运行terraform plan -var ‘foo=test-bucket’,就能正确注入值。

使用环境变量进行指定

如果给TF_VAR_的前缀设置环境变量,那么该值将加载到变量中。
当运行TF_VAR_foo=’env-test’ terraform plan时,将得到相同的结果。

使用配置文件进行指定

可以创建一个设置文件来指定变量的值,并且可以通过-var-file选项来实现相同的功能。

vars.tfvars = vars.tfvars的中文句子重述

foo = "tfvars-file"

执行 terraform plan -var-file=vars.tfvars 会得到相同的结果。

变量策略/设计

由于Terraform会读取所有的 *.tf 文件,因此可以将变量定义放在 variables.tf 等文件中,并在运行时使用 -var-file 指定值文件来切换环境等。

    • terrafrom plan -var-file=dev.tfvars

 

    terrafrom plan -var-file=prod.tfvars

我认为,如果按照这种方式设置目录和文件的话,可以更好地把握氛围。

主要.tf

provider "aws" { region = "ap-northeast-1" }
resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.foo}"
  acl = "private"
}

变量.tf

variable "foo" {}

dev.tfvars -> 开发环境变量文件

Note: Chinese translations may vary depending on the context.

foo="dev-var"

prod.tfvars的中文翻译

foo="prod-var"

其他提示

如果设置为“default”,即使未指定文件,也会有默认的文件。
此外,可以通过”type”等指定变量的类型。
在”desription”中,可以添加变量的说明,因此最好写清楚。

variable "foo" {
  type = "string"
  default = "default-var"
  description = "Sample Variable"
}
bannerAds