[Terraform] App Runnerを構築するときInvalidRequestException: Error in assuming access role が発生したときの対処法

2023.07.31

どうも!オペレーション部の西村祐二です。

最近、TerraformでApp Runnerを構築する機会がありました。

そこで、ハマったことと対処法を備忘録兼ねてブログにしておきます。

環境

Terraform:v1.5.4

発生したエラー内容

TerraformでApplyを実行すると下記エラーが発生しました。ただ実装みても問題のある箇所が見当たらなかったので、再度実行すると正常に成功するという事象でした。

 Error: error creating App Runner Service (xxxxxx): InvalidRequestException: Error in assuming access role arn:aws:iam::xxxxxxxx:role/xxxxxxx

ECRにアクセスしようとした際にエラーになっているようでした。

対処方法

App Runnerに設定するロール作成後に一定時間待つ処理を追加することでエラーを回避することができました。

調査すると同様の事象が別のツールではありますが、発生しているIssueがありました。回避策としてsleepを入れることで回避できるとのコメントがありTerraformでも同様にsleep処理を入れることで回避できました。

iam.Role is not always available upon creation and seems to be eventually consistent · Issue #1697 · pulumi/pulumi-aws

Error in assuming access role · Issue #2411 · pulumi/pulumi-aws

エラー回避例

エラーが発生しているRole作成後に10秒待つようにしています。

公式で提供されているTime Providerを利用して実現しています。

Docs overview | hashicorp/time | Terraform | Terraform Registry

iam.tf

# ------------------------------------------------------------------------------
# App Runner Access Role
# ------------------------------------------------------------------------------
resource "aws_iam_role" "apprunner_access" {
  name = "${var.env}-${var.app}-apprunner-access"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": [
          "build.apprunner.amazonaws.com"
        ]
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "apprunner_service_ecr" {
  role       = aws_iam_role.apprunner_access.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSAppRunnerServicePolicyForECRAccess"
}

# Apprunner作成時にInvalidRequestException: Error in assuming access role
# 発生しないように10秒待つ
resource "time_sleep" "wait_10_seconds" {
  create_duration = "10s"

  triggers = {
    apprunner_access_arn = aws_iam_role.apprunner_access.arn
  }
}


# ------------------------------------------------------------------------------
# App Runner Instance Role
# ------------------------------------------------------------------------------
resource "aws_iam_role" "apprunner_instance" {
  name = "${var.env}-${var.app}-apprunner-instance"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "tasks.apprunner.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

apprunner.tf

resource "aws_apprunner_service" "main" {
  service_name = "${var.env}-${var.app}"
  depends_on = [
    null_resource.push_image,
  ]
  source_configuration {
    authentication_configuration {
      access_role_arn = time_sleep.wait_10_seconds.triggers["apprunner_access_arn"]
    }
    image_repository {
      image_configuration {
        port = local.env.port
        runtime_environment_variables = {
          "SERVICE_NAME" = var.service
          "APP_NAME"     = var.app
          "Env"          = var.env
        }
      }
      image_identifier      = "${aws_ecr_repository.main.repository_url}:latest"
      image_repository_type = "ECR"
    }
    auto_deployments_enabled = true
  }
  instance_configuration {
    cpu               = local.env.cpu
    memory            = local.env.memory
    instance_role_arn = aws_iam_role.apprunner_instance.arn
  }

  auto_scaling_configuration_arn = aws_apprunner_auto_scaling_configuration_version.main.arn
}

resource "aws_apprunner_auto_scaling_configuration_version" "main" {
  auto_scaling_configuration_name = "${var.app}-autoscaling"

  max_concurrency = local.env.max_concurrency
  max_size        = local.env.max_size
  min_size        = local.env.min_size
}

さいごに

TerraformでApp Runnerを構築する際に遭遇したエラーとそれに対する対処法をまとめてみました。

誰かの参考になれば幸いです。