X

AWS CDK 101 – GraphQL utilisant AppSync avec dynamodb


🔰 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