đ° DĂ©butants qui dĂ©couvrent AWS CDK, veuillez consulter mes articles prĂ©cĂ©dents un par un dans cette sĂ©rie.
Si au cas oĂč vous auriez manquĂ© mon article prĂ©cĂ©dent, retrouvez-le avec les liens ci-dessous.
đ Message prĂ©cĂ©dent original sur đ Dev Post
đ A republiĂ© le post prĂ©cĂ©dent Ă đ dev Ă @aravindvcyber
Dans cet article, nous allons introduire une couche dâaccĂšs aux donnĂ©es en tant que wrapper au-dessus de notre table dynamodb. Ici spĂ©cifiquement, nous avons choisi graphql en utilisant AWS appsync pour effectuer des Ă©lĂ©ments de liste de base et obtenir un Ă©lĂ©ment de dynamodb.
Chantier đ
Commençons par créer un nouveau fichier lib/appsync-stack.ts
pour notre nouvelle pile.
Imports utilisĂ©s dans cette nouvelle pile â©
Ici, nous avons importé les objets ci-dessous pour nous aider dans notre définition
import { Duration, Expiration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Table } from 'aws-cdk-lib/aws-dynamodb';
import { GraphqlApi, MappingTemplate, Schema, FieldLogLevel, AuthorizationType } from 'aws-lib-cdk/aws-appsync-alpha';
Construction Appsync avec dĂ©finition âșïž
Une nouvelle pile est créée qui est utilisée pour définir notre point de terminaison appsync comme indiqué ci-dessous.
Ici, nous obtiendrons une clĂ© API par dĂ©faut avec une expiration de 7 jours afin que nous puissions la faire pivoter pĂ©riodiquement. En plus de cela, nous avons suffisamment enregistrĂ© notre API pour mieux comprendre le processus dâarriĂšre-plan.
export class GqlStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const AppSyncApi = new GraphqlApi(this, 'gqlApi', {
name: 'gqlApi',
schema: Schema.fromAsset('assets/messages-schema.gql'),
xrayEnabled: true,
logConfig: {
excludeVerboseContent: false,
fieldLogLevel: FieldLogLevel.ALL,
},
authorizationConfig: {
defaultAuthorization: {
authorizationType: AuthorizationType.API_KEY,
apiKeyConfig: {
name: 'default-api-key',
description: 'default-api-key-description',
expires: Expiration.after(Duration.days(7))
}
}
}
})
}
}
Fichier de dĂ©finition de schĂ©ma đą
Vous pouvez Ă©galement utiliser la console AWS pour mettre Ă jour le schĂ©ma avant la mise Ă jour dans les fichiers dâactifs CDK lorsque nous en sommes sĂ»rs.
type Message {
message: AWSJSON!
}
type MessagesTable {
createdAt: AWSTimestamp!
messageId: String!
event: Message
}
type MessagesTableConnection {
items: [MessagesTable]
nextToken: String
scannedCount: Int
}
type Query {
getMessage(messageId: String!, createdAt: AWSTimestamp!): MessagesTable
listMessages(filter: TableMessagesTableFilterInput, limit: Int, nextToken: String): MessagesTableConnection
}
input TableAWSTimestampFilterInput {
ne: AWSTimestamp
eq: AWSTimestamp
le: AWSTimestamp
lt: AWSTimestamp
ge: AWSTimestamp
gt: AWSTimestamp
contains: AWSTimestamp
notContains: AWSTimestamp
between: [AWSTimestamp]
}
input TableMessagesTableFilterInput {
createdAt: TableAWSTimestampFilterInput
messageId: TableStringFilterInput
}
input TableStringFilterInput {
ne: String
eq: String
le: String
lt: String
ge: String
gt: String
contains: String
notContains: String
between: [String]
beginsWith: String
}
Connexion Dynamodb comme source de donnĂ©es đ¶
Ici, nous intĂ©grons directement lâAPI dynamodb avec graphql comme source de donnĂ©es
const messages = Table.fromTableName(this,'MessagesTableImport', 'MessagesTable');
const MessagesDS = AppSyncApi.addDynamoDbDataSource("MessagesDataSource", messages);
ModĂšle de mappage VTL đ©
Ici, nous devons utiliser VTL (Velocity Template Language) pour transformer/manipuler notre demande et la rĂ©ponse que nous envoyons/recevons des rĂ©solveurs ci-dessous. Lâutiliser peut ĂȘtre une bonne stratĂ©gie car cela peut ĂȘtre utilisĂ© dans de nombreux endroits, pas seulement dans appsync et la passerelle API.
Vous pouvez Ă©galement utiliser la console AWS pour tester ces transformations Ă lâaide de lâexemple de charge utile des journaux avant la mise Ă jour dans les fichiers dâactifs CDK.
Obtenez le rĂ©solveur de message đ
Ici, vous pouvez également consulter le traçage aux rayons X pour comprendre quand ces blocs sont utilisés pour getMessage
résolveur
MessagesDS.createResolver({
typeName: 'Query',
fieldName: 'getMessage',
requestMappingTemplate: MappingTemplate.fromFile('assets/getMessageRequest.vtl'),
responseMappingTemplate: MappingTemplate.fromFile('assets/getMessageResponse.vtl'),
})
modĂšle VTL getMessageRequest đ
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"messageId": $util.dynamodb.toDynamoDBJson($ctx.args.messageId),
"createdAt": $util.dynamodb.toDynamoDBJson($ctx.args.createdAt)
}
}
ModĂšle VTL getMessageResponse â±
#set($ctx.result.event = $util.parseJson($ctx.result.event))
$util.toJson($ctx.result)
RĂ©solveur de messages de liste đ€Ą
Ici, vous pouvez également consulter le traçage aux rayons X pour comprendre quand ces blocs sont utilisés pour listMessages
résolveur
MessagesDS.createResolver({
typeName: 'Query',
fieldName: 'listMessages',
requestMappingTemplate: MappingTemplate.fromFile('assets/listMessagesRequest.vtl'),
responseMappingTemplate: MappingTemplate.fromFile('assets/listMessagesResponse.vtl'),
})
modĂšle listMessagesRequest VTL đ
{
"version": "2017-02-28",
"operation": "Scan",
"filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
"limit": $util.defaultIfNull($ctx.args.limit, 20),
"nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
}
ModĂšle VTL listMessagesResponse đŁ
#set($children = [])
#foreach($item in $ctx.result.items)
#set($item.event = $util.parseJson($item.event))
$util.qr($children.add($item))
#end
#set($ctx.result.items = $children)
$util.toJson($ctx.result)
Client pour explorer graphQl âïž
RequĂȘtes Appsync Explorer âšïž
Dans la console AWS, vous pouvez naviguer dans lâappsync et commencer Ă interroger. Lâun des avantages que vous avez ici est que nous avons des journaux de surveillance et de suivi du cloud facilement disponibles si vous souhaitez vĂ©rifier.
RequĂȘtes Apollo Studio đ
Mais prĂ©fĂ©rez normalement le mode sombre dans apollo graphql studio, vous pouvez Ă©galement lâessayer si vous prĂ©fĂ©rez cela, peut-ĂȘtre que nous obtiendrions cela dans la console AWS Ă©galement un jour.
Conclusion đ«
Dans cet exercice, nous avons essayĂ© uniquement les opĂ©rations get et list pour diffĂ©rencier lâefficacitĂ© de lâopĂ©ration scan et query.
scannedCount
La valeur dans les rĂ©sultats ci-dessus montre le coĂ»t associĂ© Ă lâopĂ©ration de liste Ă mesure que la table sâagrandit. Jâai supprimĂ© la variable de filtre pour vous montrer quels sont les enregistrements numĂ©risĂ©s, comme indiquĂ© ci-dessous.
Nous affinerons cela dans nos prochains articles pour atteindre une vitesse et une utilisation des ressources optimales.
Nous ajouterons plus de connexions à notre pile et la rendrons plus utilisable dans les prochains articles en créant de nouvelles constructions, alors pensez à suivre et à vous abonner à ma newsletter.
â Nous avons notre prochain article en serverless, consultez
đ Merci pour votre soutien ! đ
Ce serait formidable si vous aimez â Achetez-moi un cafĂ©, pour aider Ă stimuler mes efforts đ.
đ Message original sur đ Dev Post
đ RepubliĂ© Ă đ dev Ă @aravindvcyber
đ AWS CDK 101 â đČ GraphQL utilisant AppSync avec dynamodb
{ par @Aravind_V7 }Commander plus tel dans ma pagehttps://t.co/CuYxnKr0Ighttps://t.co/phzOKFlXXO#aws #manuscrit #graphql #dynamodb #awscdk https://t.co/yeqeLZQt8A
â Aravind V (@Aravind_V7) 30 mai 2022