Infrastructure as 脳筋のためのterraform tips
terraform始めました。
使っていてこれはどーすりゃよいのかしらと思っていたことが実装できたのでメモを残します。
(1)AWS Security Groupを用いて内部通信ツーツーの設定を作りたい
Security GroupにAll trafficを許可するInboundルールを書くことがあると思います。
Management Consoleから作成したAll Traffic
を選択してセキュリティグループのIDを登録するだけで良いです。
ではterraformで実装する時はaws_security_group
リソースのingressにselfを指定すると自身のセキュリティグループのIDを登録できますが、
All trafficはどう指定したらよいのかとドキュメント読んでも見当たらなかったのでソースを眺めた所
protocolがstring型で定義されていたぐらいなので、コードの中で指定可能な値を定義しているところはありませんでした。
ということはprotocolで指定した値をそのままAWSのAPIサーバへPOSTしているだけであれば
CloudformationドキュメントのIpProtocol
に指定可能なパラメータは指定できると思い、
下記の様なresource
を記述してterraform apply
を実行すると上手く出来ました。
resource "aws_security_group" "common" { name = "common-sg" description = "common security group" vpc_id = "${aws_vpc.hogehoge.id}" ingress { from_port = 0 to_port = 65535 protocol = "-1" self = true } }
(2) 起動するinstance数を指定したい
同一のロールをもつインスタンスが複数台あるとき(たとえばwwwとか) resource "aws_instance"
を並べるのは苦行以外の何物でもありません
ドキュメントには記載されていませんがcountが指定できます。
resource "aws_instance" "hogehoge" { ami = "ami-1234" instance_type = "t2.micro" count = 10 tags { Name = "hogehoge" } }
(3) terraform apply実行時にThrottlingエラー
ひたすらAPIサーバへPOSTしている模様なのでresourceが多いと頻発する。 terraform applyをリトライしたらよい
Error applying plan: 1 error(s) occurred: * Error retrieving ELB: Throttling: Rate exceeded Terraform does not automatically rollback in the face of errors. Instead, your Terraform state file has been partially updated with any resources that successfully completed. Please address the error above and apply again to incrementally change your infrastructure.