Ошибка AWS::Appsync:Resolver Cloudformation с использованием Javascript Resolver в блоке кода в YML с использованием Serverless Framework

У меня возникла проблема при создании AWS::Appsync:Resolver Cloudformation в Serverless Framework с использованием преобразователя Javascript.

Мой Javascript Resolver код в корневом каталоге /src/resolvers/jsResolver.js, который я прикрепил к AWS::AppSync::Resolver cloudformation в блоке кода. Я также установил плагин npm для утилит appsync в свой package.json.

import { util } from '@aws-appsync/utils';

 export function request(ctx) {
    const {source, args} = ctx
    return {
    operation: 'Invoke',
    payload: { field: ctx, arguments: args, source },
  };
}

export function response(ctx) {
    util.error("Failed to fetch relatedPosts", "LambdaFailure", ctx.prev.result)
    return ctx.result;
  }

Моя AWS::AppSync::Resolver Cloudformation приведена ниже в файле YML, также я использовал код как обязательный, если я объявил его как APPSYNC_JS Runtime.

AppSyncJsResolver:
  Type: AWS::AppSync::Resolver 
  Properties:
    ApiId: !GettAtt Graphql.APiId
    Kind: PIPELINE
    Code: ./src/resolvers/jsResolver.js <—- Here my code is breaking up with error contains one or more error
    TypeName: Query
    FieldName: getInfo
    Runtime:
      Name: APPSYNC_JS
      RuntimeVersion: 1.0.0
    PipelineConfig:
      Functions:
        - !GetAtt AppSyncFunction.FunctionId 

Я попробовал приведенный выше код в соответствии с доступной документацией AWS Cloudformation для Appsync, где они упомянули об этом в AWS::AppSync::Resolver для создания Javascript Resolver с использованием Cloudformation, как показано ниже одного из свойств. который я включил в свой AWS::AppSync::Resolver

Code  
  The resolver code that contains the request and response functions. When code is 
  used, the runtime is required. The runtime value must be APPSYNC_JS.

Required: No

Type: String

Required: No

Type: String

Итак, я пробовал это и не могу найти достаточно решений, касающихся Javascript Resolvers, все они доступны с конкретным шаблоном VTL.

С приведенным выше кодом моя сборка CloudFormation не удалась со следующей ошибкой: Произошла ошибка: AppSyncJSResolver- Код содержит одну или несколько ошибок. (Сервис: AWSAppSync; код состояния: 400; код ошибки: BadRequestException; идентификатор запроса: 0245d64d-...; прокси-сервер: null)

  • AppSyncJSResolver — мой AWS::AppSync::Resolver в приведенном выше коде. и у меня есть свойство кода в том, что дает мне ошибку. Я проверил несколько источников и не нашел ошибок в моем файле Javascript Resolvers /src/resolvers/jsResolver.js, который я объявил в AppSyncJSResolver AWS::AppSync::Resolver в свойстве кода, я не уверен, почему я получаю эту ошибку, любая помощь была бы отличной.

Вам не нужно никуда устанавливать утилиты. Он уже доступен в среде.

Graham Hesketh 13.02.2023 01:21

Возможно, если вы хотите, чтобы ваш код читался из файла, вы должны использовать параметр CodeS3Location вместо параметра Code, который будет рассматривать его как актив. Я думаю, что параметр Code ожидает встроенный код. Вы также можете попробовать встроить код, так как он короткий. Я развертываю из cdk и вижу, что он использует параметр CodeS3Location в выходных данных CloudFormation, поскольку мой код читается из файла.

Graham Hesketh 13.02.2023 01:39

Значение CodeS3Location будет выглядеть так: s3://my-bucket-name/my-filename.js Имя сегмента, вероятно, представляет собой какой-то сегмент, который SAM использует для ресурсов развертывания.

Graham Hesketh 13.02.2023 01:46

Привет, Грэм, спасибо за ваш ответ, но не думаете ли вы, что если мы будем использовать корзину S3 для этого, это будет дорого, поэтому каждый раз, когда наш appsync делает вызов, он также будет использовать ресурсы в S3, что означает наш код распознавателя, поэтому он не сделает это немного дорого. А также использовать хранилище в корзине S3.

Cloudformation 13.02.2023 15:46

Свойство Code в распознавателе Appsync ожидает строку или объект JSON, представляющий код, а не расположение файла кода. Вы можете включить его как строку в параметр Code. Или, как @GrahamHesketh предложил использовать s3 для хранения файлов преобразователя и указать его в этом месте с помощью параметра CodeS3Location.

salt-pepper 13.02.2023 16:57

@Cloudformation код для функции не вызывается из S3, он хранится там только на этапе развертывания, после чего он копируется в функцию AppSync, где он вызывается, поэтому во время его фактического использования нет поиска S3. Вот как код развертывается из файлов в таких инструментах, как CDK или SAM, и эти файлы известны как активы.

Graham Hesketh 13.02.2023 20:22

Спасибо @GrahamHesketh и salt-pepper за ваш вклад в то, о чем я думал изначально, но спасибо за прояснение моих сомнений, я попробую с предложенными решениями. На данный момент я получаю ответ со встроенным кодом. Теперь я реализую это с помощью CodeS3Location. Еще один вопрос, как я буду писать тест-кейсы для тех файлов, которые будут в корзине S3. Вопрос довольно глупый, но я хочу знать его ход, так как у меня не будет этого js-файла распознавателя в моей структуре кода VS.

Cloudformation 13.02.2023 21:37

@GrahamHesketh также один дополнительный вопрос к вашему предыдущему ответу, если файл в S3 будет скопирован в функцию appsync, безопасно ли удалять файл в какой-то момент, скажем, после того, как мы развернем наш код, или нам нужно его сохранить. Пожалуйста, также посоветуйте, как я буду писать тестовые примеры для этих файлов преобразователя. Спасибо

Cloudformation 13.02.2023 21:42

Отказ от ответственности, я не работаю с SAM, поэтому он может отличаться, но я предполагаю, что он следует принципам, очень похожим на CDK. У вас есть локальный проект, в котором вы записываете файл и можете выполнить локальное тестирование перед развертыванием и/или развернуть проект в облачной среде песочницы для тестирования. Файл кода будет регулярно находиться в специальном сегменте, зарезервированном для облачных развертываний, и команда «sam deploy» отправит его туда от вашего имени. Вы не управляете файлом, развертываемым на S3. Затраты на его хранение там будут ничтожны.

Graham Hesketh 14.02.2023 13:11

Прочтите, как работают команды «sam package» и «sam deploy», обратите внимание, что «sam deploy» запустит «sam package» от вашего имени. docs.aws.amazon.com/serverless-application-model/latest/… docs.aws.amazon.com/serverless-application-model/latest/…

Graham Hesketh 14.02.2023 13:14

@GrahamHesketh Я не использую SAM для своего развертывания. Я использую Serverless Framework для локального развертывания кода в облаке. Я использовал cloudformation для преобразователя JavaScript, так как их плагин еще не поддерживает его. Таким образом, большинство файлов js/node для тестирования больше похоже на модульное тестирование, которое у меня есть локально на VS.

Cloudformation 14.02.2023 15:24

О, хорошо, подобные концепции должны сохраняться и в бессерверной среде. В конце концов, все они просто обертки для формирования облаков. Совет из раннего опыта: JS-окружение в функциях AppSync сильно отличается от того, что вы можете ожидать от узла, работающего на вашем компьютере. Они имеют ограниченную функциональность, поэтому стоит протестировать функции в развернутой песочнице и/или в консоли.

Graham Hesketh 14.02.2023 16:02

@GrahamHesketh: я ответил ответами, спасибо за ваши предложения. надеюсь, что это поможет другим.

Cloudformation 14.02.2023 18:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
13
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы ответить на мой собственный вопрос, как я решаю это двумя способами.

1. Мы можем написать весь код Resolver в YML Cloudformation в свойстве Code, как показано ниже. Убедитесь, что ваш код распознавателя находится внутри вашего свойства Code, и используйте «|» специальный символ (многострочный код) после свойства Code.

AppSyncJsResolver:
  Type: AWS::AppSync::Resolver 
  Properties:
    ApiId: !GettAtt Graphql.APiId
    Kind: PIPELINE
    Code: | 
         import { util } from '@aws-appsync/utils';
         export function request(ctx) {
         const {source, args} = ctx
         return {
         operation: 'Invoke',
         payload: { field: ctx, arguments: args, source },
        };
        }
        export function response(ctx) {
        util.error("Failed to fetch relatedPosts", "LambdaFailure",ctx.prev.result)
        return ctx.result;
        }
    TypeName: Query
    FieldName: getInfo
    Runtime:
      Name: APPSYNC_JS
      RuntimeVersion: 1.0.0
    PipelineConfig:
      Functions:
        - !GetAtt AppSyncFunction.FunctionId

2. Если вы хотите сохранить свою бизнес-логику вне YML-файла и сохранить ее отдельно, вы можете использовать свойство CodeS3Location в своем преобразователе javascript, как показано ниже.

сначала создайте ведро в S3 и сохраните файл распознавателя javascript с кодом распознавателя в ведре. убедитесь, что вы предоставили своему appsync достаточно разрешений IAM для доступа к корзине S3.

После вышеуказанного шага вы можете переписать YML Cloudformation, как показано ниже.

AppSyncJsResolver:
  Type: AWS::AppSync::Resolver 
  Properties:
    ApiId: !GettAtt Graphql.APiId
    Kind: PIPELINE
    CodeS3Location:s3://my-bucket-name/my-filename.js
    TypeName: Query
    FieldName: getInfo
    Runtime:
      Name: APPSYNC_JS
      RuntimeVersion: 1.0.0
    PipelineConfig:
      Functions:
        - !GetAtt AppSyncFunction.FunctionId

Надеюсь, что это поможет другим и даст больше информации о Javascript Resolver, чтобы другим было легче находить более сложные решения и получать как можно больше ресурсов о Javascript Resolver. Спасибо @Graham Hesketh за ваши предложения.

Другие вопросы по теме