

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

# AWS AppSync에서 HTTP 해석기 사용
<a name="tutorial-http-resolvers-js"></a>

AWS AppSync를 사용하면 지원되는 데이터 소스(즉 AWS Lambda, Amazon DynamoDB, Amazon OpenSearch Service 또는 Amazon Aurora)를 사용하여 GraphQL 필드를 해결하기 위한 임의의 HTTP 엔드포인트 외에도 다양한 작업을 수행할 수 있습니다. HTTP 엔드포인트가 사용 가능해진 후에는 데이터 원본에 연결할 수 있습니다. 쿼리, 변형 및 구독 등 GraphQL 작업을 수행하도록 스키마의 해석기를 구성할 수 있습니다. 이 자습서에서는 몇 가지 일반적인 예제를 살펴봅니다.

이 자습서에서는 AWS AppSync GraphQL 엔드포인트에 REST API(Amazon API Gateway 및 Lambda를 사용하여 생성)를 사용합니다.

## REST API 만들기
<a name="creating-a-rest-api"></a>

다음 AWS CloudFormation 템플릿을 사용하여이 자습서에서 작동하는 REST 엔드포인트를 설정할 수 있습니다.

[https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/http/http-api-gw.yaml](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/http/http-api-gw.yaml)

 AWS CloudFormation 스택은 다음 단계를 수행합니다.

1. 마이크로서비스에 대한 비즈니스 로직이 포함된 Lambda 함수를 설정합니다.

1. 다음 엔드포인트/메서드/콘텐츠 유형 조합으로 API Gateway REST API를 설정합니다.


****  

| API 리소스 경로 | HTTP 메서드 | 지원되는 콘텐츠 유형 | 
| --- | --- | --- | 
|  /v1/사용자  |  POST  |  application/json  | 
|  /v1/사용자  |  GET  |  application/json  | 
|  /v1/사용자/1  |  GET  |  application/json  | 
|  /v1/사용자/1  |  PUT  |  application/json  | 
|  /v1/사용자/1  |  DELETE  |  application/json  | 

## GraphQL API 생성
<a name="creating-your-graphql-api"></a>

 AWS AppSync에서 GraphQL API를 생성하려면:

1.  AWS AppSync 콘솔을 열고 **API 생성을** 선택합니다.

1. **GraphQL API**를 선택한 다음 **처음부터 새로 디자인**을 선택합니다. **다음**을 선택합니다.

1. API에 `UserData`를 입력합니다. **다음**을 선택합니다.

1. `Create GraphQL resources later`을 선택합니다. **다음**을 선택합니다.

1. 입력 내용을 검토하고 **API 생성**을 선택합니다.

 AWS AppSync 콘솔은 API 키 인증 모드를 사용하여 새 GraphQL API를 생성합니다. 콘솔을 사용하여 GraphQL API를 추가로 구성하고 요청을 실행할 수 있습니다.

## GraphQL 스키마 생성
<a name="creating-a-graphql-schema"></a>

GraphQL API가 마련되었으면 GraphQL 스키마를 생성해 보십시오. AWS AppSync 콘솔의 **스키마** 편집기에서 아래 코드 조각을 사용합니다.

```
type Mutation {
    addUser(userInput: UserInput!): User
    deleteUser(id: ID!): User
}

type Query {
    getUser(id: ID): User
    listUser: [User!]!
}

type User {
    id: ID!
    username: String!
    firstname: String
    lastname: String
    phone: String
    email: String
}

input UserInput {
    id: ID!
    username: String!
    firstname: String
    lastname: String
    phone: String
    email: String
}
```

## HTTP 데이터 소스 구성
<a name="configure-your-http-data-source"></a>

HTTP 데이터 원본을 구성하려면 다음을 수행하십시오.

1.  AWS AppSync GraphQL API의 **데이터 소스** 페이지에서 **데이터 소스 생성을** 선택합니다.

1. 데이터 소스의 이름(예: `HTTP_Example`)을 입력합니다.

1. **데이터 소스 유형**에서 **HTTP 엔드포인트**를 선택합니다.

1. 자습서의 시작 부분에서 생성한 API 게이트웨이 엔드포인트로 엔드포인트를 설정합니다. Lambda 콘솔로 이동하여 **애플리케이션**에서 애플리케이션을 찾으면 스택에서 생성된 엔드포인트를 찾을 수 있습니다. 애플리케이션의 설정에서 AWS AppSync의 엔드포인트가 될 **API 엔드포인트**를 확인할 수 있습니다. 단계 이름을 엔드포인트의 일부로 포함하지 않았는지 확인합니다. 예를 들어 엔드포인트가 `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com/v1`인 경우 `https://aaabbbcccd.execute-api.us-east-1.amazonaws.com`을 입력합니다.

**참고**  
현재 퍼블릭 엔드포인트만 AWS AppSync에서 지원됩니다.  
 AWS AppSync 서비스에서 인식하는 인증 기관에 대한 자세한 내용은 [HTTPS 엔드포인트에 AWS AppSync 대해에서 인식하는 인증 기관(CA)을 참조하세요](http-cert-authorities.md#aws-appsync-http-certificate-authorities).

## 해석기 구성
<a name="configuring-resolvers"></a>

이 단계에서는 HTTP 데이터 소스를 `getUser` 및 `addUser` 쿼리에 연결합니다.

`getUser` 해석기를 설정하려면:

1.  AWS AppSync GraphQL API에서 **스키마** 탭을 선택합니다.

1. **스키마** 편집기의 오른쪽에 있는 **해석기** 창의 **쿼리** 유형 아래에서 `getUser` 필드를 찾아 **연결**을 선택합니다.

1. 해석기 유형을 `Unit`으로 유지하고 런타임을 `APPSYNC_JS`로 유지합니다.

1. **데이터 소스 이름**에서 이전에 만든 HTTP 엔드포인트를 선택합니다.

1. **생성(Create)**을 선택합니다.

1. **해석기** 코드 편집기에서 다음 코드 조각을 요청 핸들러로 추가합니다.

   ```
   import { util } from '@aws-appsync/utils'
   
   export function request(ctx) {
   	return {
   		version: '2018-05-29',
   		method: 'GET',
   		params: {
   			headers: {
   				'Content-Type': 'application/json',
   			},
   		},
   		resourcePath: `/v1/users/${ctx.args.id}`,
   	}
   }
   ```

1. 다음 코드 조각을 응답 핸들러로 추가합니다.

   ```
   export function response(ctx) {
   	const { statusCode, body } = ctx.result
   	// if response is 200, return the response
   	if (statusCode === 200) {
   		return JSON.parse(body)
   	}
   	// if response is not 200, append the response to error block.
   	util.appendError(body, statusCode)
   }
   ```

1. **쿼리** 탭을 선택한 후, 다음 쿼리를 실행합니다.

   ```
   query GetUser{
       getUser(id:1){
           id
           username
       }
   }
   ```

   그러면 다음과 같은 응답이 반환됩니다.

   ```
   {
       "data": {
           "getUser": {
               "id": "1",
               "username": "nadia"
           }
       }
   }
   ```

`addUser` 해석기를 설정하려면:

1. **스키마** 탭을 선택합니다.

1. **스키마** 편집기의 오른쪽에 있는 **해석기** 창의 **쿼리** 유형 아래에서 `addUser` 필드를 찾아 **연결**을 선택합니다.

1. 해석기 유형을 `Unit`으로 유지하고 런타임을 `APPSYNC_JS`로 유지합니다.

1. **데이터 소스 이름**에서 이전에 만든 HTTP 엔드포인트를 선택합니다.

1. **생성(Create)**을 선택합니다.

1. **해석기** 코드 편집기에서 다음 코드 조각을 요청 핸들러로 추가합니다.

   ```
   export function request(ctx) {
       return {
           "version": "2018-05-29",
           "method": "POST",
           "resourcePath": "/v1/users",
           "params":{
               "headers":{
                   "Content-Type": "application/json"
               },
           "body": ctx.args.userInput
           }
       }
   }
   ```

1. 다음 코드 조각을 응답 핸들러로 추가합니다.

   ```
   export function response(ctx) {
       if(ctx.error) {
           return util.error(ctx.error.message, ctx.error.type)
       }
       if (ctx.result.statusCode == 200) {
           return ctx.result.body
       } else {
           return util.appendError(ctx.result.body, "ctx.result.statusCode")
       }
   }
   ```

1. **쿼리** 탭을 선택한 후, 다음 쿼리를 실행합니다.

   ```
   mutation addUser{
       addUser(userInput:{
           id:"2",
           username:"shaggy"
       }){
           id
           username
       }
   }
   ```

   `getUser` 쿼리를 다시 실행하면 다음과 같은 응답이 반환되어야 합니다.

   ```
   {
       "data": {
           "getUser": {
           "id": "2",
           "username": "shaggy"
           }
       }
   }
   ```

## AWS 서비스 호출
<a name="invoking-aws-services-js"></a>

HTTP 해석기를 사용하여 AWS 서비스에 대한 GraphQL API 인터페이스를 설정할 수 있습니다. 가 보낸 사람을 AWS 식별할 수 있도록에 대한 HTTP 요청은 [서명 버전 4 프로세스](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)로 서명해야 AWS 합니다. AWS AppSync는 IAM 역할을 HTTP 데이터 소스와 연결할 때 사용자를 대신하여 서명을 계산합니다.

HTTP 해석기를 사용하여 AWS 서비스를 호출하기 위한 두 가지 추가 구성 요소를 제공합니다.
+  AWS 서비스 APIs를 호출할 권한이 있는 IAM 역할
+ 데이터 원본의 서명 구성

예를 들어 HTTP 해석기를 사용하여 [ListGraphqlApis 작업을](https://docs.aws.amazon.com/appsync/latest/APIReference/API_ListGraphqlApis.html) 호출하려면 먼저 다음 정책이 연결된 상태에서 AWS AppSync가 수임하는 [IAM 역할을 생성합니다](attaching-a-data-source.md#aws-appsync-getting-started-build-a-schema-from-scratch).

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "appsync:ListGraphqlApis"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

------

그런 다음 AWS AppSync용 HTTP 데이터 소스를 생성합니다. 이 예에서는 미국 서부(오레곤) 리전에서 AWS AppSync를 호출합니다. 서명 리전과 서비스 이름이 포함된 `http.json`이라는 파일에서 다음 HTTP 구성을 설정합니다.

```
{
    "endpoint": "https://appsync.us-west-2.amazonaws.com/",
    "authorizationConfig": {
        "authorizationType": "AWS_IAM",
        "awsIamConfig": {
            "signingRegion": "us-west-2",
            "signingServiceName": "appsync"
        }
    }
}
```

그런 다음 AWS CLI 를 사용하여 다음과 같이 연결된 역할이 있는 데이터 소스를 생성합니다.

```
aws appsync create-data-source --api-id <API-ID> \
                               --name AWSAppSync \
                               --type HTTP \
                               --http-config file:///http.json \
                               --service-role-arn <ROLE-ARN>
```

스키마의 필드에 해석기를 연결할 때 다음 요청 매핑 템플릿을 사용하여 AWS AppSync를 호출합니다.

```
{
    "version": "2018-05-29",
    "method": "GET",
    "resourcePath": "/v1/apis"
}
```

이 데이터 소스에 대해 GraphQL 쿼리를 실행하면 AWS AppSync는 사용자가 제공한 역할을 사용하여 요청에 서명하고 요청에 서명을 포함합니다. 쿼리는 해당 AWS 리전의 계정에 있는 AWS AppSync GraphQL APIs 목록을 반환합니다.