4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Terraform】aws_iam_policy_attachmentを使うとtfstate外のリソースにも影響を与える可能性

Last updated at Posted at 2022-03-02

これはなに?

Terraformを用いて、AWS環境のIAMロールとIAMポリシーのアタッチをする際に
iam_policy_attachmentを使用するとハマる罠があるのでその事象についてのメモです。

事象

例えばですが、下記の様な記述でIAMロールへIAMポリシーをアタッチしていると想定します。

iam.tf
# ロール
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)を作成します。
image.png

apply前の状況

現状の構成としては以下の様になっているかと思います。
aaaaaaa.drawio (5).png

そして、環境を片付けようとして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されてしまいました。
aaaaaaa.drawio (4).png

解決策

結論、aws_iam_role_policy_attachmentを使いましょう。
iam_policy_attachmentでは他のメカニズム(他のTerraformリソースを含む)を介してアタッチされたポリシーを持つユーザー/ロール/グループでさえ、そのアタッチされたポリシーがこのリソースによって取り消される可能性があると記載があります。
image.png

既に使用していて削除したい場合

terraform state rmを使用して、iam_policy_attachmentをtfstate外に移動してから、
terraform destroyしてあげれば問題無く削除できます。

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?