![]() * import jest * remove mocha, chai, sinon * fix JSON parsing for package.json * replace import mocha, chai, sinon with jest * add jest as test npm script * remove dependency on mocha types * errors: remove unused jest tests * move tests to __tests__ folders * add jest types to root tsconfig * fix tsconfig include excludes * .to.equal -> toEqual * .true -> .toBe(true) * .to.deep.equal -> .toEqual * .to.exist -> .toBeDefined() * .to.contain -> .toMatch * .to.match -> .toMatch * to.be.undefined -> .toBeUndefined() * not.toBeDefined -> .toBeUndefined * bring integration test up to date with past changes * remove message from expect * .null -> .toBe(null) * expect.fail -> done.fail * callsFake -> jest.fn * mocha mock calls -> jest * .not.to.exist -> .toBeUndefined() * callCount -> mocks.calls.length * returns -> jest.fn() * .equals -> .toEqual * fix relative imports * remove string in expects and place as comment * remove Fibers from runQuery * restore -> mockRestore * before -> beforeAll * after -> afterAll * fix async_hooks test and Promise await * remove jest from testsuite package json * remove unnecessary apollo-server-env setup * add start of cloudflare tests * this.timeout -> timeout argument * express: fix relative require * import gql tag properly * .to.throw -> .toThrow * .to.be.instanceof -> .toBeInstanceOf * remove console log check test * done(Error) -> done.fail(Error) * done -> done.fail * change port numbers, since jest runs in parallel * fix toBeUndefined for null checks * make engine port unique in testsuite * make data source rest endpoint port unique * add coverage scripts * travis npm script -> cricle script * make engine port random * change ports to not conflict across integrations * increase node version for apollo-server-hapi * add node versioning to prevent hapi tests from running * move jest dependencies to the root package.json * make hapi port unique * fix port reference in hapi tests |
||
---|---|---|
.. | ||
src | ||
.npmignore | ||
package.json | ||
README.md | ||
tsconfig.json |
title | description |
---|---|
Lambda | Setting up Apollo Server with AWS Lambda |
This is the AWS Lambda integration of GraphQL Server. Apollo Server is a community-maintained open-source GraphQL server that works with many Node.js HTTP server frameworks. Read the docs. Read the CHANGELOG.
npm install apollo-server-lambda@rc graphql
Deploying with AWS Serverless Application Model (SAM)
To deploy the AWS Lambda function we must create a Cloudformation Template and a S3 bucket to store the artifact (zip of source code) and template. We will use the AWS Command Line Interface.
1. Write the API handlers
In a file named graphql.js
, place the following code:
const { ApolloServer, gql } = require('apollo-server-lambda');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
});
exports.handler = server.createHandler();
2. Create an S3 bucket
The bucket name must be universally unique.
aws s3 mb s3://<bucket name>
3. Create the Template
This will look for a file called graphql.js with the export graphqlHandler
. It creates one API endpoints:
/graphql
(GET and POST)
In a file called template.yaml
:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
GraphQL:
Type: AWS::Serverless::Function
Properties:
Handler: graphql.handler
Runtime: nodejs8.10
Events:
AnyRequest:
Type: Api
Properties:
Path: /graphql
Method: ANY
4. Package source code and dependencies
This will read and transform the template, created in previous step. Package and upload the artifact to the S3 bucket and generate another template for the deployment.
aws cloudformation package \
--template-file template.yaml \
--output-template-file serverless-output.yaml \
--s3-bucket <bucket-name>
5. Deploy the API
The will create the Lambda Function and API Gateway for GraphQL. We use the stack-name prod
to mean production but any stack name can be used.
aws cloudformation deploy \
--template-file serverless-output.yaml \
--stack-name prod \
--capabilities CAPABILITY_IAM
Getting request info
To read information about the current request from the API Gateway event (HTTP headers, HTTP method, body, path, ...) or the current Lambda Context (Function Name, Function Version, awsRequestId, time remaining, ...) use the options function. This way they can be passed to your schema resolvers using the context option.
const { ApolloServer, gql } = require('apollo-server-lambda');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ event, context }) => ({
headers: event.headers,
functionName: context.functionName,
event,
context,
}),
});
exports.handler = server.createHandler();
Modifying the Lambda Response (Enable CORS)
To enable CORS the response HTTP headers need to be modified. To accomplish this use the cors
option.
const { ApolloServer, gql } = require('apollo-server-lambda');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
});
exports.handler = server.createHandler({
cors: {
origin: '*',
credentials: true,
},
});
To enable CORS response for requests with credentials (cookies, http authentication) the allow origin header must equal the request origin and the allow credential header must be set to true.
const { ApolloServer, gql } = require('apollo-server-lambda');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
});
exports.handler = server.createHandler({
cors: {
origin: true,
credentials: true,
},
});
Cors Options
The options correspond to the express cors configuration with the following fields(all are optional):
origin
: boolean | string | string[]methods
: string | string[]allowedHeaders
: string | string[]exposedHeaders
: string | string[]credentials
: booleanmaxAge
: number
Principles
GraphQL Server is built with the following principles in mind:
- By the community, for the community: GraphQL Server's development is driven by the needs of developers
- Simplicity: by keeping things simple, GraphQL Server is easier to use, easier to contribute to, and more secure
- Performance: GraphQL Server is well-tested and production-ready - no modifications needed
Anyone is welcome to contribute to GraphQL Server, just read CONTRIBUTING.md, take a look at the roadmap and make your first PR!