Проблема формирования облаков пошаговой функции с Fn :: Sub при передаче списка в качестве второго параметра - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать функцию шага, используя формирование облака.Я хочу передать лямбда-арнс в качестве второго аргумента функции Fn :: Sub.Это работает, если я прохожу только один Арн, но терпит неудачу, когда я прохожу несколько.(с помощью Fn :: Get).Я проверил шаблон с помощью валидатора Yml и не увидел никаких проблем.

Определение шаблона формирования облака для шага:

---
Resources:
  ContractDraftStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      RoleArn:
        Fn::GetAtt: [ StepFunctionExecutionRole, Arn ]
      DefinitionString:
        Fn::Sub:
        - |-
          {
            "Comment" : "Sample draft process",
            "StartAt" : "AdvanceWorkflowToDraftInProgress",
            "States" : {
              "AdvanceWorkflowToDraftInProgress" : {
                "Type" : "Task",
                "Resource": "${WorkflowStateChangeLambdaArn}",
                "InputPath":"$.contractId",
                "OutputPath":"$",
                "ResultPath":null,
                "Next" : "CheckQuestionnaireType",
                "Retry" : [
                  {
                    "ErrorEquals" : ["States.TaskTimeout"],
                    "MaxAttempts": 5,
                    "IntervalSeconds": 1
                  },
                  {
                    "ErrorEquals" : ["CustomErrorA"],
                    "MaxAttempts": 5
                  }
                 ],
                "Catch": [
                  {
                    "ErrorEquals": [ "States.ALL" ],
                    "Next": "FailureNotifier"
                  }
                ]
              },
 
              "CheckQuestionnaireType" : {
                "Type" : "Choice",
                "Choices" : [
                  {
                    "Variable" : "$.questionnaireType",
                    "StringEquals" : "CE",
                    "Next" : "PublishQuestionnaireAnswersToCE"
                  },
                  {
                    "Variable" : "$.questionnaireType",
                    "StringEquals" : "LEAF",
                    "Next" : "PublishQuestionnaireAnswersToLeaf"
                  }
                ]
              },
 
              "PublishQuestionnaireAnswersToCE" : {
                "Type" : "Task",
                "Resource": "${WorkflowStateChangeLambdaArn}",
                "Next" : "UpdateCEMetadataAndGenerateDocuments",
                "ResultPath" : null,
                "OutputPath" : "$",
                "Retry" : [
                  {
                    "ErrorEquals" : ["States.TaskTimeout"],
                    "MaxAttempts": 5,
                    "IntervalSeconds": 1
                  },
                  {
                    "ErrorEquals" : ["CustomErrorA"],
                    "MaxAttempts": 5
                  }
                 ],
                "Catch": [
                  {
                    "ErrorEquals": [ "States.ALL" ],
                    "Next": "FailureNotifier"
                  }
                ]
              },
 
              "PublishQuestionnaireAnswersToLeaflet" : {
                "Type" : "Task",
                "Resource": "${WorkflowStateChangeLambdaArn}",
                "End" : true,
                "Retry" : [
                  {
                    "ErrorEquals" : ["States.TaskTimeout"],
                    "MaxAttempts": 5,
                    "IntervalSeconds": 1
                  },
                  {
                    "ErrorEquals" : ["CustomErrorA"],
                    "MaxAttempts": 5
                  }
                 ],
                "Catch": [
                  {
                    "ErrorEquals": [ "States.ALL" ],
                    "Next": "FailureNotifier"
                  }
                ]
              },
 
              "UpdateCEMetadataAndGenerateDocuments" : {
                "Type" : "Task",
                "Resource": "${WorkflowStateChangeLambdaArn}",
                "End" : true,
                "Retry" : [
                  {
                    "ErrorEquals" : ["States.TaskTimeout"],
                    "MaxAttempts": 5,
                    "IntervalSeconds": 1
                  },
                  {
                    "ErrorEquals" : ["CustomErrorA"],
                    "MaxAttempts": 5
                  }
                 ],
                "Catch": [
                  {
                    "ErrorEquals": [ "States.ALL" ],
                    "Next": "FailureNotifier"
                  }
                ]
              },
              "FailureNotifier" : {
                "Type" : "Task",
                "Resource": "${FailureNotifierLambdaArn}",
                "End" : true,
                "Retry" : [
                  {
                    "ErrorEquals" : ["States.TaskTimeout"],
                    "MaxAttempts": 5,
                    "IntervalSeconds": 1
                  },
                  {
                    "ErrorEquals" : ["CustomErrorA"],
                    "MaxAttempts": 5
                  }
                ]
              }
            }
          }
        -  WorkflowStateChangeLambdaArn:
              Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]
        -  FailureNotifierLambdaArn:
              Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]

Ошибка - Ошибка шаблона: одна или несколько встроенных функций Fn :: Sub не задают ожидаемые аргументы.Укажите строку в качестве первого аргумента и необязательный второй аргумент для указания сопоставления значений для замены в строке

Это всего лишь пример с тем же лямбда-выражением, которое используется несколько раз, но проблема заключается в передаче списка / сопоставления сFn :: Sub.

Может ли кто-нибудь помочь мне решить эту проблему или предложить альтернативное решение для достижения той же цели?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Попробуйте:

- { WorkflowStateChangeLambdaArn: {Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]}, FailureNotifierLambdaArn: {Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]} }

Вместо:

-  WorkflowStateChangeLambdaArn:
    Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]
-  FailureNotifierLambdaArn:
    Fn::GetAtt: [ CreateContractFromQuestionnaireFunction, Arn ]
0 голосов
/ 20 ноября 2018

Fn :: Sub принимает либо одну строку в качестве параметра, либо список.При использовании метода списка в списке должно быть только два элемента.Первый элемент - это строка (шаблон), а второй - карта.

Из документации Fn :: Sub

Fn::Sub:
  - String
  - { Var1Name: Var1Value, Var2Name: Var2Value }

Примечание: поскольку вы просто используете Fn :: GetАтрибут для построения значения подстановки вы можете просто использовать ${CreateContractFromQuestionnaireFunction.Arn} и использовать одностроковую версию Fn::Sub.

Например (для ясности я сократил пошаговую функцию.

   Fn::Sub:|-
      {
        "Comment" : "Sample draft process",
        "StartAt" : "AdvanceWorkflowToDraftInProgress",
        "States" : {
          "AdvanceWorkflowToDraftInProgress" : {
            "Type" : "Task",
            "Resource": "${CreateContractFromQuestionnaireFunction.Arn}",
            "InputPath":"$.contractId",
            "OutputPath":"$",
            "ResultPath":null,
            "Next" : "CheckQuestionnaireType",
            "Retry" : [
      ...
...