

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS AppSync での HTTP リゾルバーの使用
<a name="tutorial-http-resolvers"></a>

**注記**  
現在、主に APPSYNC\$1JS ランタイムとそのドキュメントをサポートしています。[こちら](https://docs.aws.amazon.com/appsync/latest/devguide/tutorials-js.html) で APPSYNC\$1JS ランタイムとそのガイドの使用をご検討ください。

AWS AppSync を使用すると、サポートされているデータソース (Amazon DynamoDB AWS Lambda、Amazon OpenSearch Service、または Amazon Aurora) を使用して、GraphQL フィールドを解決するための任意の HTTP エンドポイントに加えて、さまざまなオペレーションを実行できます。HTTP エンドポイントが利用可能になったら、データソースを使用してこれに接続できます。その後、クエリ、ミューテーション、およびサブスクリプションなどの GraphQL オペレーションを実行するために、スキーマ内のリゾルバーを設定できます。このチュートリアルでは、いくつかの一般的な例を説明します。

このチュートリアルでは、 AWS AppSync GraphQL エンドポイントで REST API (Amazon API Gateway と Lambda により作成) を使用します。

## ワンクリックでのセットアップ
<a name="one-click-setup"></a>

(Amazon API Gateway と Lambda を使用して) HTTP エンドポイントを設定して AWS AppSync で GraphQL エンドポイントを自動的にセットアップする場合は、次の AWS CloudFormation テンプレートを使用できます。

[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-full.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-full.yaml)

## 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/users  |  POST  |  application/json  | 
|  /v1/users  |  GET  |  application/json  | 
|  /v1/users/1  |  GET  |  application/json  | 
|  /v1/users/1  |  PUT  |  application/json  | 
|  /v1/users/1  |  DELETE  |  application/json  | 

## GraphQL API の作成
<a name="creating-your-graphql-api"></a>

 AWS AppSync で GraphQL API を作成するには:
+  AWS AppSync コンソールを開き、**API の作成**を選択します。
+ API 名として「`UserData`」と入力します。
+ **カスタムスキーマ**を選択します。
+ **[作成]** を選択します。

 AWS AppSync コンソールは、API キー認証モードを使用して新しい GraphQL API を作成します。このコンソールを使用して、残りの GraphQL API を設定し、このチュートリアルの残りの部分でクエリを実行できます。

## GraphQL スキーマを作成する
<a name="creating-a-graphql-schema"></a>

GraphQL API を作成できたので、次に GraphQL スキーマを作成します。 AWS AppSync コンソールのスキーマエディタから、スキーマが次のスキーマと一致していることを確認します。

```
schema {
    query: Query
    mutation: Mutation
}

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 データソースを設定するには、以下の操作を行います。
+ [**DataSources (データソース)**] タブで [**New (新規)**] を選択し、データソース名としてわかりやすい名前 (`HTTP` など) を入力します。
+ [**Data source type (データソースタイプ)**] で「**HTTP**」を選択します。
+ 作成された API Gateway エンドポイントに、エンドポイントを設定します。エンドポイントの一部にステージ名が含まれていないことを確認します。

 **注意:** 現時点では、パブリックエンドポイントのみが AWS AppSync でサポートされています。

 **注:** AWS AppSync サービスによって認識される認証機関の詳細については、[「HTTPS エンドポイント AWS AppSync の によって認識される認証機関 (CA)](http-cert-authorities.md#aws-appsync-http-certificate-authorities)」を参照してください。

## リゾルバーの設定
<a name="configuring-resolvers"></a>

このステップでは、http データソースを **getUser** クエリに接続します。

リゾルバーをセットアップするには、以下の手順に従います。
+ [**Schema (スキーマ)**] タブを選択します。
+ **クエリ**タイプの右下の**データ型**ペインで、**getUser**フィールドを見つけて、**アタッチ**を選択します。
+ **[データソース名]** で、**[HTTP]** を選択します。
+ 以下のコードを **[リクエストマッピングテンプレートの設定]** に貼り付けます。

```
{
    "version": "2018-05-29",
    "method": "GET",
    "params": {
        "headers": {
            "Content-Type": "application/json"
        }
    },
    "resourcePath": $util.toJson("/v1/users/${ctx.args.id}")
}
```
+ 以下のコードを **[レスポンスマッピングテンプレートの設定]** に貼り付けます。

```
## return the body
#if($ctx.result.statusCode == 200)
    ##if response is 200
    $ctx.result.body
#else
    ##if response is not 200, append the response to error block.
    $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
#end
```
+ [**Query (クエリ)**] タブを選択して、以下のクエリを実行します。

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

これは以下のレスポンスを返します。

```
{
    "data": {
        "getUser": {
            "id": "1",
            "username": "nadia"
        }
    }
}
```
+ [**Schema (スキーマ)**] タブを選択します。
+ **ミューテーション**の右下の**データ型**ペインで、**AddUser**フィールドを見つけて、**アタッチ**を選択します。
+ **[データソース名]** で、**[HTTP]** を選択します。
+ 以下のコードを **[リクエストマッピングテンプレートの設定]** に貼り付けます。

```
{
    "version": "2018-05-29",
    "method": "POST",
    "resourcePath": "/v1/users",
    "params":{
      "headers":{
        "Content-Type": "application/json",
      },
      "body": $util.toJson($ctx.args.userInput)
    }
}
```
+ 以下のコードを **[レスポンスマッピングテンプレートの設定]** に貼り付けます。

```
## Raise a GraphQL field error in case of a datasource invocation error
#if($ctx.error)
    $util.error($ctx.error.message, $ctx.error.type)
#end
## if the response status code is not 200, then return an error. Else return the body **
#if($ctx.result.statusCode == 200)
    ## If response is 200, return the body.
    $ctx.result.body
#else
    ## If response is not 200, append the response to error block.
    $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
#end
```
+ [**Query (クエリ)**] タブを選択して、以下のクエリを実行します。

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

これは以下のレスポンスを返します。

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

## AWS サービスの呼び出し
<a name="invoking-aws-services"></a>

HTTP リゾルバーを使用して、 AWS サービスの GraphQL API インターフェイスを設定できます。への HTTP リクエストは、 AWS が送信者を識別できるように[、署名バージョン 4 プロセス](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)で署名 AWS する必要があります。 AWS AppSync は、IAM ロールを HTTP データソースに関連付けるときに、ユーザーに代わって署名を計算します。

HTTP リゾルバーで AWS サービスを呼び出すには、次の 2 つの追加コンポーネントを提供します。
+  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のリストを返します。