AWS AppSync JavaScript 해석기 컨텍스트 객체 참조 - AWS AppSync

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

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 함께 를 사용하여 단일 또는 다중 요청 헤더를 사용할 수 있습니다.

단일 헤더의 예

다음과 같이 값이 nadiacustom의 헤더를 설정한다고 가정해 보겠습니다.

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는 문자열 직렬화에 selectionSetGraphQLselectionSetList를 포함하지 않습니다. 이러한 속성은 사용자가 직접 참조해야 합니다.

예를 들어, 다음 쿼리의 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" ]