読者です 読者をやめる 読者になる 読者になる

ほわいとぼーど

ぷろぐらまのメモ帳

Terraform 0.6.16 で格闘したことのメモ

Terraform

Terraformの現バージョン(0.6.16)で相対した悩ましい問題のメモ。
暫定対処したが根本解決はしてない?。次のバージョンでは一部しそう。

aws_route_tableのrouteを削除しても適用されない

差分も出ないし実行もされない。
Issueが出ている -> Inline routes not removed from aws_route_table. #7632
routeをやめてaws_routeで全て書くようにしたら大丈夫になったような?。

aws_route_tableのrouteが変更してないのにplan上は差分が出る

planで差分が出るがapplyでは何も実行されない。
差分と言ってもA.1->A.2みたいな同じrouteを違う名前で付け直してるみたいな表示。
routeが複数(もしくはgateway使った時)の時しか起きないかも。
Issueが出てPR mergeされた? -> aws_route_table: Inconsistency when using gateway_id / nat_gateway_id #6551
routeをやめてaws_routeで全て書くようにしたら差分表示されなくなった。

複数のaws_security_groupで相互にingressできない

sg-Aのinboudにsg-B、sg-Bのinboundにsg-Aを設定したい。
Circle とか怒られる。
aws_security_group_ruleで全て書くようにしたら作成できた。

Accountをまたいだaws_security_group_ruleでplan上は差分が出る

Accountをまたいだ設定の時にAccount付とAccount無しを比較しているように見える。
Issue-> Terraform EC2 security group ingress rule flapping #6135
対策なし (-/+と出るのが救い)

aws_security_groupとaws_security_group_ruleを同時に使うとおかしくなる

これは問題というよりそういう仕様で注意書きがある -> NOTE
同じリソースにそれぞれアクセスして片方が上書くのでtfstateと合わなくなる。
aws_route_table/routeとaws_routeもそう。
ingressとegressは別のリソース判定っぽそう?

aws_iam_policy_attachmentで共通policyをattachmentする際には要注意

users/roles/groupsとリストになっているのを見れば気づくかもしれないが、
共通のpolicyを新しく作成したIAM Roleにattachしようとして、
rolesに単独で設定すると1回目は想定通り実行されるが、
tfstateを管理している場合に2回目に実行した時に他のIAM Roleがdettachされる。
この挙動はAWS Consoleやaws cli等で操作した時とは感覚的に異なるので注意が必要。

aws_iam_policy_attachmentのusers/roles/groupsには
紐付けられている全IAMが書かれている必要がある。
自分の意識では「IAM Role に IAM Role PolicyをAttach」する想定だったため、
その時作成したIAM Roleだけを書いて実行した。
(実際に実行したのは同僚でデバッグしたのも同僚・・・)
1回目の実行時は特に問題ないが、結果できるtfstateには全IAMが記載される。
この状態でもう一度(aws_iam_policy_attachmentにIAM Roleを1つだけ記載)
plan実行すると、記載した以外のIAMは前回との差分として抽出され、
apply実行すると、実際に他は外れて1個だけの状態になってしまう。

Terraform的にはIAMにpolicyをAttachするのではなく、policyにIAMをAttachするということ
なお、新しいリソースが追加される予定になっている模様
provider/aws: Add per user, role and group policy attachment (supersedes #5816) #6858

おしまい

Terraformは非常に開発速度の速いプロダクトなので、
これらは現バージョンのみの問題かもしれません。
なので説明はだいぶ雑になってますが、
自分の感覚的には非常に扱いづらい問題だったのでメモっておきました。
次のバージョンではもっとスッキリ書けると良いなぁ。