Wrapper for routing AppSync resolvers with AWS Lambda using Go.
$ > go get github.com/sbstjn/appsync-router
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)
}
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.
Feel free to use the code, it's released using the MIT license.
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.