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