Вложенная пошаговая функция в пошаговой функции: неизвестная ошибка: «... не авторизовано для создания управляемого правила» - PullRequest
5 голосов
/ 10 марта 2020

У меня есть шаговая функция (родительская), созданная в шаблоне SAM / CloudFormation, которая, помимо прочего, вызывает другую шаговую функцию (дочернюю). Я следую инструкциям по вызову Child из Parent, используя шаблон интеграции службы . Но я получаю ошибку, связанную с IAM (думаю), которую не могу устранить при развертывании через CLI. (Ошибка проявляется в выходных данных CLI, поэтому она никогда не превращается в AWS. Ранее было много развертываний, поэтому changeset просто пытается изменить функцию шага с этим развертыванием.)

'arn:aws:iam::{Account-Number}:role/{Parent-Step-Function-Role-Name}' is not authorized to create managed-rule. (Service: AWSStepFunctions; Status Code: 400; Error Code: AccessDeniedException; Request ID: {Long-Id-Number})

Чтобы получить синхронное поведение, которое я хочу (Parent вызывает Child, ждет завершения выполнения Child, затем переходит в следующее состояние) Я использую предложение (из ссылки на шаблон интеграции служб выше), чтобы создать задачу (в моем шаблоне SAM), которая выглядит следующим образом:

...More States...

"Call Child State": {
  "Type": "Task",
  "Next": "The Next State",
  "Resource": "arn:aws:states:::states:startExecution.sync",
  "Parameters": {  
    "Input": {
      "comment": "Hello World!"
    },
    "StateMachineArn": "${ChildStepFunction}",
    "Name": "ChildExecutionFromParent"
  }
},

...More States...

Я определил роль IAM для Parent следующим образом убедившись, что он имеет только привилегии выполнения Lambda для функций Lambda в Parent, и, что более важно, имеет разрешение на StartExecution Child. Я следовал инструкциям, приведенным в ссылке ниже, в которой указано, что StartExecution является единственным разрешением, необходимым при использовании шаблона интеграции служб.

https://docs.aws.amazon.com/step-functions/latest/dg/stepfunctions-iam.html

ParentStepFunctionRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: 2012-10-17
      Statement:
        -
          Effect: Allow
          Principal:
            Service:
              - !Sub states.${AWS::Region}.amazonaws.com
          Action: sts:AssumeRole
    Policies:
      -
        PolicyName: ChildStepFunctionExecution
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            -
              Effect: Allow
              Action: states:StartExecution
              Resource: !Ref ChildStepFunction
            -
              Effect: Allow
              Action: lambda:InvokeFunction
              Resource:
                  - !GetAtt Function1.Arn
                  ...
                  - !GetAtt FunctionX.Arn

I Мы пытались заменить вышеуказанное состояние простым Pass состоянием, чтобы убедиться, что в Шаговой функции не было других ошибок, блокирующих развертывание, и она развернута нормально. Так что я знаю, что это связано с этим государством. (Также следует отметить, что при развертывании с состоянием Pass для тестирования я оставил роль, как определено выше, поэтому, опять же, я знаю, что это не синтаксическая ошибка с политиками, которые могут вызывать это. Очевидно, что это не то же самое как, возможно, наличие неправильных или пропущенных политик.)

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Этот вопрос переполнения стека направил меня в правильном направлении. botocore.exceptions.ClientError: Произошла ошибка (AccessDeniedException) при вызове операции CreateStateMachine

Кажется, проблема связана с CloudWatch, и я смог ее обойти, добавив следующий оператор к моей политике IAM.

- Effect: "Allow"
  Action:
  - "events:PutTargets"
  - "events:PutRule"
  - "events:DescribeRule"
  Resource: "*"

Пример проекта AWS Step Functions «Запуск рабочего процесса в рабочем процессе» включает в себя нечто подобное, но ограничено одной вызываемой им функцией Lambda.

1 голос
/ 11 марта 2020

Добавление полного определения роли, которое решило проблему, комбинируя то, что предоставил Эндрю и что было в документации. Он состоит из четырех частей:

  1. Разрешить выполнение дочерней функции шага в следующих состояниях: StartExecution
  2. Разрешить родительскому элементу описать и остановить все функции шага. (Я бы предположил, что это может быть более точно адаптировано к ресурсу; однако это копия и вставка из AWS 'документации.)
  3. Разрешить родительскому элементу создавать / изменять ( Поместите) правило в Cloud Watch (определенный c системный сгенерированный / управляемый ресурс), чтобы оно могло храниться до завершения выполнения (из-за синхронного выполнения).
  4. Разрешить родительскому элементу запускать все применимые Лямбда-функции в функции шага. (Это на самом деле не часть проблемы, с которой я столкнулся, но она связана с пошаговой функцией во всем. Сюда также могут входить другие интеграции - например, SNS - если они у вас есть.)
  ParentStepFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - !Sub states.${AWS::Region}.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        -
          PolicyName: ParentStepFunctionExecutionPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              -
                Effect: Allow
                Action: states:StartExecution
                Resource: !Ref ChildStepFunction
              -
                Effect: Allow
                Action:
                  - states:DescribeExecution
                  - states:StopExecution
                Resource: "*"
              -
                Effect: Allow
                Action:
                  - events:PutTargets
                  - events:PutRule
                  - events:DescribeRule
                Resource: !Sub arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule
              -
                Effect: Allow
                Action: lambda:InvokeFunction
                Resource:
                  - !GetAtt Function1.Arn
                  ...
                  - !GetAtt FunctionX.Arn
...