欠的總是該來還,雖然工作很忙但是講講幹話發洩一下情緒還是必要的,附上一張前幾天拍的閃電圖,衝個版面混一下
Terraform resource 顧名思義就是要建立一些資源,對於AWS 而言,這些資源就是大家看到的Service,但實際上不只這些,包含一些 AWS console 上面的 configuration 也是要建立 resource。
比較不同的是 Terraform module , Module 的部分就是會把很多 resource 再組合成一套,所以就可以省去一些自己建立的時間,但是可能就會開出來一些不知道的功能 或 不知道怎麼開的功能兒 module 上面沒有
另外resource 的部分一開始在 terraform init
的時候就會先把對應的 provider 先把相關的 package download,所以這邊可能要注意版本,如果版本不同的話,裡面的 parameter 可能也會跟著改變
一樣就是在 main.tf 或者 resource.tf 的部分上面貼上即可,但是要確認都是在同一層目錄下面,然後就很簡單的先宣告這個是 resource
例如權限,這邊就是建立一個 AWS IAM Policy,接下來就用下方的程式碼來解説
# 這邊就是建立一個 IAM USER ,名稱為 "test-user"
resource "aws_iam_user" "user" {
name = "test-user"
}
# data 就是現在已經存在的項目,然後抓的物件,可能是一些物件的參數使用
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
# 這邊就是建立一個 IAM role 稱之為 test-role,
# 同時使用前面 aws_iam_policy_document 物件的json來使用丟給該role作為 policy
resource "aws_iam_role" "role" {
name = "test-role"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
# 建立一個 iam_group
resource "aws_iam_group" "group" {
name = "test-group"
}
# data 就是現在已經存在的項目 後面的 policy 是變數名稱
data "aws_iam_policy_document" "policy" {
statement {
effect = "Allow"
actions = ["ec2:Describe*"]
resources = ["*"]
}
}
# 建立一個項目 iam policy
# 並且一樣把剛剛抓到的aws_iam_policy_document
# 然後該物件的json 格式丟到 policy 裡面的 policy
resource "aws_iam_policy" "policy" {
name = "test-policy"
description = "A test policy"
policy = data.aws_iam_policy_document.policy.json
}
# 最後把 policy attachment 到 user 跟 role 上面
resource "aws_iam_policy_attachment" "test-attach" {
name = "test-attachment"
users = [aws_iam_user.user.name]
roles = [aws_iam_role.role.name]
groups = [aws_iam_group.group.name]
policy_arn = aws_iam_policy.policy.arn
}
以上是 resource 的基本應用
resource 的用法除了上述的建立 service 之外,對於後面 service 上的 k8s 部署也是很重要,因為有些 yaml 檔案就可以直接寫在 terraform 裡面,就不用另外在後面apply 上去,例如比較固定的component
下面就是一個 component 是 karpenter 裡面的 provisioner ,通常使用這種方式的目的就是裡面的 content 不太會變動
resource "kubectl_manifest" "karpenter_provisioner" {
yaml_body = <<-YAML
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: default
spec:
requirements:
- key: "karpenter.k8s.aws/instance-category"
operator: In
values: ["c", "m"]
- key: "karpenter.k8s.aws/instance-cpu"
operator: In
values: ["8", "16", "32"]
- key: "karpenter.k8s.aws/instance-hypervisor"
operator: In
values: ["nitro"]
- key: "topology.kubernetes.io/zone"
operator: In
values: ${jsonencode(local.azs)}
- key: "kubernetes.io/arch"
operator: In
values: ["arm64", "amd64"]
- key: "karpenter.sh/capacity-type" # If not included, the webhook for the AWS cloud provider will default to on-demand
operator: In
values: ["spot", "on-demand"]
kubeletConfiguration:
containerRuntime: containerd
maxPods: 110
limits:
resources:
cpu: 1000
consolidation:
enabled: true
providerRef:
name: default
ttlSecondsUntilExpired: 604800 # 7 Days = 7 * 24 * 60 * 60 Seconds
YAML
# 到這邊結束 yaml content
# depends_on 就是先部署 module.eks_blueprints_addons 才會部署這個 resource
depends_on = [
module.eks_blueprints_addons
]
}