AWS StateMachine для Lambda, синтаксис формирования облаков - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь найти шаблон CloudFormation, который включает

  • API Gateway
  • Вызывает StateMachine через API-шлюз
  • StateMachine, в свою очередь, содержитлямбда-функция

По сути, я пытаюсь сделать следующее:

https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-api-gateway.html

Однако я застрял в создании облакаШаблон формирования (.yaml), который развернет это.Пока это то, что у меня есть

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  Post:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: UserBase-fnUsers
      Handler: UsersHandler.getUsers
      Runtime: nodejs6.10
      Policies: [AmazonDynamoDBReadOnlyAccess, AmazonS3ReadOnlyAccess]
      Environment:
        Variables: 
          S3_BUCKET: UserBase-Users-bucket
          UsersTable: UserBase-Users-tblUsers
      Events:
        GetUsers:
          Type: Api
          Properties:
            Path: /UserBase/Users
            Method: post      
  Options:
    Type: AWS::Serverless::Function
    Properties:                     
      FunctionName: UserBase-fnUsers-Options
      Handler: UsersHandler.getOptions
      Runtime: nodejs6.10
      Events:
        GetOptions:
          Type: Api
          Properties:
            Path: /UserBase/Users
            Method: options                           
  UsersTable:
    Type: AWS::DynamoDB::Table
    Properties: 
      TableName: UserBase-Users-tblUsers
      AttributeDefinitions: 
        - AttributeName: Id
          AttributeType: S   
      KeySchema: 
        - AttributeName: Id
          KeyType: HASH   
      ProvisionedThroughput: 
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5       
      StreamSpecification:
        StreamViewType: KEYS_ONLY                
  StatesExecutionRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - !Sub states.${AWS::Region}.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: StatesExecutionPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "lambda:InvokeFunction"
                Resource: "*"

  UpdateShoppingPath:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      DefinitionString:
        !Sub
          - |-
            {
              "Comment": "State machine to update the shopping path",
              "StartAt": "UpdatePath",
              "States": {
                "UpdatePath": {
                  "Type": "Task",
                  "Resource": "${lambdaArn}",
                  "End": true
                }
              }
            }
          - {lambdaArn: !GetAtt [ Post, Arn ]}
      RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
  UserBaseUsers:
     Type: "AWS::ApiGateway::Resource"

Я застрял с последней частью, в основном о том, как связать ApiGateway с StateMachine.Кстати, есть ли у меня какой-либо способ создать шаблон формирования облака (.yaml или json) из существующего развертывания в AWS?

1 Ответ

0 голосов
/ 14 мая 2018

Я не эксперт по yaml, но я выполнил некоторые настройки с помощью json CloudFormation, и, насколько я понял, это довольно просто перевести.

В прошлом я застрял как ты, и здесь - это мой пост и мое решение

Что вам нужно сделать, чтобы запустить выполнение пошаговых функций, - это отправить HTTP-сообщение на arn:aws:apigateway:${region}:states:action/StartExecution, передав его как объект json [docs] :

{
input: __input__,
stateMachineArn: __arn__
}

Короче говоря, в вашем AWS::ApiGateway::Method вы должны установить HTTP-интеграцию на arn:aws:apigateway:${region}:states:action/StartExecution и requestTemplate, который создает упомянутый мной объект json.

Для справки, вот мой пример с облаком JSON:

"FooRequest": {
    "DependsOn": ["FooStepMachine"],
    "Type": "AWS::ApiGateway::Method",
    "Properties": {
        "HttpMethod": "POST",
        "Integration": {
            "Type": "AWS",
            "Credentials": {
                "Fn::GetAtt": ["FooRole",
                "Arn"]
            },
            "IntegrationHttpMethod": "POST",
            "Uri": {
                "Fn::Join": ["",
                ["arn:aws:apigateway:",
                {
                    "Ref": "AWS::Region"
                },
                ":states:action/StartExecution"]]
            },
            "IntegrationResponses": [{
                "StatusCode": 200
            },
            {
                "StatusCode": 401
            }],
            "RequestTemplates": {
                "application/json": {
                    "Fn::Sub": ["{\"input\": \"$util.escapeJavaScript($input.json('$'))\",\"stateMachineArn\": \"${arn}\"}",
                    {
                        "arn": {
                            "Ref": "FooStepMachine"
                        }
                    }]
                }
            }
        }
    }
}
...