Setting up managed federation
This article describes how to set up Apollo Studio for a graph that uses Apollo Federation.
As with all changes, you should first set up managed federation in a non-production environment, such as staging. To support this, you can use variants, which are distinct versions of the same graph for different environments.
1. Get started
If you haven't yet, complete the first two steps from the Apollo Studio getting started guide:
In the Register your schema step, make sure you follow the instructions for a GraphQL server that uses Apollo Federation.
2. Register all subgraph schemas
In a federated architecture, each of your graph's subgraphs uses the Rover CLI to register its schema with Apollo:
If you haven't yet:
- Install the Rover CLI.
- Authenticate Rover with Apollo Studio.
Then, do the following for each of your subgraphs:
Obtain the following values, which are required for the
rover subgraph publish
command:- The name that uniquely identifies the subgraph within your graph (e.g.,
products
). - The URL that your gateway will use to communicate with the subgraph (e.g.,
http://products-graphql.svc.cluster.local:4001/
).
- The name that uniquely identifies the subgraph within your graph (e.g.,
Run the
rover subgraph publish
command, providing it your subgraph's schema in one of the ways shown:# Provide a local .graphql file pathrover subgraph publish my-graph@my-variant --name products --routing-url http://products-graphql.svc.cluster.local:4001/ --schema ./schema.graphql# Provide an introspection result via stdinrover subgraph introspect http://localhost:4000 | rover subgraph publish my-graph@my-variant --name products --routing-url http://products-graphql.svc.cluster.local:4001/ --schema -
As you register your subgraph schemas, the schema registry attempts to compose their latest versions into a single supergraph schema. Whenever composition succeeds, your gateway can fetch the latest supergraph schema from the registry.
You can also manually fetch your latest supergraph schema with the rover supergraph fetch
command, or retrieve it from your graph's Schema > SDL tab in Apollo Studio.
3. Modify the gateway (if necessary)
This section assumes you are using Apollo Server with the @apollo/gateway
library as your gateway.
If you've already set up Apollo Federation without Apollo Studio, the constructor of your ApolloGateway
instance probably includes a supergraphSdl
option, like this:
const gateway = new ApolloGateway({supergraphSdl});
This option is specific to non-managed federation, in which supergraph schema composition is performed via the Rover CLI.
With managed federation, composition is instead performed by Apollo, and the gateway regularly polls Apollo for an updated schema. This enables you to add, remove, and modify your subgraphs without needing to restart your gateway.
Remove the supergraphSdl
argument from your ApolloGateway
constructor entirely:
const gateway = new ApolloGateway();
4. Connect the gateway to Studio
Like your subgraphs, your gateway uses a graph API key to identify itself to Studio.
After obtaining your graph API key, you set two environment variables in your gateway's environment. If you're using a .env
file with a library like dotenv
, those environment variables look like this:
APOLLO_KEY=<YOUR_GRAPH_API_KEY>APOLLO_GRAPH_REF=<YOUR_GRAPH_ID>@<VARIANT>
You can also set this value directly in the command you use to start your gateway.
The APOLLO_GRAPH_REF
environment variable tells the gateway which variant of which graph to use (for example, my-graph-id@production
). You can find your variant's graph ref at the very top of its README page in Studio.
When running your gateway in an environment where outbound traffic to the internet is restricted, consult the directions for configuring a proxy within Apollo Server.
5. Deploy the modified gateway
You can now deploy your modified gateway to begin fetching your federated schema from Studio instead of directly from your subgraphs.
On startup, your gateway will use its API key to fetch its federation config from Apollo. It can then begin executing operations across your subgraphs.