これはなに?
Terraformを用いて、AWS環境のIAMロールとIAMポリシーのアタッチをする際に
iam_policy_attachmentを使用するとハマる罠があるのでその事象についてのメモです。
事象
例えばですが、下記の様な記述でIAMロールへIAMポリシーをアタッチしていると想定します。
# ロール
resource "aws_iam_role" "lambda_role" {
name = "kurono-policy-test-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
#ポリシー
data "aws_iam_policy" "kurono-policy-test-policy" {
arn = "arn:aws:iam::123456789:policy/kurono-policy-test-policy"
}
resource "aws_iam_policy_attachment" "lambda-execute" {
name = "lambda-execute"
roles = [aws_iam_role.lambda_role.name]
policy_arn = data.aws_iam_policy.kurono-policy-test-policy.arn
}
・そして、AWSコンソール側でTerraformと同じポリシーkurono-policy-test-policy
をアタッチしたロール(kurono-policy-test-role-2
)を作成します。
apply前の状況
そして、環境を片付けようとしてterraform destroy
をします。
するとコンソール側で作成したkurono-policy-test-role-2
からもポリシーをrevokeしようとします。
root@kurono2:~/terraform# terraform destroy
aws_iam_role.lambda_role: Refreshing state... [id=kurono-policy-test-role]
aws_iam_policy_attachment.lambda-execute: Refreshing state... [id=lambda-execute]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# aws_iam_policy_attachment.lambda-execute will be destroyed
- resource "aws_iam_policy_attachment" "lambda-execute" {
- groups = [] -> null
- id = "lambda-execute" -> null
- name = "lambda-execute" -> null
- policy_arn = "arn:aws:iam::123456789:policy/kurono-policy-test-policy" -> null
- roles = [
- "kurono-policy-test-role",
- "kurono-policy-test-role-2",
] -> null
- users = [] -> null
}
apply後の状況
kurono-policy-test-role
と同じポリシーを使っていたことにより、
kurono-policy-test-role-2
からもポリシーがrevokeされてしまいました。
解決策
結論、aws_iam_role_policy_attachmentを使いましょう。
iam_policy_attachmentでは他のメカニズム(他のTerraformリソースを含む)を介してアタッチされたポリシーを持つユーザー/ロール/グループでさえ、そのアタッチされたポリシーがこのリソースによって取り消される可能性があると記載があります。
既に使用していて削除したい場合
terraform state rmを使用して、iam_policy_attachmentをtfstate外に移動してから、
terraform destroy
してあげれば問題無く削除できます。