기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS AppSync JavaScript 해석기 컨텍스트 객체 참조
AWS AppSync 는 요청 및 응답 핸들러 작업을 위한 변수 및 함수 집합을 정의합니다. 이렇게 하면 GraphQL을 사용하는 데이터에 대한 논리적 조작이 더 쉬워집니다. 이 문서에서는 이러한 함수를 설명하고 예를 제공합니다.
context
에 액세스
요청 및 응답 핸들러의 context
인수는 해석기 호출에 대한 모든 컨텍스트 정보를 포함하는 객체입니다. 이 변수의 구조는 다음과 같습니다.
type Context = { arguments: any; args: any; identity: Identity; source: any; error?: { message: string; type: string; }; stash: any; result: any; prev: any; request: Request; info: Info; };
참고
context
객체를 ctx
라고 부르는 경우가 종종 있습니다.
context
객체의 각 필드는 다음과 같이 정의됩니다.
context
필드
-
arguments
-
이 필드에 대한 모든 GraphQL 인수를 포함하는 맵입니다.
-
identity
-
호출자에 대한 정보를 포함하는 객체입니다. 이 필드의 구조에 대한 자세한 내용은 자격 증명을 참조하십시오.
-
source
-
상위 필드의 해결 방법을 포함하는 맵입니다.
-
stash
-
stash는 각 해석기 및 함수 핸들러 내에서 사용할 수 있는 객체입니다. 단일 해석기가 실행되는 동안에는 동일한 stash 객체가 사용됩니다. 즉, stash를 사용하여 요청 및 응답 핸들러와 파이프라인 해석기의 함수 간에 임의의 데이터를 전달할 수 있습니다.
참고
전체 stash를 삭제하거나 바꿀 수는 없지만 stash의 속성을 추가, 업데이트, 삭제 및 읽을 수는 있습니다.
아래 코드 예제 중 하나를 수정하여 stash에 항목을 추가할 수 있습니다.
//Example 1 ctx.stash.newItem = { key: "something" } //Example 2 Object.assign(ctx.stash, {key1: value1, key2: value})
아래 코드를 수정하여 stash에서 항목을 제거할 수 있습니다.
delete ctx.stash.key
-
result
-
해석기의 결과를 포함하고 있는 컨테이너입니다. 이 필드는 응답 핸들러만 사용할 수 있습니다.
예를 들어, 다음 쿼리의
author
필드를 해석하는 경우:query { getPost(id: 1234) { postId title content author { id name } } }
그러면 응답 핸들러를 평가할 때 전체
context
변수를 사용할 수 있습니다.{ "arguments" : { id: "1234" }, "source": {}, "result" : { "postId": "1234", "title": "Some title", "content": "Some content", "author": { "id": "5678", "name": "Author Name" } }, "identity" : { "sourceIp" : ["x.x.x.x"], "userArn" : "arn:aws:iam::123456789012:user/appsync", "accountId" : "666666666666", "user" : "AIDAAAAAAAAAAAAAAAAAA" } }
-
prev.result
-
파이프라인 해석기에서 실행된 이전 작업의 결과입니다.
이전 작업이 파이프라인 해석기의 요청 처리기였던 경우
ctx.prev.result
는 해당 평가 결과를 나타내며 파이프라인의 첫 번째 함수에서 사용할 수 있게 됩니다.이전 작업이 첫 번째 함수인 경우
ctx.prev.result
는 첫 번째 함수 응답 핸들러의 평가 결과를 나타내며 파이프라인의 두 번째 함수에서 사용할 수 있게 됩니다.이전 작업이 마지막 함수인 경우
ctx.prev.result
는 마지막 함수의 평가 결과를 나타내며 파이프라인 해석기의 응답 핸들러에서 사용할 수 있게 됩니다. -
info
-
GraphQL 요청에 대한 정보가 포함된 객체입니다. 이 필드의 구조는 정보를 참조하십시오.
자격 증명
identity
섹션에는 호출자에 대한 정보가 포함되어 있습니다. 이 섹션의 모양은 의 권한 부여 유형에 따라 달라집니다 AWS AppSync API.
AWS AppSync 보안 옵션에 대한 자세한 내용은 권한 부여 및 인증을 참조하세요.
-
API_KEY
권한 부여 -
identity
필드는 채워져 있지 않습니다. AWS_LAMBDA
권한 부여-
identity
의 형식은 다음과 같습니다.type AppSyncIdentityLambda = { resolverContext: any; };
identity
에는 요청을 승인하는 Lambda 함수가 반환한 동일한resolverContext
콘텐츠가 포함된resolverContext
키가 포함되어 있습니다. -
AWS_IAM
권한 부여 -
identity
의 형식은 다음과 같습니다.type AppSyncIdentityIAM = { accountId: string; cognitoIdentityPoolId: string; cognitoIdentityId: string; sourceIp: string[]; username: string; userArn: string; cognitoIdentityAuthType: string; cognitoIdentityAuthProvider: string; };
-
AMAZON_COGNITO_USER_POOLS
권한 부여 -
identity
의 형식은 다음과 같습니다.type AppSyncIdentityCognito = { sourceIp: string[]; username: string; groups: string[] | null; sub: string; issuer: string; claims: any; defaultAuthStrategy: string; };
각 필드는 다음과 같이 정의됩니다.
-
accountId
-
호출자의 AWS 계정 ID입니다.
-
claims
-
사용자의 클레임입니다.
-
cognitoIdentityAuthType
-
자격 증명 유형을 기반으로 인증되거나 인증되지 않습니다.
-
cognitoIdentityAuthProvider
-
요청에 서명하는 데 사용되는 보안 인증 정보를 얻는 데 사용되는 외부 자격 증명 공급자 정보를 쉼표로 구분한 목록입니다.
-
cognitoIdentityId
-
호출자의 Amazon Cognito 자격 증명 ID입니다.
-
cognitoIdentityPoolId
-
호출자와 연결된 Amazon Cognito 자격 증명 풀 ID입니다.
-
defaultAuthStrategy
-
이 호출자의 기본 권한 부여 전략(
ALLOW
또는DENY
)입니다. -
issuer
-
토큰 발행자입니다.
-
sourceIp
-
가 AWS AppSync 수신하는 발신자의 소스 IP 주소입니다. 요청에
x-forwarded-for
헤더가 포함되지 않은 경우 소스 IP 값에는 TCP 연결의 단일 IP 주소만 포함됩니다. 요청에x-forwarded-for
헤더가 포함된 경우 소스 IP는 TCP 연결의 IP 주소 외에도x-forwarded-for
헤더의 IP 주소 목록입니다. -
sub
-
인증된 사용자의 UUID.
-
user
-
IAM 사용자입니다.
-
userArn
-
IAM 사용자의 Amazon 리소스 이름(ARN)입니다.
-
username
-
인증된 사용자의 사용자 이름입니다.
AMAZON_COGNITO_USER_POOLS
권한 부여 시 username의 값은 cognito:username 속성의 값입니다.AWS_IAM
권한 부여의 경우 사용자 이름의 값은 AWS 사용자 보안 주체의 값입니다. Amazon Cognito 자격 증명 풀에서 벤딩된 자격 증명으로 IAM 권한 부여를 사용하는 경우 를 사용하는 것이 좋습니다cognitoIdentityId
.
요청 헤더에 액세스
AWS AppSync 는 클라이언트에서 사용자 지정 헤더를 전달하고 를 사용하여 GraphQL 해석기에서 액세스하도록 지원합니다ctx.request.headers
. 그런 다음 데이터 소스에 데이터 삽입 또는 권한 부여 검사 등과 같은 작업에 헤더 값을 사용할 수 있습니다. 다음 예제와 같이 명령줄의 API 키와 $curl
함께 를 사용하여 단일 또는 다중 요청 헤더를 사용할 수 있습니다.
단일 헤더의 예
다음과 같이 값이 nadia
인 custom
의 헤더를 설정한다고 가정해 보겠습니다.
curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
그러면 ctx.request.headers.custom
을 사용하여 이 헤더에 액세스할 수 있습니다. 예를 들어, DynamoDB에 대한 다음 코드에 있을 수 있습니다.
"custom": util.dynamodb.toDynamoDB(ctx.request.headers.custom)
다중 헤더의 예
또한 단일 요청에서 여러 헤더를 전달하고 해석기 핸들러에서 이러한 헤더에 액세스할 수 있습니다. 예를 들어, custom
헤더가 다음 두 값으로 설정되어 있는 경우:
curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql
이러한 두 값에는 배열(예: ctx.request.headers.custom[1]
)로 액세스할 수 있습니다.
참고
AWS AppSync 는 에서 쿠키 헤더를 노출하지 않습니다ctx.request.headers
.
사용자 지정 도메인 이름 요청 액세스
AWS AppSync 는 의 GraphQL 및 실시간 엔드포인트에 액세스하는 데 사용할 수 있는 사용자 지정 도메인 구성을 지원합니다APIs. 사용자 지정 도메인 이름으로 요청하는 경우 ctx.request.domainName
을 사용하여 도메인 이름을 가져올 수 있습니다.
기본 GraphQL 엔드포인트 도메인 이름을 사용하는 경우 값은 null
입니다.
정보
이 info
섹션에는 GraphQL 요청에 대한 정보가 포함되어 있습니다. 이 섹션은 다음과 같은 형식으로 되어 있습니다.
type Info = { fieldName: string; parentTypeName: string; variables: any; selectionSetList: string[]; selectionSetGraphQL: string; };
각 필드는 다음과 같이 정의됩니다.
-
fieldName
-
현재 확인 중인 필드의 이름입니다.
-
parentTypeName
-
현재 확인 중인 필드에 대한 상위 유형의 이름입니다.
-
variables
-
GraphQL 요청에 전달된 모든 변수를 포함하는 맵입니다.
-
selectionSetList
-
GraphQL 선택 세트에 있는 필드의 목록 표현입니다. 별칭이 있는 필드는 필드 이름이 아닌 별칭 이름으로만 참조됩니다. 다음 예제는 이 구조를 자세히 보여 줍니다.
-
selectionSetGraphQL
-
GraphQL 스키마 정의 언어() 형식의 선택 세트의 문자열 표현입니다SDL. 조각이 선택 세트에 병합되지는 않지만 다음 예제와 같이 인라인 조각은 유지됩니다.
참고
JSON.stringify
는 문자열 직렬화에 selectionSetGraphQL
및 selectionSetList
를 포함하지 않습니다. 이러한 속성은 사용자가 직접 참조해야 합니다.
예를 들어, 다음 쿼리의 getPost
필드를 해석하는 경우:
query { getPost(id: $postId) { postId title secondTitle: title content author(id: $authorId) { authorId name } secondAuthor(id: "789") { authorId } ... on Post { inlineFrag: comments: { id } } ... postFrag } } fragment postFrag on Post { postFrag: comments: { id } }
핸들러를 처리할 때 사용할 수 있는 전체 ctx.info
변수는 다음과 같습니다.
{ "fieldName": "getPost", "parentTypeName": "Query", "variables": { "postId": "123", "authorId": "456" }, "selectionSetList": [ "postId", "title", "secondTitle" "content", "author", "author/authorId", "author/name", "secondAuthor", "secondAuthor/authorId", "inlineFragComments", "inlineFragComments/id", "postFragComments", "postFragComments/id" ], "selectionSetGraphQL": "{\n getPost(id: $postId) {\n postId\n title\n secondTitle: title\n content\n author(id: $authorId) {\n authorId\n name\n }\n secondAuthor(id: \"789\") {\n authorId\n }\n ... on Post {\n inlineFrag: comments {\n id\n }\n }\n ... postFrag\n }\n}" }
selectionSetList
는 현재 유형에 속하는 필드만 노출합니다. 현재 유형이 인터페이스 또는 집합인 경우 인터페이스에 속하는 선택된 필드만 노출됩니다. 예를 들어 다음과 같은 스키마가 있습니다.
type Query { node(id: ID!): Node } interface Node { id: ID } type Post implements Node { id: ID title: String author: String } type Blog implements Node { id: ID title: String category: String }
그리고 다음과 같은 쿼리가 있습니다.
query { node(id: "post1") { id ... on Post { title } ... on Blog { title } } }
Query.node
필드 해상도에서 ctx.info.selectionSetList
를 호출하면 id
만 노출됩니다.
"selectionSetList": [ "id" ]