どうも!オペレーション部の西村祐二です。
最近、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処理を入れることで回避できました。
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を構築する際に遭遇したエラーとそれに対する対処法をまとめてみました。
誰かの参考になれば幸いです。