기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
에서 DynamoDB 배치 작업 사용 AWS AppSync
AWS AppSync 는 단일 리전의 하나 이상의 테이블에서 Amazon DynamoDB 배치 작업 사용을 지원합니다. 지원되는 작업은 BatchGetItem
, BatchPutItem
및 BatchDeleteItem
입니다. 에서 이러한 기능을 사용하면 다음과 같은 작업을 수행할 AWS AppSync수 있습니다.
-
단일 쿼리에서 키 목록을 전달하고 테이블의 결과 반환
-
단일 쿼리의 하나 이상의 테이블에서 레코드 읽기
-
하나 이상의 테이블에 대량으로 레코드 쓰기
-
관계가 있을 수 있는 여러 테이블에서 조건부로 레코드 쓰기 또는 삭제
의 배치 작업은 배치되지 않은 작업과 두 가지 주요 차이점 AWS AppSync 이 있습니다.
-
데이터 원본 역할에 해석기가 액세스할 모든 테이블에 대한 권한이 있어야 합니다.
-
해석기에 대한 테이블 사양이 요청 객체의 일부입니다.
단일 테이블 배치
주의
BatchPutItem
충돌 감지 및 해결과 함께 사용할 때는 및 BatchDeleteItem
가 지원되지 않습니다. 오류가 발생하지 않도록 이러한 설정을 비활성화해야 합니다.
시작하려면 새 GraphQL 을 생성해 보겠습니다API. AWS AppSync 콘솔에서 생성API, GraphQL APIs및 처음부터 설계를 선택합니다. 의 이름을 API 지정하고BatchTutorial API
, 다음 를 선택하고, GraphQL 리소스 지정 단계에서 나중에 GraphQL 리소스 생성을 선택하고, 다음 를 클릭합니다. 세부 정보를 검토하고 를 생성합니다API. 스키마 페이지로 이동하여 다음 스키마를 붙여넣습니다. 쿼리의 경우 의 목록에 전달됩니다IDs.
type Post { id: ID! title: String } input PostInput { id: ID! title: String } type Query { batchGet(ids: [ID]): [Post] } type Mutation { batchAdd(posts: [PostInput]): [Post] batchDelete(ids: [ID]): [Post] }
스키마를 저장하고 페이지 상단에서 리소스 생성을 선택합니다. 기존 유형 사용을 선택하고 Post
유형을 선택합니다. 테이블 Posts
의 이름을 지정합니다. 기본 키가 id
로 설정되어 있는지 확인하고 GraphQL 자동 생성을 선택 취소한 다음(직접 코드를 제공해야 함) 생성을 선택합니다. 시작하기 위해 AWS AppSync
는 새 DynamoDB 테이블과 적절한 역할로 테이블에 연결된 데이터 소스를 생성합니다. 하지만 여전히 역할에 추가해야 하는 몇 가지 권한이 있습니다. 데이터 소스 페이지로 이동하여 새 데이터 소스를 선택합니다. 기존 역할 선택에서 테이블에 대한 역할이 자동으로 생성된 것을 확인할 수 있습니다. 역할을 기록해 둔 다음(와 비슷해야 함appsync-ds-ddb-aaabbbcccddd-Posts
) IAM 콘솔()로 이동합니다https://console.aws.amazon.com/iam/+
'를 클릭합니다(역할 이름과 이름이 비슷해야 함). 정책이 나타나면 접을 수 있는 항목의 상단에서 편집을 선택합니다. 정책에 일괄 권한(특히 dynamodb:BatchGetItem
및 dynamodb:BatchWriteItem
)을 추가해야 합니다. 결과는 다음과 같을 것입니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem", "dynamodb:BatchWriteItem", "dynamodb:BatchGetItem" ], "Resource": [ "arn:aws:dynamodb:…", "arn:aws:dynamodb:…" ] } ] }
다음을 선택한 후 변경 사항 저장을 선택합니다. 이제 정책에서 일괄 처리를 허용해야 합니다.
AWS AppSync 콘솔로 돌아가 스키마 페이지로 이동하여 Mutation.batchAdd
필드 옆의 연결을 선택합니다. Posts
테이블을 데이터 소스로 사용하여 해석기를 만듭니다. 코드 편집기에서 핸들러를 아래 코드 조각으로 바꿉니다. 이 코드 조각은 GraphQL input PostInput
유형의 각 항목을 자동으로 가져와서 BatchPutItem
작업에 필요한 맵을 빌드합니다.
import { util } from "@aws-appsync/utils"; export function request(ctx) { return { operation: "BatchPutItem", tables: { Posts: ctx.args.posts.map((post) => util.dynamodb.toMapValues(post)), }, }; } export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return ctx.result.data.Posts; }
AWS AppSync 콘솔의 쿼리 페이지로 이동하여 다음 batchAdd
변형을 실행합니다.
mutation add { batchAdd(posts:[{ id: 1 title: "Running in the Park"},{ id: 2 title: "Playing fetch" }]){ id title } }
화면에 결과가 인쇄되어 있어야 합니다. DynamoDB 콘솔을 검토하여 Posts
테이블에 기록된 값을 스캔하면 결과를 확인할 수 있습니다.
그런 다음 해석기를 연결하는 과정을 반복하되, Posts
테이블을 데이터 소스로 사용하는 Query.batchGet
필드에 대해 반복합니다. 핸들러를 아래 코드로 바꿉니다. 이렇게 하면 GraphQL ids:[]
형식의 각 항목을 자동으로 받아 BatchGetItem
작업에 필요한 맵을 빌드합니다.
import { util } from "@aws-appsync/utils"; export function request(ctx) { return { operation: "BatchGetItem", tables: { Posts: { keys: ctx.args.ids.map((id) => util.dynamodb.toMapValues({ id })), consistentRead: true, }, }, }; } export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return ctx.result.data.Posts; }
이제 AWS AppSync 콘솔의 쿼리 페이지로 돌아가서 다음 batchGet
쿼리를 실행합니다.
query get { batchGet(ids:[1,2,3]){ id title } }
앞서 추가한 두 id
값에 대한 결과를 반환해야 합니다. null
값은 값이 id
인 3
에 대해 반환되었습니다. 이는 Posts
테이블에 해당 값을 가진 레코드가 아직 없기 때문입니다. 또한 는 쿼리에 전달된 키와 동일한 순서로 결과를 AWS AppSync 반환하며, 이는 사용자를 대신하여 AWS AppSync 수행하는 추가 기능입니다. 따라서 batchGet(ids:[1,3,2])
로 전환하면 순서가 바뀝니다. 또한 어떤 id
가 null
값을 반환하는지 알게 됩니다.
마지막으로 Posts
테이블을 데이터 소스로 사용하여 Mutation.batchDelete
필드에 해석기를 하나 더 연결합니다. 핸들러를 아래 코드로 바꿉니다. 이렇게 하면 GraphQL ids:[]
형식의 각 항목을 자동으로 받아 BatchGetItem
작업에 필요한 맵을 빌드합니다.
import { util } from "@aws-appsync/utils"; export function request(ctx) { return { operation: "BatchDeleteItem", tables: { Posts: ctx.args.ids.map((id) => util.dynamodb.toMapValues({ id })), }, }; } export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type); } return ctx.result.data.Posts; }
이제 AWS AppSync 콘솔의 쿼리 페이지로 돌아가서 다음 batchDelete
변형을 실행합니다.
mutation delete { batchDelete(ids:[1,2]){ id } }
이제 id
1
및 2
인 레코드가 삭제되어야 합니다. 앞에서 batchGet()
쿼리를 다시 실행하면 null
을 반환해야 합니다.
다중 테이블 배치
주의
BatchPutItem
충돌 감지 및 해결과 함께 사용할 때는 및 BatchDeleteItem
가 지원되지 않습니다. 오류가 발생하지 않도록 이러한 설정을 비활성화해야 합니다.
AWS AppSync 를 사용하면 테이블 간에 배치 작업을 수행할 수도 있습니다. 더 복잡한 애플리케이션을 빌드해 보겠습니다. 센서가 반려동물의 위치와 체온을 알려주는 반려동물 건강 앱을 개발한다고 상상해 보세요. 센서는 배터리로 구동되며 몇 분마다 네트워크에 연결을 시도합니다. 센서가 연결을 설정하면 판독값을 로 전송합니다 AWS AppSync API. 그런 다음 트리거가 데이터를 분석해 애완동물 주인에게 대시보드가 제공됩니다. 센서와 백엔드 데이터 스토어 간의 상호 작용에 대해 중점적으로 설명해 보겠습니다.
AWS AppSync 콘솔에서 생성API, GraphQL APIs및 처음부터 설계를 선택합니다. 의 이름을 API 지정하고MultiBatchTutorial API
, 다음 를 선택하고, GraphQL 리소스 지정 단계에서 나중에 GraphQL 리소스 생성을 선택하고, 다음 를 클릭합니다. 세부 정보를 검토하고 를 생성합니다API. 스키마 페이지로 이동하여 다음 스키마를 붙여넣고 저장합니다.
type Mutation { # Register a batch of readings recordReadings(tempReadings: [TemperatureReadingInput], locReadings: [LocationReadingInput]): RecordResult # Delete a batch of readings deleteReadings(tempReadings: [TemperatureReadingInput], locReadings: [LocationReadingInput]): RecordResult } type Query { # Retrieve all possible readings recorded by a sensor at a specific time getReadings(sensorId: ID!, timestamp: String!): [SensorReading] } type RecordResult { temperatureReadings: [TemperatureReading] locationReadings: [LocationReading] } interface SensorReading { sensorId: ID! timestamp: String! } # Sensor reading representing the sensor temperature (in Fahrenheit) type TemperatureReading implements SensorReading { sensorId: ID! timestamp: String! value: Float } # Sensor reading representing the sensor location (lat,long) type LocationReading implements SensorReading { sensorId: ID! timestamp: String! lat: Float long: Float } input TemperatureReadingInput { sensorId: ID! timestamp: String value: Float } input LocationReadingInput { sensorId: ID! timestamp: String lat: Float long: Float }
DynamoDB 테이블 두 개를 생성해야 합니다.
-
locationReadings
는 센서 위치 판독값을 저장합니다. -
temperatureReadings
는 센서 온도 측정값을 저장합니다.
두 테이블은 동일한 기본 키 구조를 공유합니다. 파티션 키는 sensorId (String)
, 정렬 키는 timestamp (String)
입니다.
페이지 상단에서 리소스 생성을 선택합니다. 기존 유형 사용을 선택하고 locationReadings
유형을 선택합니다. 테이블 locationReadings
의 이름을 지정합니다. 기본 키는 sensorId
로, 정렬 키는 timestamp
로 설정되어 있는지 확인합니다. GraphQL 자동 생성을 선택 취소하고(직접 코드를 제공해야 함) 생성을 선택합니다. temperatureReadings
를 유형 및 테이블 이름으로 사용하여 temperatureReadings
에 이 프로세스를 반복합니다. 위와 같은 키를 사용합니다.
새 테이블에는 자동으로 생성된 역할이 포함됩니다. 여전히 역할에 추가해야 하는 몇 가지 권한이 있습니다. 데이터 소스 페이지로 이동하여 locationReadings
를 선택합니다. 기존 역할 선택에서 역할을 볼 수 있습니다. 역할을 기록해 둔 다음(와 비슷해야 함appsync-ds-ddb-aaabbbcccddd-locationReadings
) IAM 콘솔()로 이동합니다https://console.aws.amazon.com/iam/+
'를 클릭합니다(역할 이름과 이름이 비슷해야 함). 정책이 나타나면 접을 수 있는 항목의 상단에서 편집을 선택합니다. 이 정책에 권한을 추가해야 합니다. 결과는 다음과 같을 것입니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:region:account:table/locationReadings", "arn:aws:dynamodb:region:account:table/locationReadings/*", "arn:aws:dynamodb:region:account:table/temperatureReadings", "arn:aws:dynamodb:region:account:table/temperatureReadings/*" ] } ] }
다음을 선택한 후 변경 사항 저장을 선택합니다. 위와 동일한 정책 코드 조각을 사용하여 temperatureReadings
데이터 소스에 대해 이 프로세스를 반복합니다.
BatchPutItem - 센서 판독값 기록
센서는 인터넷에 연결되면 판독값을 전송할 수 있어야 합니다. GraphQL 필드는 이를 위해 사용할 API Mutation.recordReadings
입니다. 이 필드에 해석기를 추가해야 합니다.
AWS AppSync 콘솔의 스키마 페이지에서 Mutation.recordReadings
필드 옆에 있는 연결을 선택합니다. 다음 화면에서 locationReadings
테이블을 데이터 소스로 사용하여 해석기를 만듭니다.
해석기를 생성한 후 편집기에서 다음 코드를 사용하여 핸들러를 대체합니다. 이 BatchPutItem
작업을 통해 여러 테이블을 지정할 수 있습니다.
import { util } from '@aws-appsync/utils' export function request(ctx) { const { locReadings, tempReadings } = ctx.args const locationReadings = locReadings.map((loc) => util.dynamodb.toMapValues(loc)) const temperatureReadings = tempReadings.map((tmp) => util.dynamodb.toMapValues(tmp)) return { operation: 'BatchPutItem', tables: { locationReadings, temperatureReadings, }, } } export function response(ctx) { if (ctx.error) { util.appendError(ctx.error.message, ctx.error.type) } return ctx.result.data }
배치 작업을 사용하면 호출 시 오류 및 결과가 둘 다 반환될 수 있습니다. 이러한 경우 몇 가지 오류 처리를 작업을 자유롭게 수행할 수 있습니다.
참고
utils.appendError()
사용은 util.error()
와 유사하지만 요청 또는 응답 핸들러 평가를 중단하지 않는다는 큰 차이점이 있습니다. 대신 필드에 오류가 있다는 신호를 보내지만 템플릿이 계속해서 평가되도록 하고 이어서 호출자에게 데이터를 반환합니다. 애플리케이션이 일부 결과를 반환해야 하는 경우에는 utils.appendError()
를 사용하는 것이 좋습니다.
해석기를 저장하고 AWS AppSync 콘솔의 쿼리 페이지로 이동합니다. 이제 일부 센서 측정값을 전송할 수 있습니다.
다음 변형을 실행합니다.
mutation sendReadings { recordReadings( tempReadings: [ {sensorId: 1, value: 85.5, timestamp: "2018-02-01T17:21:05.000+08:00"}, {sensorId: 1, value: 85.7, timestamp: "2018-02-01T17:21:06.000+08:00"}, {sensorId: 1, value: 85.8, timestamp: "2018-02-01T17:21:07.000+08:00"}, {sensorId: 1, value: 84.2, timestamp: "2018-02-01T17:21:08.000+08:00"}, {sensorId: 1, value: 81.5, timestamp: "2018-02-01T17:21:09.000+08:00"} ] locReadings: [ {sensorId: 1, lat: 47.615063, long: -122.333551, timestamp: "2018-02-01T17:21:05.000+08:00"}, {sensorId: 1, lat: 47.615163, long: -122.333552, timestamp: "2018-02-01T17:21:06.000+08:00"}, {sensorId: 1, lat: 47.615263, long: -122.333553, timestamp: "2018-02-01T17:21:07.000+08:00"}, {sensorId: 1, lat: 47.615363, long: -122.333554, timestamp: "2018-02-01T17:21:08.000+08:00"}, {sensorId: 1, lat: 47.615463, long: -122.333555, timestamp: "2018-02-01T17:21:09.000+08:00"} ]) { locationReadings { sensorId timestamp lat long } temperatureReadings { sensorId timestamp value } } }
하나의 뮤테이션으로 센서 판독값 10개를 전송했고, 판독값은 테이블 2개로 분할되어 있었습니다. DynamoDB 콘솔을 사용하여 데이터가 locationReadings
및 temperatureReadings
테이블 모두에 표시되는지 확인합니다.
BatchDeleteItem - 센서 판독값 삭제
마찬가지로 센서 판독값의 배치를 삭제할 수 있어야 합니다. 이를 위해 Mutation.deleteReadings
GraphQL 필드를 사용해 보겠습니다. AWS AppSync 콘솔의 스키마 페이지에서 Mutation.deleteReadings
필드 옆에 있는 연결을 선택합니다. 다음 화면에서 locationReadings
테이블을 데이터 소스로 사용하여 해석기를 만듭니다.
해석기를 생성한 후 코드 편집기에서 핸들러를 아래의 코드 조각으로 대체합니다. 이 해석기에서는 제공된 입력에서 sensorId
와 timestamp
를 추출하는 도우미 함수 매퍼를 사용합니다.
import { util } from '@aws-appsync/utils' export function request(ctx) { const { locReadings, tempReadings } = ctx.args const mapper = ({ sensorId, timestamp }) => util.dynamodb.toMapValues({ sensorId, timestamp }) return { operation: 'BatchDeleteItem', tables: { locationReadings: locReadings.map(mapper), temperatureReadings: tempReadings.map(mapper), }, } } export function response(ctx) { if (ctx.error) { util.appendError(ctx.error.message, ctx.error.type) } return ctx.result.data }
해석기를 저장하고 AWS AppSync 콘솔의 쿼리 페이지로 이동합니다. 이제 센서 판독값 두 개를 삭제해 보겠습니다.
다음 변형을 실행합니다.
mutation deleteReadings { # Let's delete the first two readings we recorded deleteReadings( tempReadings: [{sensorId: 1, timestamp: "2018-02-01T17:21:05.000+08:00"}] locReadings: [{sensorId: 1, timestamp: "2018-02-01T17:21:05.000+08:00"}]) { locationReadings { sensorId timestamp lat long } temperatureReadings { sensorId timestamp value } } }
참고
DeleteItem
작업과 달리 완전히 삭제된 항목은 응답에서 반환되지 않습니다. 전달된 키만 반환됩니다. 자세한 내용은 BatchDeleteItem DynamoDB에 대한 JavaScript 해석기 함수 참조의 섹션을 참조하세요.
DynamoDB 콘솔을 사용하여 판독값 2개가 locationReadings
및 temperatureReadings
테이블에서 삭제되었는지 확인합니다.
BatchGetItem - 판독값 검색
앱의 또 다른 일반 작업은 특정 시점에 센서의 판독값을 검색하는 것입니다. 스키마의 Query.getReadings
GraphQL 필드에 해석기를 연결해 보겠습니다. AWS AppSync 콘솔의 스키마 페이지에서 Query.getReadings
필드 옆에 있는 연결을 선택합니다. 다음 화면에서 locationReadings
테이블을 데이터 소스로 사용하여 해석기를 만듭니다.
다음 코드를 사용하겠습니다.
import { util } from '@aws-appsync/utils' export function request(ctx) { const keys = [util.dynamodb.toMapValues(ctx.args)] const consistentRead = true return { operation: 'BatchGetItem', tables: { locationReadings: { keys, consistentRead }, temperatureReadings: { keys, consistentRead }, }, } } export function response(ctx) { if (ctx.error) { util.appendError(ctx.error.message, ctx.error.type) } const { locationReadings: locs, temperatureReadings: temps } = ctx.result.data return [ ...locs.map((l) => ({ ...l, __typename: 'LocationReading' })), ...temps.map((t) => ({ ...t, __typename: 'TemperatureReading' })), ] }
해석기를 저장하고 AWS AppSync 콘솔의 쿼리 페이지로 이동합니다. 이제, 센서 판독값을 검색해 보겠습니다.
다음 쿼리를 실행합니다.
query getReadingsForSensorAndTime { # Let's retrieve the very first two readings getReadings(sensorId: 1, timestamp: "2018-02-01T17:21:06.000+08:00") { sensorId timestamp ...on TemperatureReading { value } ...on LocationReading { lat long } } }
를 사용한 DynamoDB 배치 작업의 사용을 성공적으로 시연했습니다 AWS AppSync.
오류 처리
에서 AWS AppSync데이터 소스 작업은 때때로 부분 결과를 반환할 수 있습니다. 일부 결과는 작업의 출력이 일부 데이터와 오류로 구성된 경우를 나타내는 데 사용되는 용어입니다. 오류 처리는 기본적으로 애플리케이션별로 다르기 때문에 응답 핸들러의 오류를 처리할 수 있는 기회를 AWS AppSync 제공합니다. 해석기 호출 오류(있는 경우)는 컨텍스트에서 ctx.error
로 확인할 수 있습니다. 호출 오류에는 항상 ctx.error.message
및 ctx.error.type
속성으로 액세스할 수 있는 메시지와 유형이 포함되어 있습니다. 응답 핸들러에서는 다음 세 가지 방법으로 부분 결과를 처리할 수 있습니다.
-
데이터를 반환하여 호출 오류를 가립니다.
-
핸들러 평가를 중단해 오류를 나타냅니다(
util.error(...)
사용). 이 경우에는 데이터가 반환되지 않습니다. -
오류를 추가하고(
util.appendError(...)
사용) 데이터도 반환합니다.
DynamoDB 배치 작업을 사용해 위의 3가지 방법을 각각 시연해 보겠습니다.
DynamoDB 배치 작업
DynamoDB 배치 작업을 사용하면 배치를 부분적으로 완료할 수 있습니다. 즉, 요청된 항목 또는 키 중 일부가 처리되지 않은 상태로 남아 있을 수 있습니다. AWS AppSync 가 배치를 완료할 수 없는 경우 처리되지 않은 항목과 호출 오류가 컨텍스트에 설정됩니다.
이 자습서 이전 단원에서 사용한 Query.getReadings
작업의 BatchGetItem
필드 구성을 사용하여 오류 처리를 구현하겠습니다. 이때, Query.getReadings
필드를 실행하는 동안 temperatureReadings
DynamoDB 테이블에 프로비저닝된 처리량이 부족하다고 가정해 보겠습니다. DynamoDB는 배치의 나머지 요소를 처리하기 AWS AppSync 위해 에 의해 두 번째 시도 ProvisionedThroughputExceededException
중에 를 생성했습니다.
다음은 DynamoDB 배치 호출 후 응답 핸들러가 호출되기 전에 직렬화된 컨텍스트를 JSON 나타냅니다.
{ "arguments": { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00" }, "source": null, "result": { "data": { "temperatureReadings": [ null ], "locationReadings": [ { "lat": 47.615063, "long": -122.333551, "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00" } ] }, "unprocessedKeys": { "temperatureReadings": [ { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00" } ], "locationReadings": [] } }, "error": { "type": "DynamoDB:ProvisionedThroughputExceededException", "message": "You exceeded your maximum allowed provisioned throughput for a table or for one or more global secondary indexes. (...)" }, "outErrors": [] }
컨텍스트에 대해서 알아야 할 몇 가지가 있습니다.
-
호출 오류가 에
ctx.error
의해 의 컨텍스트에 설정되었으며 AWS AppSync오류 유형이 로 설정되었습니다DynamoDB:ProvisionedThroughputExceededException
. -
오류가 있더라도 결과는
ctx.result.data
에서 테이블당 매핑됩니다. -
처리되지 않고 남아 있는 키는
ctx.result.data.unprocessedKeys
에서 확인할 수 있습니다. 여기서는 테이블 처리량이 부족하여 키(sensorId:1, 타임스탬프:2018-02-01T17:21:05.000+08:00)로 항목을 검색할 수 AWS AppSync 없었습니다.
참고
BatchPutItem
의 경우 ctx.result.data.unprocessedItems
입니다. BatchDeleteItem
의 경우 ctx.result.data.unprocessedKeys
입니다.
이 오류를 세 가지 다른 방법으로 처리해 보겠습니다.
1. 호출 오류 가리기
호출 오류를 처리하지 않고 데이터를 반환하면 오류를 효과적으로 가려 주어진 GraphQL 필드에 대한 결과가 항상 성공입니다.
여기서 작성한 코드는 알기 쉽고 결과 데이터에만 중점을 두고 있습니다.
응답 핸들러
export function response(ctx) { return ctx.result.data }
GraphQL 응답
{ "data": { "getReadings": [ { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00", "lat": 47.615063, "long": -122.333551 }, { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00", "value": 85.5 } ] } }
데이터에 대해서만 실행되었으므로 오류 응답에 오류가 추가되지 않습니다.
2. 응답 핸들러 실행을 중단하는 오류 발생
클라이언트의 관점에서 부분 실패를 전체 실패로 간주해야 하는 경우 데이터가 반환되지 않도록 응답 핸들러 실행을 중단할 수 있습니다. util.error(...)
유틸리티 메서드가 정확하게 이러한 동작을 수행합니다.
응답 핸들러 코드
export function response(ctx) { if (ctx.error) { util.error(ctx.error.message, ctx.error.type, null, ctx.result.data.unprocessedKeys); } return ctx.result.data; }
GraphQL 응답
{ "data": { "getReadings": null }, "errors": [ { "path": [ "getReadings" ], "data": null, "errorType": "DynamoDB:ProvisionedThroughputExceededException", "errorInfo": { "temperatureReadings": [ { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00" } ], "locationReadings": [] }, "locations": [ { "line": 58, "column": 3 } ], "message": "You exceeded your maximum allowed provisioned throughput for a table or for one or more global secondary indexes. (...)" } ] }
일부 결과가 DynamoDB 배치 작업에서 반환될 수 있긴 하지만 오류를 일으키기로 선택합니다. 그러면 getReadings
GraphQL 필드는 null이고 GraphQL 응답 오류 블록에 오류가 추가됩니다.
3. 오류를 추가하고 데이터 및 오류를 둘 다 반환
특정한 경우 사용자 경험을 개선하기 위해 애플리케이션에서는 일부 결과를 반환하고 클라이언트에게 처리되지 않은 항목이 있음을 알릴 수 있습니다. 그러면 클라이언트는 재시도를 수행하거나 오류를 최종 사용자에게 다시 번역할지 결정할 수 있습니다. util.appendError(...)
는 애플리케이션 디자이너가 응답 핸들러 평가를 방해하지 않고 컨텍스트에 오류를 추가하도록 하여 이러한 동작을 가능하게 하는 유틸리티 메서드입니다. 응답 핸들러를 평가한 후 AWS AppSync 는 컨텍스트 오류를 GraphQL 응답의 오류 블록에 추가하여 처리합니다.
응답 핸들러 코드
export function response(ctx) { if (ctx.error) { util.appendError(ctx.error.message, ctx.error.type, null, ctx.result.data.unprocessedKeys); } return ctx.result.data; }
GraphQL 응답의 오류 블록 내에서 호출 오류 및 unprocessedKeys
요소를 전달합니다. 아래 응답에 표시된 것처럼 getReadings
필드 역시 locationReadings
테이블의 일부 데이터를 반환합니다.
GraphQL 응답
{ "data": { "getReadings": [ null, { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00", "value": 85.5 } ] }, "errors": [ { "path": [ "getReadings" ], "data": null, "errorType": "DynamoDB:ProvisionedThroughputExceededException", "errorInfo": { "temperatureReadings": [ { "sensorId": "1", "timestamp": "2018-02-01T17:21:05.000+08:00" } ], "locationReadings": [] }, "locations": [ { "line": 58, "column": 3 } ], "message": "You exceeded your maximum allowed provisioned throughput for a table or for one or more global secondary indexes. (...)" } ] }