Проблема формирования облака ступенчатой ​​функции с помощью Fn::Sub при передаче списка в качестве второго параметра

Я пытаюсь создать ступенчатую функцию, используя формирование облака. Я хочу передать лямбда-арнс в качестве второго аргумента функции Fn::Sub. Это работает, если я передаю только один Arn, но терпит неудачу, когда я передаю несколько. (с помощью 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.

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

Спасибо,


person sujith    schedule 20.11.2018    source источник


Ответы (1)


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" : [
      ...
person cementblocks    schedule 20.11.2018
comment
Я попытался сослаться на них напрямую, используя $, и это сработало. Я получаю ту же ошибку, когда полностью удаляю второй аргумент. Сейчас я передаю фиктивный второй аргумент, но разве он не должен быть необязательным? - person sujith; 21.11.2018