AppSync Router

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"
)
type ParamsRouteA struct {
Foo string `json:"foo"`
}
type ParamsRouteB struct {
Bar string `json:"bar"`
}
func handleRouteA(args ParamsRouteA) (interface{}, error) {
return nil, fmt.Errorf("Nothing here in route A: %s", args.Foo)
}
func handleRouteB(args ParamsRouteB) (interface{}, error) {
return nil, fmt.Errorf("Nothing here in route B: %s", args.Bar)
}
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.