Tech Sketch Bucket of Technical Chips by TIS Inc.

Terraformを使う!「導入~AWSにインスタンスを作成・変更・削除」

Pocket

HashiCorp社から今年の7月に発表されたOSSのクラウドオーケストレーションツールです。
複数のサービスプロバイダからなるシステムを縦断的に管理することが可能です。
今回はプロダクト導入からAWSインスタンスの操作までをご紹介します。


Terraformとは

HashiCorp社が2014/07/28に発表したクラウドオーケストレーションツールです。
HashiCorp社はSerfやVagrantなど有用なOSSをいくつも発信している企業です。

従来のAWSであればCloudformationのJSONファイルへ記載していたインフラコードは実行時にしかエラーの判断が出来ませんでした。
また、JSONファイルへのコメントの記載も出来なかったため、複雑なJSONファイルは可読性が低くなっておりました。

Terraformでは独自拡張されたJSONファイルを利用するためコメントの記載が可能になり
計画と実行の2つのプロセスで操作を行うため、実行前にエラーの判断が可能になりました。

今回ご紹介するのはAWSの操作方法ですが、
複数のサービスプロバイダからなるシステムをTerraformで一括管理することも可能となります。

Terraform関連サイト

Terraformから利用できるサービス

Ver0.1.1でTerraformが対応しているサービスは以下の6種類です。

  • AWS
  • CloudFlare
  • Consul
  • DigitalOcean
  • DNSimple
  • Heroku

利用できるサービスは今後拡大の予定があるようです。
最新情報はGitHubをご確認ください。
https://github.com/hashicorp/terraform/tree/master/builtin/providers

導入

インストールはとても簡単です。
今回はUbuntu14.04_64bitの環境へ導入していきます。
導入に必要なのはたった2ステップです。

  1. Terraformの圧縮ファイルをダウンロード
  2. 圧縮ファイルを解凍

これだけです。

導入が終わったら動作確認のためterraformコマンドを実行します。

コマンドが動作し、バージョンが表示されれば導入成功です。

コマンドのパスを通す

利便性向上のためにterraformコマンドにパスを通します。
解凍されたterraformファイルを/usr/local/binへ配置します。

これでどこからでもterraformコマンドを呼び出すことが出来るようになりました。

環境設定ファイル作成

TerraformからAWSを操作するためにAWSへのアクセス情報を設定ファイルに記述する必要があります。

Terraformでは独自拡張されたJSONファイル(.tfファイル)を使用します。
コマンド実行時にカレントディレクトリ直下の設定ファイルを全て読み込むので
複数インスタンスを一つの設定ファイルにまとめることも出来ますし、分割することも可能です。

設定ファイルは「.tf」の拡張子であれば名前は任意のもので構いません。
本記事では「aws.tf」という名前の設定ファイルにしております。
それでは、早速書いて行きます。

項目 入れるべき値
provider 定義するサービスプロバイダ名
access_key AWSから払い出される鍵情報
secret_key AWSから払い出される鍵情報
region AWSリージョン情報
resource "<オブジェクトタイプ>" "<任意のリソース名>"
ami インスタンス構築時のOSイメージ情報
instance 立ち上げるインスタンスのインスタンスタイプを定義
subnet_id AWS VPCで定義したsubnetidを定義
security_groups VPCに設定、またはインスタンスに設定されたセキュリティグループを指定

インスタンスを作成する

Terraformでは実行にあたり必ず2つのプロセスで行います。

  1. 計画(Plan)プロセス
  2. 実行(Apply)プロセス

計画と実行の2つのプロセスを行うことで実行時に起こりえる問題を事前に計画の段階で知ることが出来ます。
つまりは安全なクラウド運用が可能になります。

計画

設定ファイルに不備がないか計画を実施し確認を行います。

計画をすると先ほど作成したaws.tfファイルを読み込み作成されるインスタンスの情報を見ることが出来ます。
設定ファイルの内容が新規作成物だった場合オブジェクト値の左側に「+」が表示されます。
この例では
"ami-d13845e1"というイメージを使い、
"t2.micro"というインスタンスタイプで、
"tis_key01"の鍵情報を登録し、
"sg-500a8635"というセキュリティグループに所属している、
"subnet-9f6432d9"というネットワークに接続された
インスタンスの新規作成を計画しています。

実行

計画のプロセスで確認した内容で実際に実行し、インスタンスを作成していきます。

11行目にApply complete!とメッセージが
出力されていることからインスタンス作成が成功したことがわかります。

WS012.JPG

作成したインスタンスを変更する

上記で作成したインスタンスの鍵情報を変えたいと思います。
既存の"tis_key01"から、別に用意されている"tis_key02"へ変更します。

設定ファイルの編集

ここでは5行目の鍵情報を「key_name = "tis_key01"」から「key_name = "tis_key02"」へ変更しました。
さっそく変更を計画してみます。

計画

設定ファイルの内容が既存作成物との変更差分だった場合オブジェクト値の左側に「-/+」が表示されます。
17行目のkey_name値が"tis_key01"から"tis_key02"になっています。
変更が無い部分については"computed"が表示されています。
それでは実際に変更を実行します。

実行

6行目で"tis_key01"から"tis_key02"へ値の変更が実行されています。
9行目に表示されている「Apply complete!」のメッセージから無事にkey_name情報が変更できたことがわかります。

WS013.JPG

作成したインスタンスを削除する

最後に操作していたインスタンスを削除してみます。
terraformでは削除の場合には「-destroy」オプションを使用します。

「.tf」ファイルには変更を加えず-destroyオプションで削除を計画します。

計画

-destroyオプションを付与した場合オブジェクト値の左側に「-」が表示されます。
「-out=./terraform.tfplan」を指定しているのはterraform.tfplanというファイルを作成し、削除計画を実行時に引数として渡すためです。
端的に言えば削除計画ファイルをここで作成しています。

これで削除の計画ができました。次は実行です。

実行

実行コマンドに先ほどの削除計画ファイルを引数として指定します。
計画が実行され、5行目の「Apply complete!」の表示とともに削除が成功しました。

WS014.JPG

終わりに

このようにterraformの拡張JSONファイル(.tfファイル)にインフラストラクチャコードを記載することによって
計画と実行ができ、安全なAWS運用が簡単に出来るのがterraformの良い所となっています。

次回はAWSを操作していてハマった点等をお伝えできればと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?