У меня возникла проблема при создании 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)
AWS::AppSync::Resolver
в приведенном выше коде. и у меня есть свойство кода в том, что дает мне ошибку. Я проверил несколько источников и не нашел ошибок в моем файле Javascript Resolvers /src/resolvers/jsResolver.js, который я объявил в AppSyncJSResolver AWS::AppSync::Resolver
в свойстве кода, я не уверен, почему я получаю эту ошибку, любая помощь была бы отличной.Возможно, если вы хотите, чтобы ваш код читался из файла, вы должны использовать параметр CodeS3Location вместо параметра Code, который будет рассматривать его как актив. Я думаю, что параметр Code ожидает встроенный код. Вы также можете попробовать встроить код, так как он короткий. Я развертываю из cdk и вижу, что он использует параметр CodeS3Location в выходных данных CloudFormation, поскольку мой код читается из файла.
Значение CodeS3Location будет выглядеть так: s3://my-bucket-name/my-filename.js Имя сегмента, вероятно, представляет собой какой-то сегмент, который SAM использует для ресурсов развертывания.
Привет, Грэм, спасибо за ваш ответ, но не думаете ли вы, что если мы будем использовать корзину S3 для этого, это будет дорого, поэтому каждый раз, когда наш appsync делает вызов, он также будет использовать ресурсы в S3, что означает наш код распознавателя, поэтому он не сделает это немного дорого. А также использовать хранилище в корзине S3.
Свойство Code в распознавателе Appsync ожидает строку или объект JSON, представляющий код, а не расположение файла кода. Вы можете включить его как строку в параметр Code. Или, как @GrahamHesketh предложил использовать s3 для хранения файлов преобразователя и указать его в этом месте с помощью параметра CodeS3Location.
@Cloudformation код для функции не вызывается из S3, он хранится там только на этапе развертывания, после чего он копируется в функцию AppSync, где он вызывается, поэтому во время его фактического использования нет поиска S3. Вот как код развертывается из файлов в таких инструментах, как CDK или SAM, и эти файлы известны как активы.
Спасибо @GrahamHesketh и salt-pepper за ваш вклад в то, о чем я думал изначально, но спасибо за прояснение моих сомнений, я попробую с предложенными решениями. На данный момент я получаю ответ со встроенным кодом. Теперь я реализую это с помощью CodeS3Location. Еще один вопрос, как я буду писать тест-кейсы для тех файлов, которые будут в корзине S3. Вопрос довольно глупый, но я хочу знать его ход, так как у меня не будет этого js-файла распознавателя в моей структуре кода VS.
@GrahamHesketh также один дополнительный вопрос к вашему предыдущему ответу, если файл в S3 будет скопирован в функцию appsync, безопасно ли удалять файл в какой-то момент, скажем, после того, как мы развернем наш код, или нам нужно его сохранить. Пожалуйста, также посоветуйте, как я буду писать тестовые примеры для этих файлов преобразователя. Спасибо
Отказ от ответственности, я не работаю с SAM, поэтому он может отличаться, но я предполагаю, что он следует принципам, очень похожим на CDK. У вас есть локальный проект, в котором вы записываете файл и можете выполнить локальное тестирование перед развертыванием и/или развернуть проект в облачной среде песочницы для тестирования. Файл кода будет регулярно находиться в специальном сегменте, зарезервированном для облачных развертываний, и команда «sam deploy» отправит его туда от вашего имени. Вы не управляете файлом, развертываемым на S3. Затраты на его хранение там будут ничтожны.
Прочтите, как работают команды «sam package» и «sam deploy», обратите внимание, что «sam deploy» запустит «sam package» от вашего имени. docs.aws.amazon.com/serverless-application-model/latest/… docs.aws.amazon.com/serverless-application-model/latest/…
@GrahamHesketh Я не использую SAM для своего развертывания. Я использую Serverless Framework для локального развертывания кода в облаке. Я использовал cloudformation для преобразователя JavaScript, так как их плагин еще не поддерживает его. Таким образом, большинство файлов js/node для тестирования больше похоже на модульное тестирование, которое у меня есть локально на VS.
О, хорошо, подобные концепции должны сохраняться и в бессерверной среде. В конце концов, все они просто обертки для формирования облаков. Совет из раннего опыта: JS-окружение в функциях AppSync сильно отличается от того, что вы можете ожидать от узла, работающего на вашем компьютере. Они имеют ограниченную функциональность, поэтому стоит протестировать функции в развернутой песочнице и/или в консоли.
@GrahamHesketh: я ответил ответами, спасибо за ваши предложения. надеюсь, что это поможет другим.
Чтобы ответить на мой собственный вопрос, как я решаю это двумя способами.
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 за ваши предложения.
Вам не нужно никуда устанавливать утилиты. Он уже доступен в среде.