iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

欠的總是該來還,雖然工作很忙但是講講幹話發洩一下情緒還是必要的,附上一張前幾天拍的閃電圖,衝個版面混一下

https://ithelp.ithome.com.tw/upload/images/20230914/201514833Rx17gLMR9.jpg

What is Terraform resource?

Terraform resource 顧名思義就是要建立一些資源,對於AWS 而言,這些資源就是大家看到的Service,但實際上不只這些,包含一些 AWS console 上面的 configuration 也是要建立 resource。

比較不同的是 Terraform module , Module 的部分就是會把很多 resource 再組合成一套,所以就可以省去一些自己建立的時間,但是可能就會開出來一些不知道的功能 或 不知道怎麼開的功能兒 module 上面沒有

另外resource 的部分一開始在 terraform init 的時候就會先把對應的 provider 先把相關的 package download,所以這邊可能要注意版本,如果版本不同的話,裡面的 parameter 可能也會跟著改變

How to using it to build AWS service

一樣就是在 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 的基本應用

k8s Components (.yaml) in Terraform 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
  ]
}

Reference


上一篇
{Day 9: Introduction Terraform of IaC}
下一篇
{Day 11: Terraform variable tips- part 1}
系列文
Don't be a Machine Learning Engineer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言