EP04 - 开始使用 Terraform 配置 aws 基础设施

Terraform

Terraform 是什麽

Terraform 是由 HashiCorp 建立的开放原始码「基础架构即程序码」工具。

宣告式编码工具 Terraform 可让开发人员使用名为 HCL(HasHiCorp 配置语言)的高阶配置语言,来进行基础架构的配置,无论是支援主流的云端供应商(AWS、GCP、Azure),或是从事网域注册管理的 GoDaddy,到企业导入的主机自助服务 Nutanix,皆有支援,因为支援度广泛,算是近年来 IT 进行配置的一大利器。

为何选择「基础架构即程序码 (IaC)」

选择写程序码来配置基础架构,主要解决传统上的三大痛点

  1. 文件维护不易
    传统配置基础架构几乎都是透过原厂提供的 Client 工具
    随着工具及硬体升级
    往往介面操作不太一样
    造成文件无法对齐现有操作

  2. 版本控管
    以管理域名为例
    添加 A Record 及 CName Record 都是简单操作就完成
    但透过介面的操作
    无法回朔前一个操作
    使用 IaC 配置基础架构
    程序码进入版控以後
    很容易可以查找过去修改历程

  3. 学习多套工具
    IT 单位从虚拟机械到网域管理
    如果每个导入的系统都要学习
    则需要熟悉多套工具或熟悉多套软件的 GUI 操作
    使用支援广泛的 IaC 工具
    则可以使用一套工具
    应用於其他地方

语法学习

复习昨天配置

昨天我们已经配置好 aws config
也对於 terraform 引入基本的配置和宣告

provider "aws" {
    region                  = "ap-northeast-1"
    shared_credentials_file = "~/.aws/credentials"
    profile                 = "default"
}

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

档案结构

Terraform 的执行只会执行当前位置底下的 .tf 档
标准档案配置为 main.tf、outputs.tf、variables.tf
其中 main.tf 为主要的基础设施配置
outputs.tf 为结果输出
variables.tf 则为常数宣告

如果有自己撰写的模组
则在模组中的 outputs.tf 需要将创建的资源输出
才能在引用模组的地方取得创建出来的资源
(详细概念,等到未来实际操作会再解释)

语法理解

  1. 新增资源

如果有学过强型别语言的人
可以用这个方式来理解这两个语法
aws_instance gitlab = ....

resource "aws_instance" "gitlab" {
}

aws_instance 为变数型态
gitlab 为变数名称

  1. 查询

data 开头的为查询功能
无论是查询我们布建的支援
还是查询其他的可用资源都是用这语法
而大括号内的 {} 则是写查询条件

data "aws_ami" "ubuntu" {

}
  1. 使用模组

在配置基础设施时
可能会使用官方提供现成的模组
或是自己撰写的模组
撰写完後要使用时则需要这样撰写

用 python 来理解 module
像是下列的写法
引用後宣告变数名称为 foo 的模组

from ../modules/ import ithome

foo = ithome(name="bar")
module "foo" {
    source = "../modules/ithome"
    name   = "bar"
}
  1. 变数宣告
    variable 在 terraform 里面
    通常是搭配模组使用

ithome 模组中
main.tf

resource "aws_instance" "foo" {
    name = var.ec2_name
}

variables.tf

variable "ec2_name" {
    description = ""
    default     = "foo-name"
}

使用模组时
我们有宣告 name 为 bar
因此创建出来的资源名称就会是 bar 而不会带入预设值 "foo-name"

module "foo" {
    source = "../modules/ithome"
    name   = "bar"
}

也有一种是抽变数当常数使用
但区域变数或常数通常会用 .tfvars 或 locals
因此 variable 还是比较会用在模组中

程序码风格

命名规则

程序码的命名上比较推崇使用底线 _
而 aws 上有使用到的名称则建议用 -
以供区别

对齐等号

配置 terraform 程序码中
会习惯将等号对齐
以方便确认配置的资源规格

其他注意事项

.tfstate 为执行配置时
记录目前资源使用状态的文件
如果遗失则需要将资源重新 import 近来才有办法管理
里面含有资讯很多
甚至含有创建的 public key和 private key
因此不建议进 Git 版控
但是多人协作时仍会需要 tfstate
不然无法进行配置或修改
此时会用 terraform cloud 或是 aws s3 来存放 tfstate
这部分的使用也会在日後说明

第一个配置

Visual Studio Code 安装延伸模组

昨天只有新增完档案
但是需要安装延伸模组
才能够识别这 terraform 档案
并对语法上色
模组选择上我们使用官方的 HashiCorp Terraform
https://ithelp.ithome.com.tw/upload/images/20210916/20141518aPppmmbcRV.png

检视安装结果
打开昨天写好的 main.tf
如果有自动上色
表示延伸模组有正常运作
https://ithelp.ithome.com.tw/upload/images/20210916/20141518Of1T7QJt2s.png

安装 EC2

没错,今天我们要做的第一件事情
就是我们要安装一台 EC2 并安装 gitlab 版控
有使用过 aws cloud console 的小夥伴们一定不陌生
除了需要选择 AMI
还需要配置硬碟、配置 Security Group

查询 default vpc

main.tf

data "aws_vpc" "default" {
    id = var.default_vpc_id
}

variables.tf

variable "default_vpc_id" {
    description = "the default vpc id when inital the aws"
    default = "vpc-0c580897ac763ea51"
}

查询 subnet_id

main.tf

data "aws_subnet_ids" "subnet_ids" {
    vpc_id = data.aws_vpc.default.id
}

创建 security group

main.tf

resource "aws_security_group" "gitlab" {
    name        = "gitlab-server"
    description = "It used for gitlab server."
    vpc_id      = data.aws_vpc.default.id
    tags        = { Name = "Gitlab-Server" }
    revoke_rules_on_delete = null
}

创建 security group 路由规则

resource "aws_security_group_rule" "gitlab_igress_22" {
    type              = "ingress"
    from_port         = 22
    to_port           = 22
    cidr_blocks       = ["0.0.0.0/0",]
    protocol          = "tcp"
    security_group_id = aws_security_group.gitlab.id
}

resource "aws_security_group_rule" "gitlab_egress_22" {
    type              = "egress"
    from_port         = 22
    to_port           = 22
    cidr_blocks       = ["0.0.0.0/0",]
    protocol          = "tcp"
    security_group_id = aws_security_group.gitlab.id
}

建立 连线时使用的 key

main.tf

resource "tls_private_key" "gitlab" {
    algorithm = "RSA"
    rsa_bits  = 4096
}

resource "aws_key_pair" "gitlab" {
    key_name = "gitlab"
    public_key = tls_private_key.gitlab.public_key_openssh
}

上方为在 aws上建立成对金钥
而下方的指令则将 key输出成一个实体的档案
format 则是 terraform 中的一个函式
可以用来组合字串使用

main.tf

resource "local_file" "gitlab" {
    content  = tls_private_key.gitlab.private_key_pem
    filename = format("%s.pem", aws_key_pair.gitlab.key_name)
}

选择 AMI

此处为选择一个 ubuntu 20.04 的作业系统

data "aws_ami" "ubuntu" {
    most_recent = true
    
    filter {
        name   = "name"
        values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
    }
    
    filter {
        name   = "virtualization-type"
        values = ["hvm"]
    }
    
    owners = ["099720109477"] # Canonical
}

建立 EC2

根据网路上查找的许多建议
实际上也在安装过程中采过雷
建议使用四核心以上的 EC2
也就是至少使用 t3.xlarge 的规格
不然可能在安装 gitlab 的过程中卡住

因为 aws 上 t 系列的机械
会计算 CPU 使用量
如果使用超规会耗费 CPU Credit
一但 CPU Credit 消耗完
则机械会无法使用
需等待一段时累积 CPU Credit

main.tf

resource "aws_instance" "gitlab" {
    ami                     = data.aws_ami.ubuntu.id
    instance_type           = "t3.xlarge"
    subnet_id               = sort(data.aws_subnet_ids.subnet_ids.ids)[0]
    key_name                = aws_key_pair.gitlab.key_name
    vpc_security_group_ids  = [ "value" ]
    disable_api_termination = false
    ebs_optimized           = true
    hibernation             = false
    
    tags = {
        Name  = "Gitlab Server"
        Usage = "For SCM"
        Creator = "Terraform"
    }

    root_block_device {
        delete_on_termination = true
        encrypted             = false
        throughput            = 0
        volume_size           = 30
        volume_type           = "gp2"
        tags                  = {
            Name     = "Gitlab Server"
            Attached = "Gitlab Server"
        }
    }
}

执行配置

回到 vagrant ssh 进到虚拟机械中
并到切换路径到专案目录
输入指令以执行配置

terraform apply

配置完成後
我们就可以登入 aws cloud console 介面来查看配置的结果
https://ithelp.ithome.com.tw/upload/images/20210916/201415189BlTRQyif4.png
参考:

  1. Terraform 根据 IBM Cloud Education
  2. 低配置服务器安装GitLab
  3. GitLab搭建以及配置(一)

<<:  [Day1][笔记] 主题规划

>>:  [Day1] 参赛动机及参赛目标

Day28:Update the Data and the Featured View

前言 今天要来更新 JSON data, 并且构建 the Featured view。 实作 更新...

Day03-Nginx 简介

安装 Nginx $ sudo apt-get update $ sudo apt-get inst...

中台的技术系统(Technology System)

中台作为一种生态系统层级的架构,倚赖业界主流的技术系统,包含开源技术平台与框架: 业务中台:微服务─...

成员 17 人:60%的人在 10分钟的谈话中,至少会撒 1次谎

成员到了 17 人,你必须依靠「回报」进行专案控管、公司治理; 这时你发现, 回报不实,不常发生; ...

[JS] You Don't Know JavaScript [this & Object Prototypes] - Object [番外 - getter/setter]

前言 我们在Object [下]中有提到 getter / setter,由於这个部分在书中的解释是...