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

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS::Serverless::GraphQLApi

AWS Serverless Application Model (AWS SAM) AWS::Serverless::GraphQLApi 리소스 유형을 사용하여 서버리스 애플리케이션용 AWS AppSync GraphQL API를 만들고 구성할 수 있습니다.

자세히 알아보려면 What AWS AppSync is 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

GraphQLAPI에 대한 인증을 구성하십시오.

유형: 인증

필수 여부: 예

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

GraphQL API의 고유한 이름.

타입: 문자열

필수 항목 여부: 예

AWS CloudFormation 호환성: 이 속성은 AWS::AppSync::GraphQLApi 리소스의 Name 속성에 직접 전달됩니다.

Name

귀하의 GraphQLAPI의 이름입니다. 이 속성을 지정하여 LogicalId 값을 재정의합니다.

타입: 문자열

필수 항목 여부: 아니요

AWS CloudFormation 호환성: 이 속성은 AWS::AppSync::GraphQLApi 리소스의 Name 속성에 직접 전달됩니다.

Resolvers

귀하의 GraphQL API 필드에 대한 해석기를 구성하십시오. AWS SAM 는 JavaScript파이프라인 리졸버를 지원합니다.

유형: 해석기

필수 여부: 예

AWS CloudFormation 호환성: 이 속성은 AWS SAM 고유하며 AWS CloudFormation 이에 상응하는 속성이 없습니다.

SchemaInline

SDL 형식의 GraphQL 스키마 텍스트 표시.

타입: 문자열

필수 항목 여부: 조건부. SchemaInline 또는SchemaUri 를 지정해야 합니다.

AWS CloudFormation 호환성: 이 속성은 AWS::AppSync::GraphQLSchema 리소스의 Definition 속성으로 직접 전달됩니다.

SchemaUri

스키마의 Amazon Simple Storage Service(S3) 버킷 URI 또는 로컬 폴더 경로

로컬 폴더 경로를 지정하는 경우 배포하기 전에 먼저 파일을 Amazon S3에 업로드해야 합니다. AWS CloudFormation AWS SAMCLI를 사용하여 이 프로세스를 용이하게 할 수 있습니다. 자세한 내용은 배포 시 로컬 파일을 업로드하는 방법 AWS SAMCLI을 참조하십시오

타입: 문자열

필수 항목 여부: 조건부. SchemaInline 또는SchemaUri 를 지정해야 합니다.

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 APIDynamoDB 데이터 소스 사용

이 예시에서는 DynamoDB 테이블을 데이터 소스로 사용하는 GraphQL 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; }

GraphQLLambda 함수를 데이터 소스로 사용하는 API

이 예시에서는 Lambda 함수를 데이터 소스로 사용하는 GraphQL 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; }