Использование динамических переменных в определении ступенчатых функций

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

например, вот как я определил свою функцию:

GeneralizeLabelRandom:
    Type: AWS::Lambda::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: !Sub ${AWS::StackName}-GeneralizeLabelRandom-${AWS::AccountId} 
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        S3Bucket: !Ref S3BucketName
        S3Key: GeneralizeLabelRandom.zip
      Runtime: nodejs16.x
      MemorySize: 3008
      Timeout: 30

и это часть моей конфигурации StepFunctions::StateMachine — Я хочу заменить имя статического ресурса и использовать !Ref GeneralizeLabelRandom

  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: MyStateMachine
      DefinitionString: |
        {
          "StartAt": "init",
          "States": {
            "init": {
              "Type": "Pass",
              "Next": "eventTypeSwitch"
            },
            "eventTypeSwitch": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.detail.reason",
                  "StringEquals": "PutObject",
                  "Next": "imageAnalysisCall"
                }]
            "Default": "eventTypeNotSupported"
            },
            "imageAnalysisCall": {
              "Type": "Task",
**              "Resource": "arn:aws:lambda:eu-central-1:696714140038:function:generalizeLabelRandom",
**              "ResultPath": "$.LambdaResult",
              "Next": "transformImageAnalysisData"
            },
...
...

Я пытался использовать !RED или !GetAtt в определении конечного автомата, но получил синтаксические ошибки.

Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите использовать свойства Definition и DefinitionSubstitution. Первый позволяет вам представить определение вашего конечного автомата, используя тот же синтаксис JSON или YAML, который вы используете для шаблона CloudFormation (нет необходимости создавать строки). Второй позволяет вам предоставлять внешние элементы (используя синтаксис ${subsitution_variable} в вашем определении и предоставляя значения времени развертывания для замены. Вот пример:

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  ApplicationRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Effect: Allow
            Principal: 
              Service: 
                - states.amazonaws.com
                - lambda.amazonaws.com
            Action: 
              - sts:AssumeRole
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess
        - arn:aws:iam::aws:policy/AWSLambda_FullAccess

  Function1:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          exports.handler = async (event) => {
            console.info(event);
            return event;
          };
      Handler: index.handler
      Runtime: nodejs18.x
      Role: !GetAtt ApplicationRole.Arn

  StateMachine1:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      Definition:
        StartAt: InvokeFunction
        States:
          InvokeFunction:
            Type: Task
            Resource: arn:aws:states:::lambda:invoke
            Parameters:
              FunctionName: ${function_name}
              Payload:
                input.$: $
            End: true
      DefinitionSubstitutions:
        function_name: !Ref Function1
      RoleArn: !GetAtt ApplicationRole.Arn
      StateMachineType: STANDARD

Вы также можете посмотреть использование SAM с пошаговыми функциями . Преобразования SAM могут быть полезны для упрощения ресурсов (например, AWS::Serverless::StateMachine против AWS::StepFunctions::StateMachine), и они не требуют использования SAM CLI. Но если вы используете SAM CLI, это упрощает экспорт определений конечного автомата в отдельные файлы JSON или YAML. Это, как правило, еще удобнее и избавляет вас от необходимости хранить все в шаблоне CloudFormation. Вот один простой пример, в котором используется этот подход.

Другие вопросы по теме