您共享的错误消息似乎暗示给定角色的承担角色策略不包括 Step Functions 使用的任何服务主体。该角色需要一个代入角色策略,将该服务列为其允许的委托人之一:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "states.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
在 Terraform 中,我们通常将其设置为 aws_iam_role 资源的参数:
resource "aws_iam_role" "example" {
name = "stepfunctions"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "states.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
})
}
然后我们可以在 aws_sfn_state_machine 资源中引用该角色的 ARN,这将自动创建一个依赖项,以确保 Terraform 在创建角色之前不会尝试创建 step 函数:
resource "aws_sfn_state_machine" "example" {
name = "my-state-machine"
role_arn = aws_iam_role.example.arn
# ...
}
不幸的是,由于 AWS IAM 的内部设计,在创建 IAM 对象后,有时可能需要几分钟的时间,该对象才能完全发挥作用。 AWS API 没有公开任何完全可靠的方法来检测 IAM 委托人在设置更改后何时功能齐全,因此 Terraform AWS 提供商通常会尽最大努力轮询完成,但不能总是保证这一点。
如果您仍然看到上述配置的错误,我建议您在看到错误后等待 10 分钟,然后再次尝试运行 terraform apply( 不会破坏角色并重新创建它)以查看它是否有效。当然,需要运行两次 Terraform 才能获得所需的答案远不方便,但至少将延迟一致性确定为原因可以避免花时间调查其他可能的问题。