

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

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

AWS AppSync を使用すると、サポートされているデータソース (Amazon DynamoDB AWS Lambda、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/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 を作成するには:

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. [**作成**] を選択します。

1. **Resolver** コードエディターで、次のスニペットをリクエストハンドラーとして追加します。

   ```
   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 (クエリ)**] タブを選択して、以下のクエリを実行します。

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

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

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

リゾルバーをセットアップするには、以下の手順に従います。

1. [**Schema (スキーマ)**] タブを選択します。

1. **スキーマエディタの右側の**［**リゾルバー**］ペインの［**クエリタイプ**］で、`addUser`フィールドを見つけて［**アタッチ**］を選択します。

1. リゾルバータイプは`Unit`のままにし、ランタイムは`APPSYNC_JS`にします。

1. **[データソース名]** で、先ほど作成した HTTP エンドポイントを選択します。

1. [**作成**] を選択します。

1. **Resolver** コードエディターで、次のスニペットをリクエストハンドラーとして追加します。

   ```
   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. [**Query (クエリ)**] タブを選択して、以下のクエリを実行します。

   ```
   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 インターフェイスを設定できます。への 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のリストを返します。