AWS
Cloudtrail
Terraform

[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を作成しようとしてエラーが発生する。