🏄 AWS CDK 101 — 🐲 GraphQL с использованием AppSync с dynamodb

🔰 Начинающие пользователи AWS CDK, пожалуйста, ознакомьтесь с моими предыдущими статьями в этом цикле.

Если вы пропустили предыдущую статью, найдите ее по ссылкам ниже.

🔁 Оригинальный предыдущий пост 🔗 Dev Post

🔁 Reposted the previous post at 🔗 dev to @aravindvcyber

В этой статье мы представим слой доступа к данным в качестве обертки поверх нашей таблицы dynamodb. Конкретно здесь мы выбрали graphql с использованием AWS appsync для выполнения основных элементов списка и получения элемента из dynamodb.

Построение 🏗️

Давайте начнем с создания нового файла lib/appsync-stack.ts для нашего нового стека.

Импорты, используемые в этом новом стеке ⛩️

Здесь мы импортировали следующие объекты, чтобы помочь нам в нашем определении

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';
Вход в полноэкранный режим Выйти из полноэкранного режима

Конструкция Appsync с определением ⛺

Создается новый стек, который используется для определения нашей конечной точки appsync, как показано ниже.

Здесь мы получим API-ключ по умолчанию со сроком действия 7 дней, чтобы мы могли периодически его менять. Кроме того, мы зарегистрировали наш API достаточно, чтобы лучше понимать фоновый процесс.


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))
              }
          }
      }
    })

  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Файл определения схемы 🎢

Вы также можете использовать консоль AWS для обновления схемы до того, как мы обновим ее в файлах активов CDK, когда будем знать наверняка.

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
}
Вход в полноэкранный режим Выход из полноэкранного режима

Подключение Dynamodb в качестве источника данных 🛶

Здесь мы напрямую интегрируем API dynamodb с graphql в качестве источника данных.

const messages = Table.fromTableName(this,'MessagesTableImport', 'MessagesTable');

const MessagesDS = AppSyncApi.addDynamoDbDataSource("MessagesDataSource", messages);
Войти в полноэкранный режим Выход из полноэкранного режима

Шаблон VTL Mapping 🛩️

Здесь нам нужно использовать VTL (Velocity Template Language) для преобразования/манипуляции нашего запроса и ответа, который мы отправляем/получаем от указанных ниже резолверов. Использование этого языка может быть хорошей стратегией, так как его можно использовать во многих местах, не только в appsync и API-шлюзе.

Вы также можете использовать консоль AWS для тестирования этих преобразований, используя образец полезной нагрузки из журналов, прежде чем мы обновим файлы активов CDK.

Получить преобразователь сообщений 🚠.

Здесь вы также можете посмотреть на трассировку xray, чтобы понять, когда эти блоки используются для резольвера getMessage.

MessagesDS.createResolver({
      typeName: 'Query',
      fieldName: 'getMessage',
      requestMappingTemplate: MappingTemplate.fromFile('assets/getMessageRequest.vtl'),
      responseMappingTemplate: MappingTemplate.fromFile('assets/getMessageResponse.vtl'),
})
Вход в полноэкранный режим Выход из полноэкранного режима

шаблон VTL getMessageRequest 🌟

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "messageId": $util.dynamodb.toDynamoDBJson($ctx.args.messageId),
        "createdAt": $util.dynamodb.toDynamoDBJson($ctx.args.createdAt)
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

getMessageResponse VTL шаблон ⛱️


#set($ctx.result.event = $util.parseJson($ctx.result.event))

$util.toJson($ctx.result)

Вход в полноэкранный режим Выход из полноэкранного режима

List messages resolver 🤡

Здесь вы также можете посмотреть на трассировку xray, чтобы понять, когда эти блоки используются для listMessages resolver

MessagesDS.createResolver({
        typeName: 'Query',
        fieldName: 'listMessages',
        requestMappingTemplate: MappingTemplate.fromFile('assets/listMessagesRequest.vtl'),
        responseMappingTemplate: MappingTemplate.fromFile('assets/listMessagesResponse.vtl'),
})
Вход в полноэкранный режим Выход из полноэкранного режима

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)),
}
Вход в полноэкранный режим Выход из полноэкранного режима

listMessagesResponse VTL шаблон 🎣

#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)
Вход в полноэкранный режим Выход из полноэкранного режима

Клиент для исследования graphQl ❄️

Запросы Appsync Explorer ♨️

В консоли AWS вы можете перейти к appsync и начать выполнять запросы. Одним из преимуществ здесь является то, что у нас есть облачные часы и журналы трассировки, которые легко доступны, если вдруг вы захотите проверить.

Запросы Apollo Studio 🏕️

Но обычно предпочитаю темный режим в apollo graphql studio, вы также можете попробовать его, если он вам нравится, возможно, когда-нибудь мы получим его и в консоли AWS.

Заключение 💫

В этом упражнении мы попробовали только операции get и list, чтобы сравнить эффективность операций сканирования и запроса.

Значение scannedCount в приведенных выше результатах показывает затраты, связанные с операцией list, по мере увеличения размера таблицы. Я убрал переменную фильтра, чтобы показать, какие записи были отсканированы, как показано ниже.

Мы будем дорабатывать этот метод в наших следующих статьях для достижения оптимальной скорости и использования ресурсов.

Мы будем добавлять больше соединений в наш стек и делать его более удобным для использования в следующих статьях, создавая новые конструкции, поэтому рассмотрите возможность следовать за мной и подписаться на мою рассылку.

⏭ У нас есть следующая статья по serverless, загляните на

https://dev.to/aravindvcyber/aws-cdk-101-graphql-mutations-using-appsync-with-dynamodb-9n0

🎉 Спасибо за поддержку! 🙏

Будет здорово, если вы захотите ☕ Купить мне кофе, чтобы помочь поддержать мои усилия 😍.

🔁 Оригинальный пост 🔗 Dev Post

🔁 Reposted at 🔗 dev to @aravindvcyber

🏄 AWS CDK 101 — 🐲 GraphQL using AppSync with dynamodb
{ by @Aravind_V7 }

Смотрите больше подобного на моей страницеhttps://t.co/CuYxnKr0Ighttps://t.co/phzOKFlXXO#aws #typescript #graphql #dynamodb #awscdk https://t.co/yeqeLZQt8A

— Aravind V (@Aravind_V7) 30 мая 2022 г.

Оцените статью
Procodings.ru
Добавить комментарий