AWS::Serverless::GraphQLApi - AWS Serverless Application Model

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

AWS::Serverless::GraphQLApi

Utilice el tipo de recurso AWS::Serverless::GraphQLApi de AWS Serverless Application Model (AWS SAM) para crear y configurar una API AWS AppSync GraphQL para tu aplicación sin servidor.

Para obtener más información sobre AWS AppSync, consulta ¿Qué es AWS AppSync? en la Guía para desarrolladores de AWS AppSync.

Sintaxis

YAML

LogicalId: Type: AWS::Serverless::GraphQLApi Properties: ApiKeys: ApiKeys Auth: Auth Cache: AWS::AppSync::ApiCache DataSources: DataSource DomainName: AWS::AppSync::DomainName Functions: Function Logging: LogConfig Name: String Resolvers: Resolver SchemaInline: String SchemaUri: String Tags: - Tag XrayEnabled: Boolean

Propiedades

ApiKeys

Cree una clave única que se pueda utilizar para realizar operaciones en GraphQL que requieran una clave de API.

Tipo: ApiKeys

Obligatorio: no

Compatibilidad con CloudFormation: esta propiedad es exclusiva de AWS SAM y no tiene un equivalente CloudFormation.

Auth

Configure la autenticación para tu GraphQL API.

Tipo: Auth

Obligatorio: sí

Compatibilidad con CloudFormation: esta propiedad es exclusiva de AWS SAM y no tiene un equivalente CloudFormation.

Cache

La entrada de una operación CreateApiCache.

Tipo: AWS::AppSync::ApiCache

Obligatorio: no

CloudFormationcompatibilidad: esta propiedad se pasa directamente al recurso AWS::AppSync::ApiCache.

DataSources

Cree orígenes de datos para las funciones a las que conectarse. AWS AppSync de AWS SAM es compatible con Amazon AWS Lambda DynamoDB y las fuentes de datos.

Tipo: DataSource

Obligatorio: sí

Compatibilidad con CloudFormation: esta propiedad es exclusiva de AWS SAM y no tiene un equivalente CloudFormation.

DomainName

Es el nombre de dominio personalizado para la API GraphQL.

Tipo: AWS::AppSync::DomainName

Obligatorio: no

CloudFormationcompatibilidad: esta propiedad se pasa directamente al recurso AWS::AppSync::DomainName. AWS SAMgenera automáticamente el recurso AWS::AppSync::DomainNameApiAssociation.

Functions

Configure funciones en las API de GraphQL para realizar ciertas operaciones.

Tipo : Función

Obligatorio: sí

Compatibilidad con CloudFormation: esta propiedad es exclusiva de AWS SAM y no tiene un equivalente CloudFormation.

Logging

Configura el registro de Amazon CloudWatch para su API GraphQL.

Si no especificas esta propiedad, AWS SAM generará CloudWatchLogsRoleArn y establecerá los siguientes valores:

  • ExcludeVerboseContent: true

  • FieldLogLevel: ALL

Para excluirse del registro, especifica lo siguiente:

Logging: false

Type: LogConfig

Obligatorio: no

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad LogConfig de un recurso AWS::AppSync::GraphQLApi.

LogicalId

El nombre exclusivo de la API GraphQL de.

Tipo: cadena

Obligatorio: sí

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad Name de un recurso AWS::AppSync::GraphQLApi.

Name

El nombre de la API GraphQL. Especifica esta propiedad para anular el valor LogicalId.

Tipo: cadena

Obligatorio: no

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad Name de un recurso AWS::AppSync::GraphQLApi.

Resolvers

Configure los solucionadores para los campos de la API GraphQL. AWS SAM admite solucionadores de JavaScript canalizaciones.

Tipo: Solucionador

Obligatorio: sí

Compatibilidad con CloudFormation: esta propiedad es exclusiva de AWS SAM y no tiene un equivalente CloudFormation.

SchemaInline

La representación de texto de un esquema de GraphQL en formato SDL.

Tipo: cadena

Obligatorio: condicional. Debe especificar SchemaInline o SchemaUri.

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad Definition de un recurso AWS::AppSync::GraphQLSchema.

SchemaUri

El URI del bucket de Amazon Simple Storage Service (Amazon S3) o la ruta de acceso a un directorio local.

Si especifica una ruta a una carpeta local, CloudFormation requiere que el archivo se cargue primero en Amazon S3 antes de la implementación. Puedes utilizar la AWS SAM CLI para facilitar este proceso. Para obtener más información, consulta Cómo AWS SAM carga archivos locales en el momento de la implementesción.

Tipo: cadena

Obligatorio: condicional. Debe especificar SchemaInline o SchemaUri.

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad DefinitionS3Location de un recurso AWS::AppSync::GraphQLSchema.

Tags

Etiquetas (pares de clave-valor) de esta API GraphQL. Utiliza etiquetas para identificar y clasificar los recursos.

Tipo: lista de etiqueta

Obligatorio: no

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad Tag de un recurso AWS::AppSync::GraphQLApi.

XrayEnabled

Indique si quieres utilizar el rastreo de AWS rayos X para este recurso.

Tipo: Booleano

Obligatorio: no

Compatibilidad con CloudFormation: esta propiedad se transfiere directamente a la propiedad XrayEnabled de un recurso AWS::AppSync::GraphQLApi.

valores devueltos

Para obtener una lista de los valores devueltos, consulte AWS::Serverless::GraphQLApi en la Guía del usuario de CloudFormation.

Ejemplos

GraphQL API con origen de datos de DynamoDB

En este ejemplo, creamos una API GraphQL que usa una tabla de DynamoDB como origen de datos.

schema.graphql

schema { query: Query mutation: Mutation } type Query { getPost(id: String!): Post } type Mutation { addPost(author: String!, title: String!, content: String!): Post! } type Post { id: String! author: String title: String content: String ups: Int! downs: Int! version: Int! }

template.yaml

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: DynamoDBPostsTable: Type: AWS::Serverless::SimpleTable MyGraphQLAPI: Type: AWS::Serverless::GraphQLApi Properties: SchemaUri: ./sam_graphql_api/schema.graphql Auth: Type: AWS_IAM DataSources: DynamoDb: PostsDataSource: TableName: !Ref DynamoDBPostsTable TableArn: !GetAtt DynamoDBPostsTable.Arn Functions: preprocessPostItem: Runtime: Name: APPSYNC_JS Version: 1.0.0 DataSource: NONE CodeUri: ./sam_graphql_api/preprocessPostItem.js createPostItem: Runtime: Name: APPSYNC_JS Version: "1.0.0" DataSource: PostsDataSource CodeUri: ./sam_graphql_api/createPostItem.js getPostFromTable: Runtime: Name: APPSYNC_JS Version: "1.0.0" DataSource: PostsDataSource CodeUri: ./sam_graphql_api/getPostFromTable.js Resolvers: Mutation: addPost: Runtime: Name: APPSYNC_JS Version: "1.0.0" Pipeline: - preprocessPostItem - createPostItem Query: getPost: CodeUri: ./sam_graphql_api/getPost.js Runtime: Name: APPSYNC_JS Version: "1.0.0" Pipeline: - getPostFromTable

createPostItem.js

import { util } from "@aws-appsync/utils"; export function request(ctx) { const { key, values } = ctx.prev.result; return { operation: "PutItem", key: util.dynamodb.toMapValues(key), attributeValues: util.dynamodb.toMapValues(values), }; } export function response(ctx) { return ctx.result; }

getPostFromTable.js

import { util } from "@aws-appsync/utils"; export function request(ctx) { return dynamoDBGetItemRequest({ id: ctx.args.id }); } export function response(ctx) { return ctx.result; } /** * A helper function to get a DynamoDB item */ function dynamoDBGetItemRequest(key) { return { operation: "GetItem", key: util.dynamodb.toMapValues(key), }; }

preprocessPostItem.js

import { util } from "@aws-appsync/utils"; export function request(ctx) { const id = util.autoId(); const { ...values } = ctx.args; values.ups = 1; values.downs = 0; values.version = 1; return { payload: { key: { id }, values: values } }; } export function response(ctx) { return ctx.result; }

Este es nuestro código de resolución:

getPost.js

export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }

API de GraphQL con una función de Lambda como origen de datos

En este ejemplo, creamos una API de GraphQL que usa una función de Lambda como origen de datos.

template.yaml

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: ./lambda MyGraphQLAPI: Type: AWS::Serverless::GraphQLApi Properties: Name: MyApi SchemaUri: ./gql/schema.gql Auth: Type: API_KEY ApiKeys: MyApiKey: Description: my api key DataSources: Lambda: MyLambdaDataSource: FunctionArn: !GetAtt MyLambdaFunction.Arn Functions: lambdaInvoker: Runtime: Name: APPSYNC_JS Version: 1.0.0 DataSource: MyLambdaDataSource CodeUri: ./gql/invoker.js Resolvers: Mutation: addPost: Runtime: Name: APPSYNC_JS Version: 1.0.0 Pipeline: - lambdaInvoker Query: getPost: Runtime: Name: APPSYNC_JS Version: 1.0.0 Pipeline: - lambdaInvoker Outputs: MyGraphQLAPI: Description: AppSync API Value: !GetAtt MyGraphQLAPI.GraphQLUrl MyGraphQLAPIMyApiKey: Description: API Key for authentication Value: !GetAtt MyGraphQLAPIMyApiKey.ApiKey

schema.graphql

schema { query: Query mutation: Mutation } type Query { getPost(id: ID!): Post } type Mutation { addPost(id: ID!, author: String!, title: String, content: String): Post! } type Post { id: ID! author: String! title: String content: String ups: Int downs: Int }

Estas son nuestras funciones:

lambda/index.js

exports.handler = async (event) => { console.log("Received event {}", JSON.stringify(event, 3)); const posts = { 1: { id: "1", title: "First book", author: "Author1", content: "Book 1 has this content", ups: "100", downs: "10", }, }; console.log("Got an Invoke Request."); let result; switch (event.field) { case "getPost": return posts[event.arguments.id]; case "addPost": // return the arguments back return event.arguments; default: throw new Error("Unknown field, unable to resolve " + event.field); } };

invoker.js

import { util } from "@aws-appsync/utils"; export function request(ctx) { const { source, args } = ctx; return { operation: "Invoke", payload: { field: ctx.info.fieldName, arguments: args, source }, }; } export function response(ctx) { return ctx.result; }