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 AWS::Serverless::GraphQLApi recurso AWS Serverless Application Model (AWS SAM) para crear y configurar un AWS AppSync GraphQL APIpara su aplicación sin servidor.

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

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 pueda usarse para realizar GraphQL operaciones que requieren una API clave.

Tipo: ApiKeys

Obligatorio: no

AWS CloudFormation compatibilidad: esta propiedad es exclusiva AWS SAM y no tiene un AWS CloudFormation equivalente.

Auth

Configure la autenticación para su GraphQL API.

Tipo: Auth

Obligatorio: sí

AWS CloudFormation compatibilidad: esta propiedad es exclusiva AWS SAM y no tiene un AWS CloudFormation equivalente.

Cache

La entrada de una operación CreateApiCache.

Tipo AWS::AppSync:: ApiCache

Obligatorio: no

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

DataSources

Cree fuentes de datos para las funciones AWS AppSync a las que conectarse. AWS SAM admite Amazon AWS Lambda DynamoDB y fuentes de datos.

Tipo: DataSource

Obligatorio: sí

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

DomainName

Nombre de dominio personalizado para tu GraphQL API.

Escriba AWS::AppSync:: DomainName

Obligatorio: no

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente al DomainName recurso AWS:AppSync:::. AWS SAM genera automáticamente el DomainNameApiAssociation recurso AWS:AppSync:::.

Functions

Configure funciones en GraphQL APIspara realizar determinadas operaciones.

Tipo : Función

Obligatorio: sí

AWS CloudFormation compatibilidad: esta propiedad es exclusiva AWS SAM y no tiene un AWS CloudFormation equivalente.

Logging

Configura el CloudWatch registro de Amazon para su GraphQL API.

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

  • ExcludeVerboseContent: true

  • FieldLogLevel: ALL

Para excluirse del registro, especifica lo siguiente:

Logging: false

Tipo: LogConfig

Obligatorio: no

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente a la LogConfig propiedad de un AWS::AppSync::GraphQLApi recurso.

LogicalId

El nombre único de su GraphQL API.

Tipo: cadena

Obligatorio: sí

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente a la Name propiedad de un AWS::AppSync::GraphQLApi recurso.

Name

El nombre de tu GraphQL API. Especifique esta propiedad para anular el LogicalId valor.

Tipo: cadena

Obligatorio: no

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente a la Name propiedad de un AWS::AppSync::GraphQLApi recurso.

Resolvers

Configure los resolutores para los campos de su GraphQL API. AWS SAM apoya JavaScript solucionadores de tuberías.

Tipo: Solucionador

Obligatorio: sí

AWS CloudFormation compatibilidad: esta propiedad es exclusiva AWS SAM y no tiene un AWS CloudFormation equivalente.

SchemaInline

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

Tipo: cadena

Obligatorio: condicional. Debe especificar SchemaInline o SchemaUri.

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente a la Definition propiedad de un AWS::AppSync::GraphQLSchema recurso.

SchemaUri

El bucket de Amazon Simple Storage Service (Amazon URI S3) del esquema o la ruta a una carpeta local.

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

Tipo: cadena

Obligatorio: condicional. Debe especificar SchemaInline o SchemaUri.

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

Tags

Etiquetas (pares clave-valor) para esto GraphQL API. Utilice etiquetas para identificar y clasificar los recursos.

Tipo: lista de etiqueta

Obligatorio: no

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

XrayEnabled

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

Tipo: Booleano

Obligatorio: no

AWS CloudFormation compatibilidad: esta propiedad se pasa directamente a la XrayEnabled propiedad de un AWS::AppSync::GraphQLApi recurso.

valores devueltos

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

Ejemplos

GraphQL API con fuente de datos de DynamoDB

En este ejemplo, creamos un GraphQL APIque utiliza una tabla de DynamoDB como fuente 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; }

GraphQL APIcon una función Lambda como fuente de datos

En este ejemplo, creamos un GraphQL APIque utiliza una función Lambda como fuente 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; }