Terraformで最低限のAWS環境を作ってみた
タイトル通り。
Terraformってなに?
インフラの構成をコード化するもの。
AWSに限っていうと、VPCやSecurityGroup、GatewayからEC2などなどをコード化できる。 (Terraform自体はAWSだけでなく、DigitalOceanやHerokuなど各種サービスに対応している)
サーバの中身をコード化するChefやAnsibleなどとはそもそも異なる。
インストール
Macの場合はHomebrewで一発
% brew install terraform
2015/07時点の最新版である0.6がインストールされた。 以降、0.6でのお話し。
設定
tfファイルで構成を定義する。 以下、AWSでインスタンスを作成する設定サンプル。
# Credential provider "aws" { access_key = "xxxxxxxxxx" secret_key = "xxxxxxxxxx" region = "ap-northeast-1" } # Create instance resource "aws_instance" "sample" { ami = "ami-cbf90ecb" # Amazon Linux AMI 2015.03 (HVM), SSD Volume Type instance_type = "t2.micro" tags { Name = "sample" } }
コマンド
作成したtfファイルを元に適用のテストをする(ようはdry-run)
% terraform plan
作成したtfファイルを元に構成を適用する
% terraform apply
構成を全て破棄する
% terraform destroy
構成を確認する
% terraform show
試しに
AWSで一通りの構成を作ってみた。
これで作れるものは以下。
気になったこと
tfstateファイルについて
terraform applyを実行すると、tfstateファイルが作成されます。
こいつが現在の生の構成を把握するファイルみたいなので、複数人で利用する場合は統一する必要があります。
インスタンスの設定変更について
EC2インスタンスを一度立ち上げた後に設定を変更する場合、なんと一度Destroyしてからの再作成となります。 SecurityGroupを追加してもそうなりました(ただ、タグの追加は大丈夫でした) 完璧にImmutable化できているのなら大丈夫ですが、そうでない場合やインスタンスの用途がDB系である場合は要注意かと思います。
感想
使ってて気持ちいい。 apply -> destroy -> applyして全く同じ環境ができるのはちょっと感動。 初めて構成管理ツール使った時の感覚を思い出しました。
とりあえずは軽めのところから実践投入する予定。
EC2のタグをCLIで管理するtapewriterというツールを作った
タイトル通りですが、EC2のタグをCLIで管理したくて(=コード化したくて)作ってみました。
route53をDSLで管理するroadworkerという素晴らしいツールがあるのですが、おもいっきりその影響を受けています。 (や、ほんと素晴らしいツールで結構な衝撃だったんです)
なにをするもの?
EC2のタグをjsonで管理できるようになるツールです。 jsonなのでバージョン管理もバックアップも取れます。
どんなところで使うの?
- タグのバックアップをとりたいとき
- タグをバージョン管理したいとき
- ブラウザでの作業が嫌だというとき
- タグを一気に変更したいとき
つかいかた
タグをエクスポートする
% tapewriter -r ap-northeast-1 -f dev-app.json --export --filter '{"Env":"dev", "Role":"app"}'
フィルターが使えます
タグを編集する
- 変更前
{ "instances": [ { "id": "i-11111111", "region": "ap-northeast-1", "tags": { "Env": "dev", "Role": "app", "Name": "hoge", "State": "standby" } }, { "id": "i-22222222", "region": "ap-northeast-1", "tags": { "Env": "dev", "Role": "app", "Name": "fuga", "State": "standby" } } ] }
- 変更後
{ "instances": [ { "id": "i-11111111", "region": "ap-northeast-1", "tags": { "Env": "dev", "Role": "app", "Name": "hoge", "State": "run" } }, { "id": "i-22222222", "region": "ap-northeast-1", "tags": { "Env": "dev", "Role": "app", "Name": "fuga", "State": "run" } } ] }
Stateタグを変更しています。
dry-run(テスト実行)
どんな変更がされるか確認
% tapewriter -r ap-northeast-1 -f dev-app.json --apply --dry-run
適用
タグを適用
% tapewriter -r ap-northeast-1 -f dev-app.json --apply
実際使ってみて
複数のインスタンスのタグを一気に変更したいときにあってよかったなーと思いました。
でも1つのインスタンスのタグを一つだけ変える、とかだったらAWSコンソールからやったほうが早いです。
そもそも
みんなタグってどうやって管理しているんだろ。というかそもそも使ってないのか?ちょっと聞いてみたい。