terraform で aws のいい感じの構成を作る(基盤編1)
対象読者
terraformが何かを知っていて、 terraformを使おうと考えている人。
terraform version 0.9.1
初期設定
適当にディレクトリを作成します。
mkdir terraform_test cd terraform_test
0.9.1からstate environmentsを設定できるようになったので、 dev, stg, prod みたいに同一ソースで分岐ができるようになる。
vagrant-ubuntu-trusty-64% terraform env new dev Created and switched to environment "dev"! You're now on a new, empty environment. Environments isolate their state, so if you run "terraform plan" Terraform will not see any existing state for this configuration.
env new をすると、作成したenvに移る。 gitのbranchみたいだな。
vagrant-ubuntu-trusty-64% terraform env list default * dev
AWS 設定
provider "aws" { region = "ap-northeast-1" }
variable "aws_account_id" { default = "1111111111" }
IAMアカウントの作成 AWSのIAMベストプラクティスをちゃんとやる(見る) 上記エントリに沿って、初期設定を行う。
resource "aws_iam_user" "astapi" { name = "astapi" path = "/" } resource "aws_iam_access_key" "astapi" { user = "${aws_iam_user.astapi.name}" }
plan
IAMのベストプラクティスでは、ルートアカウントのアクセスキーとか消さないといけないのだけど、 terraformでIAMユーザーから作りたいので、最初だけルートアカウントのキーを使う。
export AWS_ACCESS_KEY_ID="anaccesskey" export AWS_SECRET_ACCESS_KEY="asecretkey" export AWS_DEFAULT_REGION="ap-northeast-1"
planコマンドで作成予定のリソースを確認する。
terraform plan 中略 + aws_iam_access_key.astapi encrypted_secret: "<computed>" key_fingerprint: "<computed>" secret: "<computed>" ses_smtp_password: "<computed>" status: "<computed>" user: "astapi" + aws_iam_user.astapi arn: "<computed>" force_destroy: "false" name: "astapi" path: "/" unique_id: "<computed>"
apply
terraform apply
IAMユーザーができました。
terraform show
このコマンドで作成したアクセスキーの情報が閲覧できます。
vagrant-ubuntu-trusty-64% terraform show aws_iam_access_key.astapi: id = AKJLAKJDA secret = aslkfjaslfkjasljfas;ljfalskjdfalsjkfak ses_smtp_password = asdklfjasldkfjasdkfjasldjkfas;l status = Active user = astapi aws_iam_user.astapi: id = astapi arn = arn:aws:iam::1111111111:user/astapi force_destroy = false name = astapi path = / unique_id = AAKLJALKFJAKDJALKJD
ポリシーのアタッチ
ルートアカウントを使わなくてもterraformで全ての権限が必要なので、AdministratorAccessが必要。
resource "aws_iam_policy_attachment" "admin" { name = "admin-policy" users = ["${aws_iam_user.astapi.name}"] policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess" }
今後は作成したIAMユーザーのACCESS_KEYを使って実行していきます。 ルートアカウントのACCESS_KEYを削除しましょう。
まとめ
terraform でIAMユーザーのアクセスキーまで作成したが、terraform showでキーが参照できるため、 複数人開発ではこの方式だとNGになりますね。 また、Backend(terraformで作成したAWSの状態を保存しておくところ)がlocalのため、 そもそも自分のローカルでしか実行が出来ない。 backendとしては色々用意されているが、S3 backendでは、terraform envに対応していなかった為、 counsul等、自前サーバーを用意したりする必要がありそう。 そのconsulサーバーを用意するterraformが必要・・・。 うーん。