Terraform 導入のきっかけ
私が現在javaのバックエンド開発者として働いているZOYI Corporationにおいても、Channel Talkの機能拡張により、これまで使っていたCloud Formationよりもより手軽に、そして可読性高くインフラのプロビジョニング※ができるサービスの需要が高まっていました。
※プロビジョニングとは、必要に応じてネットワークやコンピューターの設備などのリソースを提供できるよう予測し、準備しておくことです。供給や設備等の意味を表すプロビジョン(provision)という単語がもととなって派生した言葉です。(出典:https://www.idcf.jp/words/provisioning.html)
先日参加したAWS SummitにてTerraformの説明を受けて以降、本格的な導入に向けて勉強会をスタートしました。
Terraformコマンド
Terraformで使用する基本コマンドは以下の三種類です
- Init → Providerなどのpluginをダウンロードし、ワークスペースを整備
- Plan → 実行計画・差分の確認(どのリソースが作成/修正/削除されるのか)
- Apply → プロビジョン実行
それぞれどのように活用するのか見ていきましょう
大まかな動作方法
- 拡張子が.tfのHCL codeを作成します。(json形式で記述したい場合の拡張子は.tf.json)こちらにプロビジョンの内容を記入します。
- 作成したHCL codeに利用したサービスのProvider※をダウンロードします。弊社ではAWSのプロビジョンのコード化を検討しているため、AWSのProviderをダウンロードします。
3.AWSをProviderが実際にAWSが提供するインフラ構築用のAPIを叩き、プロビジョンを行います。
※Terraformに対応するProviderは以下の通りです。AWS以外にも様々なサービスをプロビジョンすることが可能です。
(出典:https://www.terraform.io/docs/providers/index.html)
#アーキテクチャー
もう少し詳しくアーキテクチャーを見ていきましょう
- 作成するHCL codeはTerraform Core上で動作します。
- HCL codeに従って、該当サービス用の(今回はAWS)PluginsとしてProvidersとProvisionersをダウンロードします。以降、Terraform coreとPluginsはRPCによって通信します。
- 共通の通信形式であるClient libraryを介し、Upstream APIsを叩くことでプロビジョニングを実現します。
チュートリアル
TerraformによりAWSのEC2インスタンスとRDSを作成していきましょう。
インストール
brew install terraform
##バージョン確認
terraform --version
##Provider 設定
###HCL code作成
~/terraform/provider.tf(もしくはprovider.tf.json)というファイル名でコンフィグレーションファイルを作成していきます。
terraform formatもしくはjson形式で作成します。
provider "aws" {
access_key = "your_aws_iam_access_key"
secret_key = "your_secret_key"
region = "ap-northeast-2"
}
その他定義方法はこちらを参照
###initコマンド実行
$ terraform init
コマンド実行するとこのようにAWS用BのProviderがダウンロードされます。
##Resource 設定
###Key pairの作成
まずは一般的な方法で、EC2にSSH接続するためのkeyの生成します。
####HCL code作成
provider.tf
resource "aws_key_pair" "ec2_admin" {
key_name = "ec2_admin"
public_key = "${file(~/.ssh/ec2_admin.pub)}"
}
resource に続く "aws_key_pair"はリソースの種類でプレフィックスaws_*のようにあらかじめ決まっています。
"ec2_admin"はローカル変数(リソース名)で自由に命名でき、HCL codeから参照できます。
planコマンド実行
ではTerraformのplanコマンドを以下のように実行してみましょう。
$ terraform plan
以下のように実際にプロビジョンを行うapplyコマンドを実行する前に、AWSの実際の環境との差分を確認できます。
こうすることで慎重にプロビジョニングを実施できます。
applyコマンド実行
###Security groupの設定
ssh接続時のセキュリティグループを設定していきましょう(ファイヤーウォール/ポート設定)
HCL code作成
planコマンド実行
$ terraform plan
applyコマンド実行
$ terraform apply
###RDSの生成
HCL code作成
planコマンド実行
$ terraform plan
applyコマンド実行
$ terraform apply
data はどのように使うのか
これまで登場したproviderやresourceの他にも
dataがあります。
dataはすでに作成したインスタンスを検索し、情報を取得できるコマンドです。
#参考
https://events.linuxfoundation.org/wp-content/uploads/2017/12/Hashicorp-Terraform-Deep-Dive-with-no-Fear-Victor-Turbinsky-Texuna.pdf
https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code