【问题标题】:Error creating step functions. Not authorized to assume the provided role创建阶跃函数时出错。无权担任提供的角色
【发布时间】:2020-05-09 17:04:24
【问题描述】:

我在使用 terraform 创建阶跃函数时出错:

Error: Error creating Step Function State Machine: AccessDeniedException: Neither the global service principal states.amazonaws.com, nor the regional one is authorized to assume the provided role.

我尝试在资源 aws_sfn_state_machine 中添加depends_on 块,但没有帮助。 但是,如果我从阶跃函数单独创建角色,然后在资源 aws_sfn_state_machine 中设置 role_arn 一切正常。为什么?

【问题讨论】:

    标签: amazon-web-services terraform amazon-iam aws-step-functions


    【解决方案1】:

    您共享的错误消息似乎暗示给定角色的承担角色策略不包括 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 才能获得所需的答案远不方便,但至少将延迟一致性确定为原因可以避免花时间调查其他可能的问题。

    【讨论】:

      【解决方案2】:

      Depends_on 可能是指如果资源 B 也将被创建,则应该创建资源 A。它不会将角色应用于状态机。 role_arn 是状态机使用此特定角色的显式设置。

      https://www.terraform.io/docs/configuration/resources.html#depends_on-explicit-resource-dependencies

      【讨论】:

        【解决方案3】:

        以下是阶梯函数的 terraform 角色,希望对您有所帮助

        #iam/state-assume-policy.json

        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "states.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        }
        

        #role.tf

        data "aws_iam_policy" "AWSStepFunctionsFullAccess" {
          arn = "arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess"
        }
        data "aws_iam_policy" "CloudWatchLogsFullAccess" {
          arn = "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
        }
        data "aws_iam_policy" "AWSLambdaRole" {
          arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaRole"
        }
        
        resource "aws_iam_role" "StepFunctionQuantumRole" {
          name               = "CompanyNameStepFunctionRole"
          assume_role_policy = file("iam/state-assume-policy.json")
        }
        resource "aws_iam_role_policy_attachment" "step_function_attach_policy_awsstepfunctionfullaccess" {
          role       = aws_iam_role.StepFunctionQuantumRole.name
          policy_arn = data.aws_iam_policy.AWSStepFunctionsFullAccess.arn
        }
        resource "aws_iam_role_policy_attachment" "step_function_attach_policy_cloudwatchlogsfullaccess" {
          role       = aws_iam_role.StepFunctionQuantumRole.name
          policy_arn = data.aws_iam_policy.CloudWatchLogsFullAccess.arn
        }
        resource "aws_iam_role_policy_attachment" "step_function_attach_policy_awslambdarole" {
          role       = aws_iam_role.StepFunctionQuantumRole.name
          policy_arn = data.aws_iam_policy.AWSLambdaRole.arn
        }
        

        #step-function.tf

        // Create state machine for step function
        resource "aws_sfn_state_machine" "sfn_state_machine" {
          name       = "nameofstatemachine"
          role_arn   = aws_iam_role.StepFunctionQuantumRole.arn
          defination = <<EOF add your defination EOF
        }
        

        【讨论】:

          猜你喜欢
          • 2019-10-19
          • 2021-12-31
          • 2019-09-02
          • 2018-09-10
          • 2021-03-09
          • 2019-09-10
          • 1970-01-01
          • 2021-03-03
          • 2017-11-20
          相关资源
          最近更新 更多