Yasunori Tanaka
Posted on December 9, 2020
As described in this document, GraphQL on AppSync can connect many data sources as business logic. For example, API Gateway, another AppSync, and Fargate via HTTP and lambda function.
I think, for a small project, the lambda function as a data source is useful for writing business logic.
We have two approaches to get data. A lambda function gets data from DynamoDB and GraphQL.
Create a lambda function
See also, https://docs.amplify.aws/guides/functions/dynamodb-from-js-lambda/q/platform/js.
$ amplify add function
Amplify function needs permission to read/write to DynamoDB and GraphQL
$ amplify update function
? Do you want to update the Lambda function permissions to access other resources in this project? Yes
? Select the category api, storage
Api category has a resource called amplifynuxt
? Select the operations you want to permit for amplifynuxt create, read, update, delete
Storage category has a resource called <Your DynamoDB table>:@model(appsync)
? Select the operations you want to permit for <Your DynamoDB table>:@model(appsync) create, read, update, delete
...
You can access the following resource attributes as environment variables from your Lambda function
API_<Your API name>_GRAPHQLAPIENDPOINTOUTPUT
API_<Your API name>_GRAPHQLAPIIDOUTPUT
API_<Your API name>_GRAPHQLAPIKEYOUTPUT
API_<Your API name>_PROPERTYTABLE_ARN
API_<Your API name>_PROPERTYTABLE_NAME
Add a query in schema.graphql
schema.graphql
type Query {
getData(msg: String): String @function(name: "<your lambda function name>-${env}")
}
Gets data from DynamoDB
In your index.js in amplify/backend/function/<your lambda function name>/src, change code like blow.
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
const params = {
TableName : 'your-table-name',
Item: {
id: '12345',
}
}
async function getItem(){
try {
await docClient.put(params).promise();
} catch (err) {
return err;
}
}
exports.handler = async (event) => {
try {
await getItem()
return { body: 'Successfully created item!' }
} catch (err) {
return { error: err }
}
};
Push code.
$ amplify push
Test the function.
gets data from GraphQL
$ npm install axios, graphql-tag, graphql
Update the index.js
/* Amplify Params - DO NOT EDIT
API_<Your API name>_GRAPHQLAPIENDPOINTOUTPUT
API_<Your API name>_GRAPHQLAPIIDOUTPUT
API_<Your API name>_GRAPHQLAPIKEYOUTPUT
API_<Your API name>_PROPERTYTABLE_ARN
API_<Your API name>_PROPERTYTABLE_NAME
ENV
REGION
Amplify Params - DO NOT EDIT */
const axios = require('axios');
const gql = require('graphql-tag');
const graphql = require('graphql');
const { print } = graphql;
const listPropertys = gql`
query listPropertys {
listPropertys {
items {
id
name
}
}
}
`
exports.handler = async (event) => {
try {
const graphqlData = await axios({
url: process.env.API_<Your API name>_GRAPHQLAPIENDPOINTOUTPUT,
method: 'post',
headers: {
'x-api-key': process.env.API_<Your API name>_GRAPHQLAPIKEYOUTPUT
},
data: {
query: print(listPropertys),
}
});
const body = {
graphqlData: graphqlData.data.data.listPropertys
}
return {
statusCode: 200,
body: JSON.stringify(body),
headers: {
"Access-Control-Allow-Origin": "*",
}
}
} catch (err) {
console.log('error posting to appsync: ', err);
}
}
Push code.
$ amplify push
Test the function.
Posted on December 9, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.