TerraformでEC2インスタンスを自動起動

Terraformというインフラをコード化して自動化出来るツールを使ってみました。

AWSを使ってEC2インスタンスの自動起動を行います。

今回はセキュリティグループなどを新たに作成することはなく、既存のものを使います。

Macでのやり方です。

IAMを作成

Terraform用にIAMを作成します。

IAMのコンソールから ユーザーの追加 をクリック

ユーザー名を適当に入れます
その後プログラムによるアクセスにチェックを入れます。
AWSマネジメントコンソールへのアクセスにはチェックをいれません。
このユーザーではコンソールにアクセスしないからです。

今回はAdminstratorAccessをアタッチします。
必要に応じて、必要なアクセス権限にしてください。

その後アクセスキーシークレットキーが出力されるので、メモしておきます。

AWS cliをインストール

IAMの認証情報をTerraformのファイルに書くのはGitHubにpushしたときなどは危険なので、configureに書くためにaws cliをインストールします

macの方はこちらを見ながら入れてください

macOS での AWS CLI バージョン 2 のインストール

profile作成

aws configureを使って設定します。
test-hacknoteは好きな名前でOKです。この名前は後ほど使います。
アクセスキーとシークレットキーは先程メモしたものを入力します。

$ aws configure --profile test-hacknote
AWS Access Key ID [None]: XXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

tfenv

今回はtfenvというものを使います。

homebrewを使ってTerraformをインストールしても良いのですが、頻繁に発生するバージョンアップを回避するために、tfenvを利用します。
他にもDockernized Terraformを使う方法もあります。

tfenvインストール

インストールしていきます

$ brew install tfenv
$ tfenv --version #インストールできたかどうか確認

バージョンが表示されれば、okです。

tfenvの使いかた

list-remoteコマンドでインストール出来るバージョンの一覧を取得出来ます。

$ tfenv list-temote
0.13.0-beta3
0.13.0-beta2
0.13.0-beta1
0.12.29
0.12.28

~省略~

指定バージョンのインストール

$ tfenv install 0.13.0-rc1

切り替えられることを体験するために、もう1バージョンインストールしておきます。

$ rfenv install 0.12.29

このあとにtfenv listコマンドでインストール済みのものを見ることが出来ます。 しかしエラーがでました。エラー文に習ってuseコマンドを使って解決します。

$ tfenv list
cat: /usr/local/Cellar/tfenv/2.0.0/version: No such file or directory
Version could not be resolved (set by /usr/local/Cellar/tfenv/2.0.0/version or tfenv use <version>)
tfenv-version-name failed
$ tfenv use 0.13.0-rc1
Switching default version to v0.13.0-rc1
Switching completed
$ tfenv list
* 0.13.0-rc1 (set by /usr/local/Cellar/tfenv/2.0.0/version)
  0.12.29

バージョンの切り替え

インストールしてあるものはuseコマンドをを使ってバージョンを切り替えられます。

$ tfenv use 0.12.29
Switching default version to v0.12.29
Switching completed
$ tfenv list
  0.13.0-rc1
* 0.12.29 (set by /usr/local/Cellar/tfenv/2.0.0/version)

.terraform-version

.terraform-versionというファイルに指定のバージョンを書いておけば、一発でチームメンバーがコマンドを実行するだけで、バージョンを統一出来る

$ echo 0.12.29 > .terraform-version
$ tfenv install

これで0.12.29がインストールされる。

terraform実行

適当にディレクトリを作ります
その中にmain.tfというファイルを作成します。

$ mkdir terraform-test
$ cd terraform-test
$ touch main.tf

中身は以下のようにします。

コードの解説です
上記を入力すると、以下のようなものが作成されます。

種類作成されるもの
AMIAmazonLinux2
インスタンスタイプt2.micro
セキュリティグループIDに対応したもの
sshキー名キー名に対応したもの
アベイラビリティゾーンap-northeast-1a
Nametest-Terraform

ここを適宣書き換えることで、環境に応じて書き換える事ができます。
他にも設定出来る項目があるので、必要に応じて追記してください。

公式ドキュメントをみると良いかと思います。
Resource: aws_instance

ファイルが作成出来たら、実行していきます。

$ terraform init #初回のみ
$ terraform plan
$ terraform apply

はじめに、initで初期化します

planは確認用のコマンドです。
ファイルを書き換えた場合に、既存リソースをそのまま変更する場合と、リソースを作り直す場合があります。
そのため意図した動作になるのかどうかを確かめるためにも、planを実行したほうが良いです。

applyで実行します。
いちよここでも変更点が確認できます。
その後yesと入力することで、実行します。

EC2コンソールから確認すると、立ち上がっています!
セキュリティグループやキーペア名も任意のものになっていますね

環境を壊すときはdestroyコマンドを使います

$ terraform destroy

おわりに

このように設定ファイルを書くことで、EC2を操作することが出来ます。
AWS CLIとは違い、.tfファイル内に、シェルスクリプトを書くことが出来るので、自動でApacheをインストールして、PHPもインストールして…と出来るので、サクッと環境を建てたい時なんかにはとても便利だと思います。
またコードで管理するので、gitを使えばどのようにシステムを変更したかなども履歴として追うことができますね。

その場合はアクセスキーの流出などには十分注意する必要があります。
ファイルに直接アクセスキーなどを書いてあるチュートリアルもありますが、オススメ出来ません。
git-secretsなどを利用すればコミットでエラーを出すことも出来ますが、万が一を考えると、profile名を書いて適用したほうが安全と言えます。