John Mee
John Mee

Reputation: 52243

How to send a GraphQL query to AWS AppSync from the commandline?

The AWS CLI for AppSync has a lovely array of functions to manage it remotely from the command line of my workstation such that mostly I do not have to use the browser console.

But to do a query I have to go into the web browser console and find GraphQl queries under AppSync. I can change all manner of things via the CLI, but I can't find a command that simply issues a graphql query.

Have I missed it? Is it there?
I don't want to look at this screen anymore...

AWS AppSync Queries

Upvotes: 9

Views: 6610

Answers (5)

jcollum
jcollum

Reputation: 46579

If you need to use a Bearer token:

# gql.sh 
TOKEN=$1

API_URL='insert api url from AWS console here'
QUERY='your query here'
VARIABLES='{"id":"5"}' 

echo "vars:"
echo "TOKEN $TOKEN"
echo
echo "QUERY $QUERY"
echo
echo "VARIABLES $VARIABLES"
echo
echo "API_URL $API_URL"
echo

curl $API_URL \
-s -X POST \
-H "Authorization: Bearer $TOKEN" \
-H 'content-type: application/json' \
-d '{"query": "'"$QUERY"'", "variables": '$VARIABLES'}'

call with gql.sh [insert token here]

Upvotes: 0

leszek.hanusz
leszek.hanusz

Reputation: 5317

graphql-python/gql supports AWS AppSync since version 3.0.0rc0.

It supports queries, mutation and even subscriptions on the realtime endpoint.

It supports IAM, api key and JWT authentication methods.

And it has a gql-cli script which allows you to execute queries, mutations and subscriptions from the command line.

The documentation is available here

For queries and mutations, use the --transport appsync_http argument:

# Put the request in a file
$ echo 'mutation createMessage($message: String!) {
  createMessage(input: {message: $message}) {
    id
    message
    createdAt
  }
}' > mutation.graphql

# Execute the request using gql-cli with --transport appsync_http
$ cat mutation.graphql | gql-cli $AWS_GRAPHQL_API_ENDPOINT --transport appsync_http -V message:"Hello world!"

For subscriptions, use the --transport appsync_websockets argument:

echo "subscription{onCreateMessage{message}}" | gql-cli $AWS_GRAPHQL_API_ENDPOINT --transport appsync_websockets

Upvotes: 1

J. Pablo García
J. Pablo García

Reputation: 521

I do not know from the CLI but you can use Curl from windows/linux console.

It is described in AWS at API_KEY Authorization as:

curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

Just replace the 3 fields with the ones that you can find in your AWS account at the APPSYNC SERVICE:

  1. API_KEY
  2. APP END POINT
  3. Query

If you use windows, remember that it doesn't like single quotation marks, so try using just " and \" instead of ' for the query, for example:

  1. Ubuntu console:

     curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:**YOUR_API_KEY**" -d **'{ "query":"query { listTodos { items { title } } }" }'** https://**YOUR_END_POINT**.amazonaws.com/graphql
    
  2. Windows console (check query quotes):

     curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:**YOUR_API_KEY**" -d **"{ \\"query\\":\\"query { listTodos { items { title } } }\\" }"** https://**YOUR_END_POINT**.amazonaws.com/graphql
    

Upvotes: 0

Neil McGuigan
Neil McGuigan

Reputation: 48246

You can do it with Curl:

$ curl -H 'x-api-key: <API KEY>' -d '{"query":"query {...}"}' <API URL>

Upvotes: 1

dbala
dbala

Reputation: 366

The Appsync queries page is actually a conjunction of several things together. You cannot issue queries from the CLI according to (https://docs.aws.amazon.com/cli/latest/reference/appsync/index.html)

You can however use a GUI Client tool to send a POST to your Appsync endpoint. Like Postman or Insomnia (my personal favorite). However is your goal is to truly send GraphQL compliant queries through the CLI, then you will have to resort to 'curl's

Here is an example python script I have that sends a curl request to my Appsync API.

#!/usr/bin/env python3
import os

cmd = """curl -i -H 'Content-Type: application/json' -H "x-api-key: <ENTER YOUR API KEY FROM THE APPSYNC SETTINGS PAGE>" -H "Host: <ENTER YOUR HOST ENDPOINT FROM THE APPSYNC API SETTINGS PAGE >" -X POST -d '{"query": "query {listEvents {items {id}}}"}' https://<ENTER YOUR HOST ENDPOINT FROM THE APPSYNC API SETTINGS PAGE>/graphql"""

def doGraphqlRequest():    
    os.system(cmd)

print("Starting request to Appsync endpoint")
doGraphQLRequest()
print("Finsihed request to Appsync endpoint")

To explain a bit, you are making a POST request with your query to your appsync given '/graphql/ endpoint. You have 3 headers (Denoted by the -H flag)

  1. The x-api-key: Only applicable if you use API KEY as the auth type. Other auth types work too, you might have a AuthToken: Bearer , and Cognito works too but is significantly more complicated from CLI
  2. The host: This is the name of the ec2 host given by your api. You can find it by looking at your assigned endpoint and deleteing the https:// and /graphql
  3. The Content-Type: application/json. This is kinda standard, not super sure why but it's a must have.

Hope this helps!

Upvotes: 8

Related Questions