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

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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: 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

屬性

ApiKeys

建立可用於執行需要 API 金鑰之GraphQL作業的唯一金鑰。

類型:ApiKeys

必要:否

AWS CloudFormation 兼容性:此屬性是唯一的, AWS SAM 並且沒有相 AWS CloudFormation 等的屬性。

Auth

為您的 GraphQL API 配置身份驗證。

類型驗證

必要:是

AWS CloudFormation 兼容性:此屬性是唯一的, AWS SAM 並且沒有相 AWS CloudFormation 等的屬性。

Cache

CreateApiCache作業的輸入。

類型:AWS::AppSync::ApiCache

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給資AWS::AppSync::ApiCache源。

DataSources

為中的函數建立資料來源 AWS AppSync 以進行連線。 AWS SAM 支援 Amazon DynamoDB 和 AWS Lambda 資料來源。

類型:DataSource

必要:是

AWS CloudFormation 兼容性:此屬性是唯一的, AWS SAM 並且沒有相 AWS CloudFormation 等的屬性。

DomainName

GraphQLAPI 的自定義域名。

類型:AWS::AppSync::DomainName

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給資AWS::AppSync::DomainName源。 AWS SAM 會自動產生AWS::AppSync::DomainNameApiAssociation資源。

Functions

在 GraphQL API 中設定函數以執行特定作業。

類型功能

必要:是

AWS CloudFormation 兼容性:此屬性是唯一的, AWS SAM 並且沒有相 AWS CloudFormation 等的屬性。

Logging

為您的 API 配置 Amazon CloudWatch 日誌記錄GraphQL。

如果您未指定此屬性, AWS SAM 將會產生CloudWatchLogsRoleArn並設定下列值:

  • ExcludeVerboseContent: true

  • FieldLogLevel: ALL

若要選擇退出記錄,請指定下列項目:

Logging: false

類型:LogConfig

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLApi資源的LogConfig屬性。

LogicalId

GraphQLAPI 的唯一名稱。

類型:字串

必要:是

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLApi資源的Name屬性。

Name

您的 GraphQL API 的名稱。指定此性質以取代LogicalId值。

類型:字串

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLApi資源的Name屬性。

Resolvers

設定 API 欄位的解析程式GraphQL。 AWS SAM 支援JavaScript管線解析器

類型解析器

必要:是

AWS CloudFormation 兼容性:此屬性是唯一的, AWS SAM 並且沒有相 AWS CloudFormation 等的屬性。

SchemaInline

SDL格式中GraphQL結構描述的文字表示。

類型:字串

必要:有條件限制。您必須指定SchemaInlineSchemaUri

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLSchema資源的Definition屬性。

SchemaUri

該模式的 Amazon Simple Storage Service (Amazon S3) 存儲桶 URI 或本地文件夾的路徑。

如果您指定本機資料夾的路徑,則 AWS CloudFormation 需要在部署之前先將檔案上傳到 Amazon S3。您可以使用 AWS SAMCLI來促進此程序。如需詳細資訊,請參閱 方法 AWS SAM 在部署時上傳本機檔案

類型:字串

必要:有條件限制。您必須指定SchemaInlineSchemaUri

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLSchema資源的DefinitionS3Location屬性。

Tags

此 GraphQL API 的標籤(鍵值對)。使用標籤來識別和分類資源。

類型標籤的清單

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLApi資源的Tag屬性。

XrayEnabled

指示是否對此資源使用 AWS X-Ray 追蹤

類型:布林值

必要:否

AWS CloudFormation 兼容性:此屬性直接傳遞給AWS::AppSync::GraphQLApi資源的XrayEnabled屬性。

範例

GraphQL API使用 DynamoDB 資料來源

在此範例中,我們建立了使用 DynamoDB 表作為資料來源的 GraphQL API。

模式

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! }

模板.

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

在此範例中,我們建立了使用 Lambda 函數做為資料來源的 GraphQL API。

模板.

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 { 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; }