0
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 3 years have passed since last update.

ポリシーのattach起因でリソース作成できない場合のTips

0
Last updated at Posted at 2023-04-04

(覚書的な内容になります)

経緯

小さいシステムを構築してまして、IaC部分にTerraformを使用しています。
ある時、ロール作成とポリシーのアタッチ、リソース作成を一気にやろうとすると、以下のようなエラーが発生しました。

InvalidInputException: Service is unable to assume provided role. Please verify role's TrustPolicy
(以下エラー箇所のリソース情報が続く)

その時に記載していたTerraformが以下のような形です。
(中身は割とボカしてます)

# ロール作成
resource "aws_iam_role" "test-role" {
  name               = "test-role"
  assume_role_policy = file("./assume_role_policy.json") # 何らかのassumeロール設定が記載されているjson
}
resource "aws_iam_policy" "test-policy" {
  name        = "test-policy"
  description = "test policy"
  policy      = file("./policy.json") # 何らかのポリシー設定が記載されているjson
}
resource "aws_iam_role_policy_attachment" "attachment-policy" {
  role       = aws_iam_role.test-role.name
  policy_arn = aws_iam_policy.test-policy.arn
}

# 何かしらのリソース作成
resource "aws_lambda_function" "test-lambda" {
  role = aws_iam_role.test-role.arn
  depends_on = [aws_iam_role_policy_attachment.attachment-policy]
}

エラーの内容を見るとロールを受け取ることができないっていっているので、何となくロール周り(ポリシーかassumeポリシー)の設定が怪しそうだなぁということが分かります。
が、ロール周りの設定見直してみても特に違和感はなく、試しに再度Terraform applyすると問題なく通ることがありました。

ディレクトリ分けて別々にapplyするのも解決手段としてはありなのですが、出来るだけ1度のapplyで通るようにした方が楽なので何かいい方法はないかなぁと調べてみました。

原因

おそらく以下の理由からうまくいかないのかと思われました。
・policyのattachは多少時間がかかること
・aws_iam_role_policy_attachmentを後続リソース作成時のdepends_onに設定しても、policyのattach開始が終了したことをトリガーにしていてattachが完了したことを保証してくれているわけではないこと

ロール作成、リソース作成を別々で時間を置いてapplyをすると問題なく通るので、depends_on設定だけでは待ち時間が不十分なことが分かります。

対応

リソースの作成を任意の待ち時間待つことが出来ればいいわけなので、time_sleepリソースというものを活用しました。
https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/sleep

これによって多少待つことにはなりますが一気にapplyできるようになりました。

# ロール作成
resource "aws_iam_role" "test-role" {
  name               = "test-role"
  assume_role_policy = file("./assume_role_policy.json")
}
resource "aws_iam_policy" "test-policy" {
  name        = "test-policy"
  description = "test policy"
  policy      = file("./policy.json")
}
resource "aws_iam_role_policy_attachment" "attachment-policy" {
  role       = aws_iam_role.test-role.name
  policy_arn = aws_iam_policy.test-policy.arn
}

# ここ追加
resource "time_sleep" "wait-policy-attachment" {
  create_duration = "10s"
  depends_on = [aws_iam_role_policy_attachment.attachment-policy]
}

# 何かしらのリソース作成
resource "aws_lambda_function" "test-lambda" {
  role = aws_iam_role.test-role.arn
  depends_on = [time_sleep.wait-policy-attachment] # ここ変更
}

終わりに

ロール作成とリソース作成を同時にやろうとしてコケてしまう時はこのような対応方法も検討していただければと。

0
0
0

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
0
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?