orenoblog

エンジニアになりたいExcel方眼紙erの物語

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で指定した値をそのままAWSAPIサーバへ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が指定できます。

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.