本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS::Serverless::GraphQLApi
使用 AWS Serverless Application Model (AWS SAM) AWS::Serverless::GraphQLApi 资源类型创建和配置 AWS AppSync GraphQL 您的无服务器应用程序的 API。
要了解更多信息 AWS AppSync,请参阅什么是 AWS AppSync? 在《AWS AppSync 开发人员指南》中。
语法
YAML
LogicalId: Type: AWS::Serverless::GraphQLApi Properties: ApiKeys:ApiKeysAuth:AuthCache:AWS::AppSync::ApiCacheDataSources:DataSourceDomainName:AWS::AppSync::DomainNameFunctions:FunctionLogging:LogConfigName:StringResolvers:ResolverSchemaInline:StringSchemaUri:StringTags:- TagXrayEnabled:Boolean
属性
- ApiKeys
- 
					创建可用于执行的唯一密钥 GraphQL 需要 API 密钥的操作。 类型:ApiKeys 必需:否 AWS CloudFormation 兼容性:此属性是独有的 AWS SAM ,没有 AWS CloudFormation 等效属性。 
- Auth
- 
					为您配置身份验证 GraphQL API。 类型:身份验证 必需:是 AWS CloudFormation 兼容性:此属性是独有的 AWS SAM ,没有 AWS CloudFormation 等效属性。 
- Cache
- 
					CreateApiCache操作的输入。必需:否 AWS CloudFormation 兼容性:此属性直接传递给AWS::AppSync::ApiCache资源。 
- DataSources
- 
					为中的函数创建 AWS AppSync 要连接的数据源。 AWS SAM 支持 Amazon DynamoDB AWS Lambda 和数据源。 类型:DataSource 必需:是 AWS CloudFormation 兼容性:此属性是独有的 AWS SAM ,没有 AWS CloudFormation 等效属性。 
- DomainName
- 
					为您的自定义域名 GraphQL API。 必需:否 AWS CloudFormation 兼容性:此属性直接传递给AWS::AppSync::DomainName资源。 AWS SAM 自动生成AWS::AppSync::DomainNameApiAssociation资源。 
- Functions
- 
					在中配置函数 GraphQL APIs 执行某些操作。 类型:函数 必需:是 AWS CloudFormation 兼容性:此属性是独有的 AWS SAM ,没有 AWS CloudFormation 等效属性。 
- Logging
- 
					为您配置 Amazon CloudWatch 日志 GraphQL API。 如果不指定此属性, AWS SAM 将生成 CloudWatchLogsRoleArn并设置以下值:- 
							ExcludeVerboseContent: true
- 
							FieldLogLevel: ALL
 要选择退出日志记录,请指定以下内容: Logging: false类型:LogConfig 必需:否 AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLApi资源的LogConfig属性。
- 
							
- LogicalId
- 
					你的唯一名字 GraphQL API。 类型:字符串 必需:是 AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLApi资源的Name属性。
- Name
- 
					你的名字 GraphQL API。指定此属性以覆盖 LogicalId值。类型:字符串 必需:否 AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLApi资源的Name属性。
- Resolvers
- 
					为你的字段配置解析器 GraphQL API。 AWS SAM 支持 JavaScript 管道解析器。 类型:解析程序 必需:是 AWS CloudFormation 兼容性:此属性是独有的 AWS SAM ,没有 AWS CloudFormation 等效属性。 
- SchemaInline
- 
					a 的文本表示形式 GraphQL 架构在 SDL 格式的日期和时间。 类型:字符串 必填:条件性。您必须指定 SchemaInline或SchemaUri。AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLSchema资源的Definition属性。
- SchemaUri
- 
					架构的 Amazon Simple Storage Service (Amazon S3) 存储桶 URI 或本地文件夹的路径。 如果您指定本地文件夹的路径,则 AWS CloudFormation 要求在部署之前先将文件上传到 Amazon S3。你可以使用 AWS SAM CLI 以促进这一进程。有关更多信息,请参阅 如何在 AWS SAM 部署时上传本地文件。 类型:字符串 必填:条件性。您必须指定 SchemaInline或SchemaUri。AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLSchema资源的DefinitionS3Location属性。
- 
					这个的标签(键值对) GraphQL API。使用标签标识和分类资源。 类型:标签列表 必需:否 AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLApi资源的Tag属性。
- XrayEnabled
- 
					指明是否对此资源使用 AWS X-Ray 跟踪。 类型:布尔值 必需:否 AWS CloudFormation 兼容性:此属性直接传递给 AWS::AppSync::GraphQLApi资源的XrayEnabled属性。
返回值
有关返回值的列表,请参阅 AWS::Serverless::GraphQLApi(在 AWS CloudFormation 用户指南中)。
示例
GraphQL API 使用 DynamoDB 数据源
在这个例子中,我们创建了一个 GraphQL 使用 DynamoDB 表作为数据源的 API。
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; }
解析程序代码如下:
getPost.js
export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
GraphQL 以 Lambda 函数作为数据源的 API
在这个例子中,我们创建了一个 GraphQL 使用 Lambda 函数作为数据源的 API。
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 }
函数如下:
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; }