Skip to content

sbstjn/appsync-resolvers

Repository files navigation

AppSync Router

Build Status GitHub release MIT License GoDoc Go Report Card Coverage Status

Wrapper for routing AppSync resolvers with AWS Lambda using Go.

Usage

Installation

$ > go get github.com/sbstjn/appsync-router

Routing

import (
  "github.com/sbstjn/appsync-router"
)

func handleRouteA(req json.RawMessage) (interface{}, error) {
	return nil, errors.New("Nothing here in route A")
}

func handleRouteB(req json.RawMessage) (interface{}, error) {
	return nil, errors.New("Nothing here in route B")
}

var (
	r = router.New()
)

func init() {
	r.Add("fieldA", handleRouteA)
	r.Add("fieldB", handleRouteB)
}

func main() {
	lambda.Start(r.Serve)
}

AppSync Configuration

Routing is based on a field property in your RequestMappingTemplate, which can be configured using the AWS Console or CloudFormation as well.

  AppSyncDataSource:
    Type: AWS::AppSync::DataSource
    Properties:
      ApiId: !GetAtt [ AppSyncAPI, ApiId ]
      Name: resolver
      Type: AWS_LAMBDA
      LambdaConfig:
        LambdaFunctionArn: !GetAtt [ Lambda, Arn ]
      ServiceRoleArn: !GetAtt [ Role, Arn ]

  AppSyncResolverA:
    Type: AWS::AppSync::Resolver
    Properties:
      ApiId: !GetAtt [ AppSyncAPI, ApiId ]
      TypeName: Query
      FieldName: fieldA
      DataSourceName: !GetAtt [ AppSyncDataSource, Name ]
      RequestMappingTemplate: '{ "version" : "2017-02-28", "operation": "Invoke", "payload": { "field": "fieldA", "arguments": $utils.toJson($context.arguments) } }'
      ResponseMappingTemplate: $util.toJson($context.result)

  AppSyncResolverB:
    Type: AWS::AppSync::Resolver
    Properties:
      ApiId: !GetAtt [ AppSyncAPI, ApiId ]
      TypeName: Query
      FieldName: fieldB
      DataSourceName: !GetAtt [ AppSyncDataSource, Name ]
      RequestMappingTemplate: '{ "version" : "2017-02-28", "operation": "Invoke", "payload": { "field": "fieldB", "arguments": $utils.toJson($context.arguments) } }'
      ResponseMappingTemplate: $util.toJson($context.result)

See [appsync-router-example] for a full working example how to use appsync-router and [Amazon Serverless Application Model] to deploy a GraphQL API using AppSync.

License

Feel free to use the code, it's released using the MIT license.

Contribution

You are welcome to contribute to this project! 😘

To make sure you have a pleasant experience, please read the code of conduct. It outlines core values and beliefs and will make working together a happier experience.