/
integ.appsync-lambda.ts
86 lines (71 loc) · 3.1 KB
/
integ.appsync-lambda.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/// !cdk-integ *
import * as path from 'path';
import * as lambda from '@aws-cdk/aws-lambda';
import * as cdk from '@aws-cdk/core';
import * as appsync from '../lib';
/*
* Creates an Appsync GraphQL API and schema in a code-first approach.
*
* Stack verification steps:
* Deploy stack, get api key and endpoinScalarType. Check if schema connects to data source.
*
* -- bash verify.integ.appsync-lambda.sh --start -- start --
* -- aws appsync list-graphql-apis -- obtain apiId & endpoint --
* -- aws appsync list-api-keys --api-id [apiId] -- obtain api key --
* -- bash verify.integ.appsync-lambda.sh --check [apiKey] [url] -- check if success --
* -- bash verify.integ.appsync-lambda.sh --clean -- clean --
*/
const app = new cdk.App();
const stack = new cdk.Stack(app, 'stack');
const api = new appsync.GraphqlApi(stack, 'LambdaAPI', {
name: 'LambdaAPI',
schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'appsync.lambda.graphql')),
});
const func = new lambda.Function(stack, 'func', {
code: lambda.Code.fromAsset(path.join(__dirname, 'verify/lambda-tutorial')),
handler: 'lambda-tutorial.handler',
runtime: lambda.Runtime.NODEJS_14_X,
});
const lambdaDS = api.addLambdaDataSource('LambdaDS', func);
const requestPayload = (field: string, { withArgs = false, withSource = false }) => {
const _field = `"field": "${field}"`;
const _args = '"arguments": $utils.toJson($context.arguments)';
const _source = '"source": $utils.toJson($context.source)';
const _payload = [_field];
if (withArgs) _payload.push(_args);
if (withSource) _payload.push(_source);
return _payload.reduce((acc, v) => `${acc} ${v},`, '{').slice(0, -1) + '}';
};
const responseMappingTemplate = appsync.MappingTemplate.lambdaResult();
lambdaDS.createResolver('QueryGetPost', {
typeName: 'Query',
fieldName: 'getPost',
requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(requestPayload('getPost', { withArgs: true })),
responseMappingTemplate,
});
lambdaDS.createResolver('QueryAllPosts', {
typeName: 'Query',
fieldName: 'allPosts',
requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(requestPayload('allPosts', {})),
responseMappingTemplate,
});
lambdaDS.createResolver('MutationAddPost', {
typeName: 'Mutation',
fieldName: 'addPost',
requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(requestPayload('addPost', { withArgs: true })),
responseMappingTemplate,
});
lambdaDS.createResolver('PostRelatedPosts', {
typeName: 'Post',
fieldName: 'relatedPosts',
requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(requestPayload('relatedPosts', { withSource: true }), 'BatchInvoke'),
responseMappingTemplate,
});
lambdaDS.createResolver('PostRelatedPostsMaxBatchSize', {
typeName: 'Post',
fieldName: 'relatedPostsMaxBatchSize',
requestMappingTemplate: appsync.MappingTemplate.lambdaRequest(requestPayload('relatedPostsMaxBatchSize', { withSource: true }), 'BatchInvoke'),
responseMappingTemplate,
maxBatchSize: 2,
});
app.synth();