기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
에서 파이프라인 해석기 사용 AWS AppSync
참고
이제 APPSYNC_JS 런타임과 해당 설명서를 주로 지원합니다. 여기에서 APPSYNC_JS 런타임 및 해당 가이드를 사용하는 것이 좋습니다.
AWS AppSync 는 단위 해석기를 통해 GraphQL 필드를 단일 데이터 소스에 연결하는 간단한 방법을 제공합니다. 그러나 단일 작업을 실행하는 것만으로는 충분하지 않을 수 있습니다. 파이프라인 해석기는 데이터 원본에 대해 작업을 순차적으로 실행하는 기능을 제공합니다. 에서 함수를 생성하고 파이프라인 해석기에 API 연결합니다. 각 함수 실행 결과는 실행할 함수가 없을 때까지 다음으로 전송됩니다. 파이프라인 해석기를 사용하면 이제 에서 직접 더 복잡한 워크플로를 구축할 수 있습니다 AWS AppSync. 이 자습서에서는 사용자가 사진을 게시하고, 친구들이 공유한 사진을 볼 수 있는 간단한 사진 보기 앱을 빌드합니다.
원클릭 설치
모든 해석기와 필요한 AWS 리소스를 구성 AWS AppSync 한 상태에서 GraphQL 엔드포인트를 에 자동으로 설정하려면 다음 AWS CloudFormation 템플릿을 사용할 수 있습니다.
이 스택은 계정에 다음 리소스를 생성합니다.
-
IAM AWS AppSync 가 계정의 리소스에 액세스하는 역할
-
DynamoDB 테이블 2개
-
Amazon Cognito 사용자 풀 1개
-
Amazon Cognito 사용자 풀 그룹 2개
-
Amazon Cognito 사용자 풀 사용자 3명
-
1 AWS AppSync API
AWS CloudFormation 스택 생성 프로세스가 끝나면 생성된 3명의 Amazon Cognito 사용자 각각에 대해 하나의 이메일을 받게 됩니다. 각 이메일에는 AWS AppSync 콘솔에 Amazon Cognito 사용자로 로그인하는 데 사용하는 임시 암호가 포함되어 있습니다. 자습서의 나머지 부분에서 사용할 수 있도록 암호를 저장해 둡니다.
수동 설정
콘솔을 step-by-step 통해 AWS AppSync 수동으로 프로세스를 진행하려면 아래 설정 프로세스를 따르세요.
비 AWS AppSync 리소스 설정
는 두 DynamoDB 테이블, 즉 사진을 저장하는 사진 테이블과 사용자 간 관계를 저장하는 친구 테이블과 API 통신합니다. API 는 Amazon Cognito 사용자 풀을 인증 유형으로 사용하도록 구성됩니다. 다음 AWS CloudFormation 스택은 계정에 이러한 리소스를 설정합니다.
AWS CloudFormation 스택 생성 프로세스가 끝나면 생성된 3명의 Amazon Cognito 사용자 각각에 대해 하나의 이메일을 받게 됩니다. 각 이메일에는 콘솔에 Amazon Cognito 사용자로 로그인하는 데 사용하는 임시 암호가 AWS AppSync 포함되어 있습니다. 자습서의 나머지 부분에서 사용할 수 있도록 암호를 저장해 둡니다.
GraphQL 생성 API
에서 GraphQLAPI을 생성하려면 AWS AppSync:
-
AWS AppSync 콘솔을 열고 스크래치에서 빌드를 선택한 다음 시작을 선택합니다.
-
의 이름을 API로 설정합니다
AppSyncTutorial-PicturesViewer
. -
생성(Create)을 선택합니다.
AWS AppSync 콘솔은 API 키 인증 모드를 API 사용하여 새 GraphQL을 생성합니다. 콘솔을 사용하여 나머지 GraphQL을 설정하고 이 자습서의 나머지 부분에 대해 쿼리를 API 실행할 수 있습니다.
GraphQL 구성 API
방금 생성한 Amazon Cognito 사용자 풀로 AWS AppSync API를 구성해야 합니다.
-
설정 탭을 선택합니다.
-
Authorization Type(권한 부여 유형) 섹션에서 Amazon Cognito User Pool(Amazon Cognito 사용자 풀)을 선택합니다.
-
사용자 풀 구성에서 AWS 리전 에 대해 US-WEST-2를 선택합니다.
-
AppSyncTutorial-UserPool 사용자 풀을 선택합니다.
-
기본 작업DENY으로 를 선택합니다.
-
AppId 클라이언트 정규식 필드를 비워 둡니다.
-
저장(Save)을 선택합니다.
이제 API가 Amazon Cognito 사용자 풀을 권한 부여 유형으로 사용하도록 설정되었습니다.
DynamoDB 테이블에 대한 데이터 소스 구성
DynamoDB 테이블이 생성되면 콘솔API에서 AWS AppSync GraphQL로 이동하여 데이터 소스 탭을 선택합니다. 이제 방금 생성한 각 DynamoDB 테이블에 AWS AppSync 대해 에서 데이터 소스를 생성하려고 합니다.
-
데이터 원본 탭을 선택합니다.
-
새로 만들기를 선택하여 새 데이터 원본을 생성합니다.
-
데이터 원본 이름에
PicturesDynamoDBTable
을 입력합니다. -
Data Source Type(데이터 원본 유형)으로 Amazon DynamoDB table(Amazon DynamoDB 테이블)을 선택합니다.
-
리전에서 US-WEST-2를 선택합니다.
-
테이블 목록에서 AppSyncTutorial-Pictures DynamoDB 테이블을 선택합니다.
-
새 역할 생성 또는 기존 역할 사용 섹션에서 기존 역할을 선택합니다.
-
CloudFormation 템플릿에서 방금 생성한 역할을 선택합니다. 를 변경하지 않은 경우 역할 ResourceNamePrefix이름은 AppSyncTutorial-DynamoDBRole 여야 합니다.
-
생성(Create)을 선택합니다.
친구 테이블에 대해 동일한 프로세스를 반복합니다. CloudFormation 스택을 생성할 때 ResourceNamePrefix 파라미터를 변경하지 않은 경우 DynamoDB 테이블의 이름은 AppSyncTutorial-Friends여야 합니다.
GraphQL 스키마 생성
이제 데이터 소스가 DynamoDB 테이블에 연결되었으며 GraphQL 스키마를 생성해 보겠습니다. AWS AppSync 콘솔의 스키마 편집기에서 스키마가 다음 스키마와 일치하는지 확인합니다.
schema { query: Query mutation: Mutation } type Mutation { createPicture(input: CreatePictureInput!): Picture! @aws_auth(cognito_groups: ["Admins"]) createFriendship(id: ID!, target: ID!): Boolean @aws_auth(cognito_groups: ["Admins"]) } type Query { getPicturesByOwner(id: ID!): [Picture] @aws_auth(cognito_groups: ["Admins", "Viewers"]) } type Picture { id: ID! owner: ID! src: String } input CreatePictureInput { owner: ID! src: String! }
스키마를 저장하려면 Save Schema(스키마 저장)를 선택합니다.
일부 스키마 필드에는 @aws_auth 명령으로 주석이 달려 있습니다. API 기본 작업 구성이 로 설정되어 있으므로 DENY는 @aws_auth 지시문에 언급된 그룹의 구성원이 아닌 모든 사용자를 API 거부합니다. 를 보호하는 방법에 대한 자세한 내용은 보안 페이지를 참조API하세요. 이 경우 관리자 사용자만 Mutation.createPicture 및 Mutation.createFriendship 필드에 액세스할 수 있으며 관리자 또는 뷰어 그룹의 구성원인 사용자는 Query.getPicturesByOwner 필드에 액세스할 수 있습니다. 다른 모든 사용자는 액세스 권한이 없습니다.
해석기 구성
이제 유효한 GraphQL 스키마와 데이터 원본이 2개 있으므로 해석기를 스키마에 대한 GraphQL 필드에 연결할 수 있습니다. 는 다음 기능을 API 제공합니다.
-
MutationcreatePicture 필드를 통해 사진 생성
-
Mutation. 필드를 통해 우정을 형성합니다.createFriendship
-
쿼리getPicture 필드를 통해 사진 검색
돌연변이.createPicture
AWS AppSync 콘솔의 스키마 편집기에서 오른쪽에서 에 대한 해석기 연결을 선택합니다createPicture(input: CreatePictureInput!): Picture!
. DynamoDBPicturesDynamoDBTable 데이터 소스를 선택합니다. 요청 매핑 템플릿 섹션에 다음 템플릿을 추가합니다.
#set($id = $util.autoId()) { "version" : "2018-05-29", "operation" : "PutItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($id), "owner": $util.dynamodb.toDynamoDBJson($ctx.args.input.owner) }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args.input) }
응답 매핑 템플릿 섹션에 다음 템플릿을 추가합니다.
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end $util.toJson($ctx.result)
사진 생성 기능이 완료되었습니다. 사진 테이블에 사진을 저장하고, 무작위로 생성된 를 사진의 IDUUID로 사용하고, Cognito 사용자 이름을 사진의 소유자로 사용합니다.
돌연변이.createFriendship
AWS AppSync 콘솔의 스키마 편집기에서 오른쪽에서 에 대한 해석기 연결을 선택합니다createFriendship(id: ID!, target: ID!): Boolean
. DynamoDBFriendsDynamoDBTable 데이터 소스를 선택합니다. 요청 매핑 템플릿 섹션에 다음 템플릿을 추가합니다.
#set($userToFriendFriendship = { "userId" : "$ctx.args.id", "friendId": "$ctx.args.target" }) #set($friendToUserFriendship = { "userId" : "$ctx.args.target", "friendId": "$ctx.args.id" }) #set($friendsItems = [$util.dynamodb.toMapValues($userToFriendFriendship), $util.dynamodb.toMapValues($friendToUserFriendship)]) { "version" : "2018-05-29", "operation" : "BatchPutItem", "tables" : { ## Replace 'AppSyncTutorial-' default below with the ResourceNamePrefix you provided in the CloudFormation template "AppSyncTutorial-Friends": $util.toJson($friendsItems) } }
중요: BatchPutItem 요청 템플릿에는 DynamoDB 테이블의 정확한 이름이 있어야 합니다. 기본 테이블 이름은 AppSyncTutorial-Friends 입니다. 잘못된 테이블 이름을 사용하는 경우 가 제공된 역할을 맡으 AppSync 려고 할 때 오류가 발생합니다.
이 자습서의 단순성을 위해 우정 요청이 승인된 것처럼 진행하고 관계 항목을 AppSyncTutorialFriends 테이블에 직접 저장합니다.
효율적으로, 관계는 양방향이기 때문에 각 친구 관계에 대해 항목 2개를 저장합니다. many-to-many 관계를 나타내는 Amazon DynamoDB 모범 사례에 대한 자세한 내용은 DynamoDB 모범 사례 섹션을 참조하세요.
응답 매핑 템플릿 섹션에 다음 템플릿을 추가합니다.
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end true
참고: 요청 템플릿에 올바른 테이블 이름이 포함되어 있는지 확인합니다. 기본 이름은 AppSyncTutorial-Friends이지만 파라미터를 변경하면 테이블 이름이 다를 수 있습니다 CloudFormation ResourceNamePrefix.
Query.getPicturesByOwner
이제, 친구 관계 및 사진이 있으므로 사용자가 친구의 사진을 볼 수 있는 기능을 제공해야 합니다. 이러한 요구 사항을 충족하기 위해 먼저 요청자가 소유자의 친구인지 확인하고 마지막으로 사진을 쿼리해야 합니다.
이 기능에는 두 가지 데이터 원본 작업이 필요하기 때문에 함수 2개를 생성해 보겠습니다. 첫 번째 함수인 는 요청자와 소유자가 친구인지 isFriend확인합니다. 두 번째 함수인 getPicturesBy소유자 는 소유자 ID가 지정된 요청된 사진을 검색합니다. Query.getPicturesByOwner 필드에서 제안된 해석기에 대한 실행 흐름을 살펴보겠습니다.
-
Before 매핑 템플릿: 컨텍스트와 필드 입력 파라미터를 준비합니다.
-
isFriend 함수: 요청자가 사진의 소유자인지 확인합니다. 그렇지 않은 경우 친구 테이블에서 DynamoDB GetItem 작업을 수행하여 요청자와 소유자 사용자가 친구인지 확인합니다.
-
getPicturesBy소유자 함수: 소유자 인덱스 글로벌 보조 인덱스에서 DynamoDB 쿼리 작업을 사용하여 사진 테이블에서 사진을 검색합니다.
-
After 매핑 템플릿: DynamoDB 속성이 예상되는 GraphQL 유형 필드에 정확하게 매핑되도록 사진 결과를 매핑합니다.
먼저 함수를 생성해 보겠습니다.
isFriend 함수
-
Functions(함수) 탭을 선택합니다.
-
Create Function(함수 생성)을 선택하여 함수를 생성합니다.
-
데이터 원본 이름에
FriendsDynamoDBTable
을 입력합니다. -
함수 이름으로 isFriend를 입력합니다.
-
요청 매핑 템플릿의 텍스트 영역 내에서 다음 템플릿을 붙여 넣습니다.
#set($ownerId = $ctx.prev.result.owner) #set($callerId = $ctx.prev.result.callerId) ## if the owner is the caller, no need to make the check #if($ownerId == $callerId) #return($ctx.prev.result) #end { "version" : "2018-05-29", "operation" : "GetItem", "key" : { "userId" : $util.dynamodb.toDynamoDBJson($callerId), "friendId" : $util.dynamodb.toDynamoDBJson($ownerId) } }
-
응답 매핑 템플릿의 텍스트 영역 내에서 다음 템플릿을 붙여 넣습니다.
#if($ctx.error) $util.error("Unable to retrieve friend mapping message: ${ctx.error.message}", $ctx.error.type) #end ## if the users aren't friends #if(!$ctx.result) $util.unauthorized() #end $util.toJson($ctx.prev.result)
-
Create Function(함수 생성)을 선택합니다.
결과: isFriend 함수를 생성했습니다.
getPicturesBy소유자 함수
-
Functions(함수) 탭을 선택합니다.
-
Create Function(함수 생성)을 선택하여 함수를 생성합니다.
-
데이터 원본 이름에
PicturesDynamoDBTable
을 입력합니다. -
함수 이름으로
getPicturesByOwner
를 입력합니다. -
요청 매핑 템플릿의 텍스트 영역 내에서 다음 템플릿을 붙여 넣습니다.
{ "version" : "2018-05-29", "operation" : "Query", "query" : { "expression": "#owner = :owner", "expressionNames": { "#owner" : "owner" }, "expressionValues" : { ":owner" : $util.dynamodb.toDynamoDBJson($ctx.prev.result.owner) } }, "index": "owner-index" }
-
응답 매핑 템플릿의 텍스트 영역 내에서 다음 템플릿을 붙여 넣습니다.
#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end $util.toJson($ctx.result)
-
Create Function(함수 생성)을 선택합니다.
결과: getPicturesBy소유자 함수를 생성했습니다. 이제 함수가 생성되었으므로 Query.getPicturesByOwner 필드에 파이프라인 해석기를 연결합니다.
AWS AppSync 콘솔의 스키마 편집기에서 오른쪽에서 에 대한 해석기 연결을 선택합니다Query.getPicturesByOwner(id: ID!): [Picture]
. 다음 페이지에서는 데이터 원본 드롭다운 목록에 아래에 표시되는 Convert to pipeline resolver(파이프라인 해석기로 변환) 링크를 선택합니다. Before 매핑 템플릿에 다음을 사용합니다.
#set($result = { "owner": $ctx.args.id, "callerId": $ctx.identity.username }) $util.toJson($result)
after mapping template(사후 매핑 템플릿) 섹션에서 다음을 사용합니다.
#foreach($picture in $ctx.result.items) ## prepend "src://" to picture.src property #set($picture['src'] = "src://${picture['src']}") #end $util.toJson($ctx.result.items)
Create Resolver(해석기 생성)를 선택합니다. 이제 첫 번째 파이프라인 해석기를 성공적으로 연결했습니다. 동일한 페이지에서 이전에 생성한 함수 2개를 추가합니다. 함수 섹션에서 함수 추가를 선택한 다음 첫 번째 함수의 이름인 를 선택하거나 입력합니다isFriend. getPicturesBy소유자 함수에 대해 동일한 프로세스에 따라 두 번째 함수를 추가합니다. isFriend 함수가 목록에서 먼저 나타난 다음 getPicturesBy소유자 함수가 나타나는지 확인합니다. 위쪽 및 아래쪽 화살표를 사용하여 파이프라이니 내 함수의 실행 순서를 다시 정렬할 수 있습니다.
이제 파이프라인 해석기가 생성되고 함수를 연결했으므로 새로 생성된 GraphQL 을 테스트해 보겠습니다API.
GraphQL 테스트 API
먼저, 생성한 관리자 사용자를 사용하여 몇 가지 변형을 실행해 사진과 친구 관계를 채워야 합니다. AWS AppSync 콘솔 왼쪽에서 쿼리 탭을 선택합니다.
createPicture 돌연변이
-
AWS AppSync 콘솔에서 쿼리 탭을 선택합니다.
-
Login With User Pools(사용자 풀로 로그인)를 선택합니다.
-
모달에 CloudFormation 스택에서 생성된 Cognito 샘플 클라이언트 ID를 입력합니다. 예를 들어 37solo6mmhh7k4v63cqdfgdg5d)가 있습니다.
-
CloudFormation 스택에 파라미터로 전달한 사용자 이름을 입력합니다. 기본값은 nadia입니다.
-
CloudFormation 스택에 파라미터로 제공한 이메일에 전송된 임시 암호를 사용합니다(예: UserPoolUserEmail).
-
로그인을 선택합니다. 이제 버튼이 로그아웃 nadia 로 이름이 바뀌거나 CloudFormation 스택을 생성할 때 선택한 사용자 이름(즉, )이 표시됩니다UserPoolUsername.
몇 가지 createPicture 돌연변이를 보내 그림 테이블을 채우도록 하겠습니다. 콘솔 내에서 다음 GraphQL 쿼리를 실행합니다.
mutation { createPicture(input:{ owner: "nadia" src: "nadia.jpg" }) { id owner src } }
응답은 아래와 같아야 합니다.
{ "data": { "createPicture": { "id": "c6fedbbe-57ad-4da3-860a-ffe8d039882a", "owner": "nadia", "src": "nadia.jpg" } } }
사진을 몇 개 더 추가해 보겠습니다.
mutation { createPicture(input:{ owner: "shaggy" src: "shaggy.jpg" }) { id owner src } }
mutation { createPicture(input:{ owner: "rex" src: "rex.jpg" }) { id owner src } }
nadia를 관리자 사용자로 사용하여 사진을 3개 더 추가했습니다.
createFriendship 돌연변이
친구 관계 항목을 추가해 보겠습니다. 콘솔에서 다음 변형을 실행합니다.
참고: 관리자 사용자로 로그인한 상태여야 합니다(기본 관리자 사용자: nadia).
mutation { createFriendship(id: "nadia", target: "shaggy") }
응답이 다음과 같아야 합니다.
{ "data": { "createFriendship": true } }
nadia 및 shaggy는 친구이지만 rex는 그 누구와도 친구가 아닙니다.
getPicturesBy소유자 쿼리
이 단계에서는 Cognito 사용자 풀과 이 자습서 초반에 설정한 자격 증명을 사용하여 nadia로 로그인합니다. nadia로 shaggy가 소유하고 있는 사진을 검색합니다.
query { getPicturesByOwner(id: "shaggy") { id owner src } }
nadia와 shaggy는 친구이기 때문에 이 쿼리는 해당하는 사진을 반환해야 합니다.
{ "data": { "getPicturesByOwner": [ { "id": "05a16fba-cc29-41ee-a8d5-4e791f4f1079", "owner": "shaggy", "src": "src://shaggy.jpg" } ] } }
마찬가지로, nadia가 자신의 사진을 검색하려고 하는 경우에도 성공합니다. 파이프라인 해석기는 이 경우 isFriend GetItem 작업이 실행되지 않도록 최적화되었습니다. 다음 쿼리를 시도해 보십시오.
query { getPicturesByOwner(id: "nadia") { id owner src } }
API (설정 창에서)에 대한 로깅을 활성화ALL하고 디버그 수준을 로 설정한 다음 동일한 쿼리를 다시 실행하면 필드 실행에 대한 로그가 반환됩니다. 로그를 보면 isFriend 함수가 요청 매핑 템플릿 단계에서 조기에 반환되었는지 확인할 수 있습니다.
{ "errors": [], "mappingTemplateType": "Request Mapping", "path": "[getPicturesByOwner]", "resolverArn": "arn:aws:appsync:us-west-2:XXXX:apis/XXXX/types/Query/fields/getPicturesByOwner", "functionArn": "arn:aws:appsync:us-west-2:XXXX:apis/XXXX/functions/o2f42p2jrfdl3dw7s6xub2csdfs", "functionName": "isFriend", "earlyReturnedValue": { "owner": "nadia", "callerId": "nadia" }, "context": { "arguments": { "id": "nadia" }, "prev": { "result": { "owner": "nadia", "callerId": "nadia" } }, "stash": {}, "outErrors": [] }, "fieldInError": false }
earlyReturnedValue 키는 #return directive에서 반환한 데이터를 나타냅니다.
마지막으로, rex가 Viewers Cognito UserPool 그룹의 멤버이고 rex가 아무와도 친구가 아니기 때문에 shaggy 또는 nadia가 소유한 사진에 액세스할 수 없습니다. 콘솔에서 rex로 로그인해 다음 쿼리를 실행해 보십시오.
query { getPicturesByOwner(id: "nadia") { id owner src } }
다음과 같은 권한 없음 오류가 발생합니다.
{ "data": { "getPicturesByOwner": null }, "errors": [ { "path": [ "getPicturesByOwner" ], "data": null, "errorType": "Unauthorized", "errorInfo": null, "locations": [ { "line": 2, "column": 9, "sourceName": null } ], "message": "Not Authorized to access getPicturesByOwner on type Query" } ] }
지금까지 파이프라인 해석기를 사용하여 복잡한 권한 부여를 성공적으로 구현해 보았습니다.