cloudpack の 脳筋 (岸上) です。

はじめに

Terraform 始めました。

使っていてこれはどーすりゃよいのかしらと思っていたことが実装できたのでメモを残します。

(1)AWS Security Groupを用いて内部通信ツーツーの設定を作りたい

Security GroupにAll trafficを許可するInboundルールを書くことがあると思います。

Management Consoleから作成した All Traffic を選択してセキュリティグループのIDを登録するだけで良いです。

では Terraform で実装する時は、aws_security_group リソースの ingressself を指定すると自身のセキュリティグループのIDを登録できますが、All trafficはどう指定したらよいのかとドキュメント読んでも見当たらなかったのでソースを眺めた所、 protocolstring型で定義されていたぐらいなので、コードの中で指定可能な値を定義しているところはありませんでした。

ということは protocol で指定した値をそのままAWSのAPIサーバへPOSTしているだけであれば、Amazon EC2ドキュメント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 が指定できます。

exampleはここ

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.

元記事はこちらです。
Infrastructure as 脳筋のためのterraform tips