Terraformをローカル環境で勉強できるようにする

画像は無関係です。びっくりドンキーです。

この記事は、whywaita Advent Calendar 2022の4日目の投稿です。
昨日3日目はhogextendさんのz-indexバトル観戦でした。

初めての方、はじめまして。
なはれぽ(@nahareport)と申します。
今はクラウドエンジニアとして働いています。
クラウド未経験からいきなり資格6つ取ったりしたので、よろしければそちらの記事も読んでみてください。
https://nahareport.blogspot.com/2022/07/2azure-expert.html
https://nahareport.blogspot.com/2022/08/1awsgcp.html
https://nahareport.blogspot.com/2022/11/aws-sap-solution-architect-professional.html

一方、クラウドつよつよ@whywaitaさんなら5秒でできる簡単な話かとは思いますが、
今回Terraformをローカル環境で勉強できるようにしました。
しばしお付き合いください。

今回の環境は、以下のような方におすすめです(僕を含む)
・Terraformを色々触って学習したい
・でもawsとかに接続するとインスタンス削除忘れしそう(課金こわい)
なお、MacBook Air M1での構築を想定しています。


まずはTerraformインストール。
https://developer.hashicorp.com/terraform/downloads
brewを使いたくないので、
Binary download for macOSでARM64をダウンロード。
/usr/local/binにこぴります。

先にローカルのkubernetes環境でのterraform利用例を見ましょう。
minikubeをインストールします。
https://minikube.sigs.k8s.io/docs/start/

で、minikube startすると...driverがないよってエラーになります。
で、以下を見ます。
https://minikube.sigs.k8s.io/docs/drivers/
Docker (Docker Desktop)が推奨だよ。インストールしてね、とのこと。インストールしましょう。

さっそく、terraformファイルのprovider部分をkubernetesとdockerで見比べてみましょう。
後述URLのサイトのサンプルです。
まずローカルkubernetes
terraform {
  required_providers {
    kubernetes = {
      source = "hashicorp/kubernetes"
      version = "2.11.0"
    }
  }
}

provider "kubernetes" {
  config_path    = "~/.kube/config"
  config_context = "minikube"
}

つぎにローカルdocker
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}


なるほど、こうやって構築先を判断しているのか...
つぎにkubernetesのnamespaceとdeploymentの部分を見てみましょう。
resource "kubernetes_namespace" "example" {
  metadata {
    name = "k8s-ns-by-tf"
  }
}

resource "kubernetes_deployment" "example" {
  metadata {
    name = "terraform-example"
    labels = {
      test = "MyExampleApp"
    }
    namespace = "k8s-ns-by-tf"
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }
    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        container {
          image = "nginx:1.21.6"
          name  = "example"

          port {
                container_port = 80
          }

          resources {
            limits = {
              cpu    = "0.5"
              memory = "512Mi"
            }
            requests = {
              cpu    = "250m"
              memory = "50Mi"
            }
          }
        }
      }
    }
  }
}

kubernetesのyamlと同じですね。
一方docker
resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

まあシンプルですかね。
ということでローカル環境でterraformの学習環境が整いました(インストールしてみた!記事になっているのは秘密)。
パチパチパチ

しかし残念なことに、terraform触っていたらkubernetesのほうが面白くなってきてしまい、
kubernetesしかさわっていない状況になってしまいました。
k8sには人を惹きつける魅力があるのかもしれません。

whywaita Advent Calendar 2022の4日目いかがだったでしょうか?
明日以降、morimolymolyさんが2連続で記事を書いてくださるようです。


参考URL

Comments

Popular posts from this blog

conda clean --allはやってはいけない

MacbookやiMacのSSD/HDDを完全消去する(High Sierra対応版)

意外とめんどいmac OSXでのddコマンド