Назад | Перейти на главную страницу

Внутренняя функция Cloudformation Fn :: Sub mapping

Я не понимаю почему Fn::Sub в этом шаблоне не работает. Я получаю следующую ошибку:

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

Resources:
  LambdaSubmitJob:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: index.lambda_handler
      Runtime: python2.7
      Timeout: 10
      Code:
        ZipFile: |
          import json
          import boto3
  LambdaJobStatusPoll:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: index.lambda_handler
      Runtime: python2.7
      Timeout: 10
      Code:
        ZipFile: |
          import json
          import boto3
  MyStepF:
    Type: 'AWS::StepFunctions::StateMachine'
    Properties:
      DefinitionString: !Sub 
        - |-
          {
            "Comment": "A state machine that submits a Job to AWS Batch and monitors the Job until it completes.",
            "StartAt": "Submit Job",
            "States": {
              "Submit Job": {
                "Type": "Task",
                "Resource": "${Lambda1}",
                "ResultPath": "$.guid",
                "Next": "Wait 30 seconds"
              },
              {
                "Type": "Task",
                "Resource": "${Lambda2}",
                "ResultPath": "$.guid",
                "Next": "Wait 30 seconds"
              }
            }
          }
        - Lambda2: !GetAtt 
            - LambdaSubmitJob
            - Arn
        - Lambda1: !GetAtt 
            - LambdaJobStatusPoll
            - Arn

Но если у меня есть только одно отображение, то оно работает.

Resources:
  LambdaSubmitJob:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: index.lambda_handler
      Runtime: python2.7
      Timeout: 10
      Code:
        ZipFile: |
          import json
          import boto3
  LambdaJobStatusPoll:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: index.lambda_handler
      Runtime: python2.7
      Timeout: 10
      Code:
        ZipFile: |
          import json
          import boto3
  MyStepF:
    Type: 'AWS::StepFunctions::StateMachine'
    Properties:
      DefinitionString: !Sub 
        - |-
          {
            "Comment": "A state machine that submits a Job to AWS Batch and monitors the Job until it completes.",
            "StartAt": "Submit Job",
            "States": {
              "Submit Job": {
                "Type": "Task",
                "Resource": "${Lambda1}",
                "ResultPath": "$.guid",
                "Next": "Wait 30 seconds"
              }
        - Lambda1: !GetAtt 
            - LambdaJobStatusPoll
            - Arn

Я использую CloudFormation Designer для проверки этих двух примеров.

Вы даете Fn::Sub функция 3 аргумента:

  1. В Строка
  2. Составление карты для Lambda2
  3. Составление карты для Lambda1

Переместите оба сопоставления в один элемент списка, и он будет работать (я также использовал «точечную нотацию» для! GetAtt для простоты, но это необязательно).

  DefinitionString: !Sub 
    - |-
      {
         [...]
      }
    - Lambda2: !GetAtt LambdaSubmitJob.Arn
      Lambda1: !GetAtt LambdaJobStatusPoll.Arn

Надеюсь, это поможет :)