(覚書的な内容になります)
経緯
小さいシステムを構築してまして、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] # ここ変更
}
終わりに
ロール作成とリソース作成を同時にやろうとしてコケてしまう時はこのような対応方法も検討していただければと。