'use strict';
const REGION = process.env.REGION
const APPLICATIONS_TABLE_NAME = process.env.APPLICATIONS_TABLE_NAME
const APPLICATION_PROCESSING_STEP_FUNCTION_ARN = process.env.APPLICATION_PROCESSING_STEP_FUNCTION_ARN
const AWS = require('aws-sdk')
AWS.config.update({region: REGION});
const dynamo = new AWS.DynamoDB.DocumentClient();
const stepfunctions = new AWS.StepFunctions();
const AccountApplications = require('./AccountApplications')(APPLICATIONS_TABLE_NAME, dynamo)
const submitNewAccountApplication = async (data) => {
const { name, address } = data
const application = await AccountApplications.create({ name, address, state: 'SUBMITTED' })
return application
}
const startStateMachineExecution = (application) => {
const params = {
"input": JSON.stringify({ application }),
"name": `ApplicationID-${application.id}`,
"stateMachineArn": APPLICATION_PROCESSING_STEP_FUNCTION_ARN
}
return stepfunctions.startExecution(params).promise()
}
module.exports.handler = async(event) => {
let application
try {
application = await submitNewAccountApplication(event)
await startStateMachineExecution(application)
return application
} catch (ex) {
if (application !== undefined) {
await AccountApplications.delete(application.id)
}
console.error(ex)
console.info('event', JSON.stringify(event))
throw ex
}
}
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: Template for step-functions-workshop
Resources:
ApplicationProcessingStateMachine:
Type: AWS::Serverless::StateMachine
Properties:
DefinitionUri: statemachine/account-application-workflow.asl.json
DefinitionSubstitutions:
DataCheckingFunctionArn: !GetAtt DataCheckingFunction.Arn
Policies:
- LambdaInvokePolicy:
FunctionName: !Ref DataCheckingFunction
ApproveApplicationFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-ApproveApplication
CodeUri: functions/account-applications/
Handler: approve.handler
Runtime: nodejs12.x
Environment:
Variables:
APPLICATIONS_TABLE_NAME: !Ref ApplicationsTable
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ApplicationsTable
DataCheckingFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-DataChecking
CodeUri: functions/data-checking/
Handler: data-checking.handler
Runtime: nodejs12.x
FindApplicationsFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-FindApplications
CodeUri: functions/account-applications/
Handler: find.handler
Runtime: nodejs12.x
Environment:
Variables:
APPLICATIONS_TABLE_NAME: !Ref ApplicationsTable
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ApplicationsTable
FlagApplicationFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-FlagApplication
CodeUri: functions/account-applications/
Handler: flag.handler
Runtime: nodejs12.x
Environment:
Variables:
APPLICATIONS_TABLE_NAME: !Ref ApplicationsTable
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ApplicationsTable
RejectApplicationFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-RejectApplication
CodeUri: functions/account-applications/
Handler: reject.handler
Runtime: nodejs12.x
Environment:
Variables:
APPLICATIONS_TABLE_NAME: !Ref ApplicationsTable
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ApplicationsTable
SubmitApplicationFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: sfn-workshop-SubmitApplication
CodeUri: functions/account-applications/
Handler: submit.handler
Runtime: nodejs12.x
Environment:
Variables:
APPLICATIONS_TABLE_NAME: !Ref ApplicationsTable
APPLICATION_PROCESSING_STEP_FUNCTION_ARN: !Ref ApplicationProcessingStateMachine
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ApplicationsTable
- StepFunctionsExecutionPolicy:
StateMachineName: !GetAtt ApplicationProcessingStateMachine.Name
ApplicationsTable:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: !Sub StepFunctionWorkshop-AccountApplications-${AWS::StackName}
AttributeDefinitions:
-
AttributeName: id
AttributeType: S
-
AttributeName: state
AttributeType: S
KeySchema:
-
AttributeName: id
KeyType: HASH
BillingMode: PAY_PER_REQUEST
GlobalSecondaryIndexes:
-
IndexName: state
KeySchema:
-
AttributeName: state
KeyType: HASH
Projection:
ProjectionType: ALL
Outputs:
SubmitApplicationFunctionArn:
Description: "Submit Application Function ARN"
Value: !GetAtt SubmitApplicationFunction.Arn
FlagApplicationFunctionArn:
Description: "Flag Application Function ARN"
Value: !GetAtt FlagApplicationFunction.Arn
FindApplicationsFunctionArn:
Description: "Find Applications Function ARN"
Value: !GetAtt FindApplicationsFunction.Arn
ApproveApplicationFunctionArn:
Description: "Approve Application Function ARN"
Value: !GetAtt ApproveApplicationFunction.Arn
RejectApplicationFunctionArn:
Description: "Reject Application Function ARN"
Value: !GetAtt RejectApplicationFunction.Arn
DataCheckingFunctionArn:
Description: "Data Checking Function ARN"
Value: !GetAtt DataCheckingFunction.Arn
sam build && sam deploy
Bây giờ chúng ta đã tích hợp dịch vụ Account Applications của mình với state machine , chúng ta sẽ kích hoạt tất cả các thực thi state machine trong tương lai bằng cách gửi các đăng ký mới đến dịch vụ (bằng cách gọi Lambda Function SubmitApplication ) thay vì thực thi trực tiếp thông qua giao diện web.