[Terraform] Terraform入門(5) - 利用Terraform來建置多個workspace

鼠年全馬鐵人挑戰 - WEEK 10

前言

不知不覺Terraform這系列的隨手筆記寫到第五篇,本文記錄如何透過撰寫Terraform腳本來開啟S3、DynamoDB,綁定IAM User,並建置在不同workspace下。

Hands on Lab

初始化專案

1
2
3
4
5
# Configure the AWS Provider
provider "aws" {
region = "us-east-2"
version = "~> 2.55"
}

執行下方指令做初始化

1
terraform init

建立S3 bucket、DynamoDB

再來就是建立S3 bucket、DynamoDB,會分別定義S3 bucket、DynamoDB兩個resource,S3會設定生命週期為永久保存,並透過versioning設定來紀錄多個版本號,若未來開發時,專案改壞了還可以退回前一個版本!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Configure the AWS Provider
provider "aws" {
region = "us-east-2"
version = "~> 2.55"
}

# S3 Bucket
resource "aws_s3_bucket" "backend_state" {
bucket = "dev-application-backend-state01" # 自訂 bucket 名稱
# 設定S3的生命週期
lifecycle { # 永久保存
prevent_destroy = true
}
# 儲存多個版本號,若之後開發上遇到問題,可退回舊的版本
versioning{
enabled = true
}
server_side_encryption_configuration{
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
}

# Locking - DynamoDB
resource "aws_dynamodb_table" "dynamodb_demo" {
name = "dev_application_dynamodb01"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S" # 以字串的方式儲存
}
}

完成上述程式碼後執行下指令完成建立

1
terraform apply

查看兩者是否成功新增

S3

DynamoDB

配置IAM User

接著我們要將前面建立的S3、DynamoDB賦予某個User,為了方便管理,另外新建一個名為users的資料夾,目錄結構如下:

接著建立main.tf,並寫入下方程式碼,執行terraform init初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
terraform {
backend "s3"{
bucket = "dev-application-backend-state01"
key = "backendState-proj-dev"
region = "us-east-2"
dynamodb_table = "dev_application_dynamodb01"
encrypt = true
}
}
# Configure the AWS Provider
provider "aws" {
region = "us-east-2"
version = "~> 2.55"
}

# AWS IAM User
resource "aws_iam_user" "my_iam_user" {
name = "my_iam_user_demo" # 被賦予的User名稱
}

執行terraform apply後查看新建立的User

查看S3設定,會發現剛才給予加密的種類-AES

修改S3存放檔案的路徑

上面的範例程式碼成功執行後,檔案會放在S3的根目錄底下,實務上可能會有很多專案存放,這時要個別歸類在不同的專案目錄下,所以我們將原始key(作爲檔案存放路徑)改為dev/user/backendState-proj-dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
terraform {
backend "s3"{
bucket = "dev-application-backend-state01"
# key = "backendState-proj-dev"
key = "dev/user/backendState-proj-dev" # 可自訂檔案路徑
region = "us-east-2"
dynamodb_table = "dev_application_dynamodb01"
encrypt = true
}
}
# Configure the AWS Provider
provider "aws" {
region = "us-east-2"
version = "~> 2.55"
}

# AWS IAM User
resource "aws_iam_user" "my_iam_user" {
name = "my_iam_user_demo"
}

修改前要記得先執行terraform init進行初始化


系統會提示是否將狀態複製到新的狀態。
初始化完成後重新刷新頁面,會看到原本backendState-proj-dev的檔案路徑變成在dev/user/這個路徑下。

建置多個workspace

查看當前的workspace

1
terraform workspace show

尚未建立其他workspace的情況下,workspace名稱為default

建立新workspace

語法如下,workspace為自定的名稱

1
terraform workspace new workspace

範例以prod-dev作為新的workspace名稱

1
terraform workspace new prod-dev


建立完新的workspace後要進行初始化

1
terraform init

回到AWS S3 console介面會發現新增env:資料夾,裡面存放剛才建立的workspace

查看env:資料夾

不過這邊要注意一個地方,點開剛才建立workspace裡的檔案


會發現物件是空的!

怎麼回事???

因為我們把IAM User寫死了,造成與前一個workspace使用同一組IAM User name,因此將aws_iam_user這個resource修改為動態的IAM User,以當前的workspace name作為前綴

1
2
3
4
resource "aws_iam_user" "my_iam_user" {
# name = "my_iam_user_demo"
name = "${terraform.workspace}_my_iam_user_demo"
}

接著執行terraform plan觀察變化

prod-dev變為前綴名稱,接著執行terraform apply
回到workspace裡的檔案:

這一次物件裡面就不是空的~~~之後不管在其他workspace建立的IAM User也不會衝突!

切換至特定的workspace

如果要切回原本的workspace,語法如下方,workspace可替換成目前存在的workspace名稱

1
terraform workspace select workspace

以切換回default為例:

1
terraform workspace select default

查看所有的workspace

1
terraform workspace list


*之處表當前所處的workspace

除了使用指令查看當前所處的workspace之外,也可以到專案資料夾下的.terraform目錄裡面有一個名為environment的檔案,裡面會顯示當前workspace名稱。

最終的檔案目錄結構如下:

Comments