Posted at

[Terraform] CloudTrail作成時に発生した InvalidCloudWatchLogsRoleArnException を解消。

More than 1 year has passed since last update.


発生事象

Terraform で CloudTrail を作成しようとした際に、下記のエラーが発生した。

* aws_cloudtrail.trail: InvalidCloudWatchLogsRoleArnException: Access denied. Check the trust relationships for your role.

もう一度実行すると正常終了するため、タイミングの問題ですね。

(リソース作成完了と、そのリソースを参照する後続リソース作成処理のタイミング)

尚、これは CloudWatchLogs にログを出力するよう設定するときに発生する。

使用するtfリソースは以下。


  • aws_cloudtrail

  • aws_cloudwatch_log_group

  • aws_iam_role

  • aws_iam_role_policy


解消方法

これが問題解消のための必要最低限の設定か?と言われると「No」かもしれません。

冗長なところがあるかも。

① CloudWatchLogGroup 作成後にsleep。

作成完了して使えるようになるまで待つ。

resource "aws_cloudwatch_log_group" "cloudtrail" {

...
provisioner "local-exec" {
command = "sleep 10"
}
}

②CloudTrailに付与するロールを作成し、ポリシーアタッチして、sleep。

権限付与して使えるようになるまで待つ。

resource "aws_iam_role" "cloudtrail" {

...
}

resource "aws_iam_role_policy" "cloudtrail" {
role = "${aws_iam_role.cloudtrail.id}"
...
provisioner "local-exec" {
command = "sleep 10"
}
}

③CloudTrailの作成は、LogGroupの作成とロールへのポリシー付与が完了するまで待つ。

「depend_on」で、sleepまで含めたリソース設定が完了してから走り出すようにする。

resource "aws_cloudtrail" "trail" {

...
depends_on = ["aws_iam_role_policy.cloudtrail", "aws_cloudwatch_log_group.cloudtrail"]
}


考慮点

Terraform は、tfファイルに書かれた内容を解析して依存関係順に処理してくれる。

依存関係がないものは並列処理してくれる。

だが、依存関係があっても、リソースが確実に使える状態になっていることまでは確認してくれない。

時間の掛かるリソース作成処理がある場合は、明示的に待たせないとエラーになる可能性がある。

CloudTrail作成時にはロールに権限が付与されている必要があり、AWS的には依存関係がある。

だが、tfファイルの aws_cloudtrail に書くのは role_arn であるため、Terraformの解釈としてはポリシー付与までは依存関係に含まれない。

そのためCloudTrail作成とポリシー付与とが並列で動き、権限がないままCloudTrailを作成しようとしてエラーが発生する。