3.6K Views
September 13, 23
スライド概要
温かい目で見守ってください
ニフクラで実践Terraform ~入門編~ 2023/09/13 富士通クラウドテクノロジーズ株式会社 プラットフォームSRE部 藤井 哲崇 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
自己紹介 名前:藤井 哲崇(よしたか) X :ystkfujii Org:CloudNative Days /Kubernetes SIG-Docs ひとこと:月の土地持ってます たぶんここらへん © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
はじめに ⚫ 想定聴衆 • Terraformを触ってみたい!とそわそわしてる方 ⚫ 話すこと • Terraformの概要 • 実践に向けての準備 • 実践:Nginxサーバの構築 • 実践:チーム開発 今回はNIFCLOUDを利用しますが、 他のクラウドに読み替えることも可能です! ⚫ 話さないこと • Terraformのディレクトリ構成について • Terraform Cloudについて • OpenTFについてや、豆腐になるかもしれない話について • Trivyを利用したIaCスキャンについて © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
Terraformとは ⚫ 公式ドキュメント曰く、 Terraform is an infrastructure as code tool that lets you build, change, and version infrastructure safely and efficiently. 参考:What is Terraform ⚫ 特徴 • HashiCorp社が開発したIaCツール • 宣言的にインフラを管理可能 • HashiCorp Configuration Language(HCL)を用いてインフラを定義(※1) • 管理するインフラ及び構成に関する状態をStateファイルに保存 ※1)JSONもサポートされている 参考:JSON Configuration Syntax © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
利用イメージ ⚫ 概要 ④Terraform Providerを使用してリソースを作成する ①リソースをHCLで定義 ③アクションを実行 ②Apply時のアクション(作成・変更・削除)を確認 参考:Standardize your deployment workflow © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
Ansibleとの比較 Ansible Terraform GitHub Star 58.4k 38.7k Source Open Open 利用可能なCloud だいたいすべて だいたいすべて Master/Agentの有無 無/無 無/無 言語 YAML HCL タイプ 手続き型 宣言型 インフラ(※2) 可変(Mutable) 不変(Immutable) ※1)その他のIaCツールとの比較はTerraform vs. Alternativesを参照 ※2)インフラに変更が蓄積されるかどうか © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
参考:Ansible超入門 参考:第55回 ニフクラ エンジニアミートアップ © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践に向けての準備 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
準備 ⚫ 実践に必要な知識 • その1:terraformコマンド(Terraform CLI)の利用方法 • その2:Terraform Providerの利用方法 • その3:Terraform Moduleの概要 • その4:クラウド上のリソースの定義方法 参考:Standardize your deployment workflow © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
その1:terraformコマンドの利用方法 ⚫ terraformコマンドとは • • Terraformのコマンドラインインターフェース • サブコマンドを利用しTerraformを操作する(下記参照) • Terraform CLIとも呼ばれる バイナリパッケージとして配布されている(※1 • Homebrew/apt/dnfなどのパッケージマネジャーからも入手可能 ⚫ 主なサブコマンド • terraform init :ワーキングディレクトリの初期化を行うコマンド • terraform validate :ディレクトリ内の構成ファイルを検証するコマンド • terraform plan :現在の構成ファイルと実態の差分を表示するコマンド • terraform apply :構成ファイルに従ってリソースを作成/更新/削除するコマンド • terraform destroy :構成ファイルのリソースを削除するコマンド(※2 ※2) terraform apply –destroyコマンドのエイリアス © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
その2:Terraform Providerの利用方法 ⚫ Terraform Providerとは • 各種クラウド/SaaSなどを利用するために必要なプラグイン • Terraform Registryには3504個のProviderが存在する(※1 今回はNIFCLOUD Provider(※2)を利用!👉 ⚫ NIFCLOUD Providerの利用方法 • NIFCLOUDのAPIを実行できるアカウントがあればOK • 具体的な利用方法は後述 ※1)2023年09月時点であり、最新情報はProvidersを参照 ※2)NIFCLOUD Provider © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
その3:Terraform Moduleの概要 ⚫ 概要 • リソースを定義したコードを1つのディレクトリにまとめたもの ⚫ Standard Module Structure(※1 ※1)詳細はStandard Module Structureを参照 • main.tf:作成するすべてのリソースの定義 • variables.tf:作成するリソースで利用する変数の宣言 • outputs.tf:作成したリソースに関して出力したい情報 variables.tf 【補足】プログラミングでいうと、、、 main.tf 関数 variables.tf 引数 outputs.tf 戻り値 main.tf Load Balancer Instance output.tf © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
その4:リソースの作成方法 ⚫ Providerのドキュメントに書いてある! nifcloud_instance: Example Usage 各リソースの作成方法はドキュメントを参照すればOK © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
Nginxサーバー構築 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践:Nginxサーバの作成 ⚫ 実践内容 ①Terraformを使用してリソースを作成 terraform apply !!! リソース定義 NIFCLOUD Provider HCLで必要なリソースを作成 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践:Nginxサーバの作成 ⚫ 実践内容 ①Terraformを使用してリソースを作成 terraform apply !!! リソース定義 NIFCLOUD Provider Security Group Instance HCLで必要なリソースを作成 Port:80を許可 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践:Nginxサーバの作成 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 グローバルIPを確認! リソース定義 NIFCLOUD Provider Security Group Instance Port:80を許可 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践:Nginxサーバの作成 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス curlコマンド !!! リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
実践:Nginxサーバの作成 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 ⚫ 要件 • • 必要なリソース • Instance • Security Group/Security Group Rule 完成コードはこちらに格納済み! 👉NIFCLOUD Engineer Meetup Terraform InstanceのグローバルIPをリソース作成時に確認したい © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 ファイル構造 main.tf/outputs.tf/variables.tfの構成はこれ👆 templatesディレクトリは後述! © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 【アカウント情報】 ③グローバルIPにHTTPでアクセス 今回は環境変数で設定することを想定 リソース定義 NIFCLOUD Provider 下記のように、Providerブロックで設定することも可能 Security Group Instance コンソール main.tf(一部) Port:80を許可 Moduleの実行に必要なProviderの設定 利用するProviderの設定 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス main.tf (一部) リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 east-12にfw011という名前のSecurity Groupを作成 Security Group fw011に80番の穴をあける © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス main.tf (一部) リソース定義 別途アップロードしたSSH Key meetupを設定 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 先ほど作成したSecurity Groupを設定 サーバー起動時に実行するスクリプトを設定 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス userdata.tftpl リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
コード解説 ⚫ 実践内容 ①Terraformを使用してリソースを作成 ②InstanceのグローバルIPを確認 ③グローバルIPにHTTPでアクセス outputs.tftpl リソース定義 NIFCLOUD Provider Security Group Instance コンソール Port:80を許可 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
デモ:Nginxサーバ作成から接続まで © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
参考:terraform init © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
参考:terraform apply Ssss ~略~ ~略~ © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
参考:Nginxのアップデート Instanceの再作成が計画される Instanceの再作成に伴い、 Outputも変更 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
チーム開発 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
terraform planについて ⚫ 概要 terraform apply実行時の動作(作成・変更・削除)を確認可能 ⚫ 動作概要 差分を確認し動作を確認している terraform plan リソース定義 Stateファイル ⚫ Stateファイルとは • • 管理するインフラ及び構成に関する状態を保存したファイル • テキスト形式なので中身が確認可能 • 編集はterraform stateコマンドで行う デフォルトはローカル環境にterraform.tfstateという名前で保存される 簡単にいうと、、、 クラウド上にどんなリソースがあるのかを 管理しているファイル © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
terraform planについて ⚫ 概要 terraform apply実行時の動作(作成・変更・削除)を確認可能 ⚫ 動作概要 terraform plan リソース定義 Stateファイル あるリソースが、リソース定義にあり、Stateファイルに無い 新規作成 あるリソースが、リソース定義に無く、Stateファイルにある 削除 あるリソースが、リソース定義にあり、Stateファイルにあるが設定が異なる 設定変更/削除から新規作成 Stateファイルは常に最新の状態にする必要がある。 チーム開発の場合、Stateファイルの共有方法を検討する必要がある。 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
Stateファイルの共有方法 ⚫ Backend設定 • どこにStateファイルを保存するか定義したもの • • ← Terraformの設定 ← BackendとしてTerraform Cloudを使用 AzureRM/s3/GCSなどが利用可能(※1) 設定はterraformブロック内に記載する ※1)Available Backends ← NIFCLOUD Providerの設定 Backendを介してStateファイルを共有することが可能! 今回はGitLabのTerraform State機能(※1)を使用してStateファイルを共有する © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
疑問:バージョン管理ツールではダメなの? ⚫ バージョン管理ツール • 一般的にコードはGitHubやGitLab等のバージョン管理ツールで管理される • 同じようにStateファイルも管理すれば良いのでは?🤔 👉技術的には可能だが、、、 ⚫ Stateファイル管理の際の考慮点 • 排他制御 • 最新のStateファイルをgit pushし忘れるリスク • 機微情報の管理 © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
排他制御の動作イメージ ⚫ 重複した作業を行うと、、、 サーバー作成! Project Repository ブランチA Aさん ①push サーバー作成! ②terraform init GitLab-CI ブランチB Terraform State Bさん © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
排他制御の動作イメージ ⚫ 重複した作業を行うと、、、 サーバー作成! ③apply Aさん Project Repository ブランチA ④terraform apply GitLab-CI サーバー作成! ブランチB 🔓Lock Terraform State Bさん © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
排他制御の動作イメージ ⚫ 重複した作業を行うと、、、 サーバー作成! ③apply Project Repository ブランチA Aさん ④terraform apply GitLab-CI サーバー作成! ブランチB ⑤apply 🔓Lock Terraform State Bさん ⑥Lockされているのでapplyできない © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
デモ © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
まとめ ⚫ Terraformの特徴 • 宣言的にインフラを管理できる • HashiCorp Configuration Language(HCL)を用いてインフラを定義する • 管理するインフラ及び構成に関する状態をStateファイルに保存する ⚫ チーム開発の考慮 • リソースに対するアクションはStateファイルをもとに決まる • • チームメンバー間でStateファイルの共有が必要 Stateファイル管理用のBackendを用意し利用する © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED
Thank you © 2023 FUJITSU CLOUD TECHNOLOGIES LIMITED