4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

terraformAdvent Calendar 2022

Day 24

Terraformをdocker環境で立ち上げてみる。

Last updated at Posted at 2022-12-17

はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
最近扱ったterraformについて、開発環境構築方法について投稿したいと思います。

いろいろアドバイスいただけると嬉しいです。

立ち上げ概要

windows11を使用してwsl2+Ubuntu+vscode+git環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

dockerソース

参考URL

Elixirをdocker環境で立ち上げてみる。

dockerでterraform環境を構築して、AWSにVPCを作る。

Terraformを使い、Azureのインフラ構築してみた

TerraformでOCI上に仮想サーバを建ててみた

なぜ、あえてDockerなのか?

インフラエンジニアとしてDockerから触れたほうが扱いやすく、
以下の利点を感じられたため、開発環境構築ではDockerを使用することを
推しています。

  • OS問わず同じ開発環境での開発が可能
  • terraformのバージョン違いによるソース変更などが抑えられる。

事前準備

windows11+wsl2+Ubuntu22+DockerCompose+vscode+gitでの環境を構築してること。

開発環境構築方法

dockerソースファイル入手

git clone https://github.com/naritomo08/terraform_docker_public.git terraform
cd terraform

後にファイル編集などをして、git通知が煩わしいときは
作成したフォルダで以下のコマンドを入れる。

 rm -rf .git

ソースフォルダ作成

mkdir source
→本ファイル内にmain.tfなどのソースファイルを置く。

環境変数ファイル作成

vi .env

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
→AWSの場合、操作ユーザに対応した
 上記の情報を入れる。

ARM_SUBSCRIPTION_ID=
ARM_CLIENT_ID=
ARM_CLIENT_SECRET=
ARM_TENANT_ID=

→AWSの場合、操作ユーザに対応した
 上記の情報を入れる。

gcp管理画面からアクセスjsonキー(gcp.json)を入手して、ソースファイルと同じ場所に置く

環境変数を取得するための方法は以下を参照してください。

OCI APIキー作成(OCI利用)

以下のコマンドでOCI APIキーを作成する。

cd source
mkdir apikey
cd apikey
openssl genrsa -out id_rsa
openssl rsa -in id_rsa -pubout -out id_rsa.pem
ls
→id_rsa,id_rsa.pemファイルが存在していることを確認する。

OCID情報の収集(OCI利用)

以下のサイトの"3.OCID情報の収集"を参照し、以下の情報を収集する。

リソースを入れるコンパートメントは予め作成すること。

  • テナンシのOCID
  • ユーザーのOCID
  • フィンガープリント
  • コンパートメントのOCID
  • 使用しているリージョンの識別子(例:ap-osaka-1)
  • テナンシのオブジェクト・ストレージ・ネームスペース

参考サイト:

TerraformでOCI上に仮想サーバを建ててみた

開発環境操作

開発環境コンテナ起動/設定再読み込み

docker-compose up -d

開発環境コンテナ停止

docker-compose stop

開発環境コンテナ破棄

docker-compose down

terraformコンテナログイン

docker-compose exec terraform ash

terraform操作

terraformコンテナ内で実施すること。
main.tfを作成したフォルダ内で行うこと。

ワークスペース初期化

terraform init

実行計画確認

terraform plan

リソース作成

terraform apply
→yesを入力する。

結果確認

terraform state list
→作成されたモジュール一覧
terraform state show <モジュール名>
→作成したモジュールの参照
terraform state pull > tmp.tfstate
→一覧参照

作成したモジュールの削除

terraformで作成したモジュールは
必ず本コマンドで削除すること。

terraform destroy
→yesを入力する。

作成例

予め環境変数作成まで行っていること。
gcpに関してはダウンロードしたjsonファイルをgcp.jsonにして
ソースと同じ場所に置く。

ソース作成

sourceフォルダ内で以下の内容のファイルを作成する。

cd source
vi main.tf
vi varidate.tf
→ OCIの場合のみ

AWS(VPC/サブネット作成)

#AWSを今回は使いますという宣言
provider "aws" {
  region = "ap-northeast-1"
}

#VPCのCIDERを記載します。
variable "vpc_cidr" {
  default = "192.168.0.0/23"
}

#下記のresourceで使うタグ用の変数を定義
variable "app_name" {
  default = "awsvpc"
}

#resourceでVPCを作成します。
resource "aws_vpc" "main" {
  cidr_block = var.vpc_cidr

  tags = {
    Name = var.app_name
  }
}

#上記のVPCにサブネットを追加します。
resource "aws_subnet" "public_1a" {
  # 上記で作成したVPCを参照し、そのVPC内にSubnetを作成します。
  vpc_id = "${aws_vpc.main.id}"

  # Subnetを作成するAZ
  availability_zone = "ap-northeast-1a"
  cidr_block        = "192.168.0.0/25"
  tags = {
    Name = "awsvpc-prod"
  }
}

Azure(リソースグループ作成)

provider azurerm {
    features {}
}

variable "resource_group_name" {
    type = string
    default = "AzureResource"
    description = ""
}

variable "location" {
    type = string
    default = "japaneast"
    description = ""
}

resource "azurerm_resource_group" "resource_group" {
    name = var.resource_group_name
    location = var.location
}

GCP(VPC作成)

provider "google" {
  credentials = file("gcp.json")
  project     = "<GCPプロジェクトID>"
  region      = "asia-northeast1"
  zone    = "asia-northeast1-a"
}

resource "google_compute_network" "vpc_network" {
  name = "gcpvpc"
  auto_create_subnetworks = false
  routing_mode            = "REGIONAL"
  mtu                     = 1460
}

OCI(バケット作成)

varidate.tf

variable "tenancy_ocid" {
  default = "テナンシのOCID"
}
variable "user_ocid" {
  default = "ユーザーのOCID"
}
variable "fingerprint" {
  default = "フィンガープリント"
}
variable "private_key_path" {
  default = "apikey/id_rsa"
}
variable "region" {
  default = "使用しているリージョンの識別子"
}
variable "compartment_ocid" {
  default = "コンパートメントのOCID"
}
variable "tenancy_namespace" {
  default = "テナンシのオブジェクト・ストレージ・ネームスペース"
}

main.tf


provider "oci" {
  tenancy_ocid = "${var.tenancy_ocid}"
  user_ocid = "${var.user_ocid}"
  fingerprint = "${var.fingerprint}"
  private_key_path = "${var.private_key_path}"
  region = "${var.region}"
}

resource "oci_objectstorage_bucket" "example_bucket" {
  namespace        = "${var.tenancy_namespace}"
  compartment_id   = "${var.compartment_ocid}"
  name             = "tfstate_bucket"
  access_type      = "NoPublicAccess"
}

リソース作成

docker-compose up -d
docker-compose exec terraform ash
terraform init
terraform plan
terraform apply
ctrl+c
→コンソールで作成されていることを確認。

リソース削除

terraformで作成したものは手動ではなく、
terraformで削除すること。

docker-compose exec terraform ash
terraform destroy
ctrl+c
→コンソールで削除されていることを確認。

後始末

docker-compose down
sudo rm -rf terraform

おわりに

この記事がterraformを扱う方の助けになればと思います。

以下の記事で更に各クラウド環境で仮想マシンを作成するソースを
公開しています。

よろしければ参照ください。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?