> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-fix-docs-5528-php-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# AWS API Gatewayチュートリアルの手順1

> Amazon API Gatewayチュートリアルの手順1

<Warning>
  この機能は委任を使用します。2017年6月8日より、アドオンを使用していないテナントでは、デフォルトで委任が無効になります。委任を必要とするアドオンを使用中のレガシーテナントは、引き続きこの機能を使用できます。今後、委任機能が変更されるか、サービスから削除されることがあれば、使用中のお客様が余裕を持って移行できるよう、あらかじめお知らせします。また、委任はカスタムドメインの使用をサポートしていないため、委任に依存する機能をカスタムドメインと共に使うとうまく機能しない可能性があります。
</Warning>

## 手順 1 - Amazon API Gatewayのセットアップ

この手順を終えると、以下が完了した状態となります。

* Amazon DynamoDBテーブルからペットを取得して保管しているサービスロジックを実行するために、AWS Lambda関数を使用してAmazon API Gatewayがセットアップされる。
* ペットのリストの取得および更新のための認証されていない2つのRESTサービスメソッドが作成されている。

始める前に、 [Node.js](https://nodejs.org/)をインストールしておいてください。

### 1.Amazon DynamoDBテーブルを作成する

[Amazon DynamoDBコンソール](https://console.aws.amazon.com/dynamodb)で、 **［Create Table（テーブルの作成）］** をクリックします。

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/IiflUvRH4Z-Q_gUv/docs/images/ja-jp/cdy7uua7fh8z/2ZPhi7Ddx4TznSXEEhUSDK/52a06412f7c5e6d0ef0d13c6ffe17611/dynamodb-create-table.png?fit=max&auto=format&n=IiflUvRH4Z-Q_gUv&q=85&s=0da037aff891a807f088a54b30f9e779" alt="DynamoDB Console - Create Table" width="750" height="579" data-path="docs/images/ja-jp/cdy7uua7fh8z/2ZPhi7Ddx4TznSXEEhUSDK/52a06412f7c5e6d0ef0d13c6ffe17611/dynamodb-create-table.png" />
</Frame>

テーブルに関連する変数を構成します。

* **［Table name（テーブル名）］** ：Pets
* **［Primary key（プライマリキー）］** ：ユーザー名
* **［Primary key type（プライマリキーの種類）］** ：String（文字列）
* **［Use default settings（デフォルト設定を使用）］** ：チェックなし
* **Read capacity units（読み込みキャパシティユニット）］** ：3
* **Write capacity units（書き込みキャパシティユニット）］** ：3

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/edu3KASxfgCs4dqF/docs/images/ja-jp/cdy7uua7fh8z/6MYJV97Xa3DxajG8DYj2dx/e428ab2ce137176d7771c61a9c528f7c/configure-newly-created-table.png?fit=max&auto=format&n=edu3KASxfgCs4dqF&q=85&s=b2b2cb21f14450add85087203cc77d0e" alt="DynamoDB Console - Configure Newly Created Table" width="750" height="579" data-path="docs/images/ja-jp/cdy7uua7fh8z/6MYJV97Xa3DxajG8DYj2dx/e428ab2ce137176d7771c61a9c528f7c/configure-newly-created-table.png" />
</Frame>

**［Create（作成）］** をクリックして、指定した設定でテーブルを作成します。

テーブルが作成されている間、［Table details（テーブル詳細）］セクションにあるAmazon Resource Name (ARN)をメモしておきます。次の手順で、このテーブルのARNが必要になります。

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/GIkdxZNhwwEDAWNV/docs/images/ja-jp/cdy7uua7fh8z/4ZFemddtUD8tRi0NUvzXJ2/38abd951974cad385ef7417f48adf359/table-arn.png?fit=max&auto=format&n=GIkdxZNhwwEDAWNV&q=85&s=732413fe92f0893482b3d982dd2627fe" alt="DynamoDB Console - Table Details - Amazon Resource Name" width="750" height="579" data-path="docs/images/ja-jp/cdy7uua7fh8z/4ZFemddtUD8tRi0NUvzXJ2/38abd951974cad385ef7417f48adf359/table-arn.png" />
</Frame>

### 2.DynamoDB PetsテーブルへのアクセスをAWS Lambda関数に付与するポリシーを作成する

[AWS IAMコンソール](https://console.aws.amazon.com/iam)に移動します。

左側のメニューの **［Roles（ロール）］** をクリックし、 **［Create New Role（新しいロールを作成）］** ボタンをクリックします。

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/QFqkbubKNdo2scLz/docs/images/ja-jp/cdy7uua7fh8z/4mgCTXLpycHLA8RbYoEFim/5d9eb81be979355aa9cd10d476ead515/roles.png?fit=max&auto=format&n=QFqkbubKNdo2scLz&q=85&s=971813e34f7a7ae8856ef318132f1d21" alt="IAM Console - Roles - Create New Roles" width="750" height="579" data-path="docs/images/ja-jp/cdy7uua7fh8z/4mgCTXLpycHLA8RbYoEFim/5d9eb81be979355aa9cd10d476ead515/roles.png" />
</Frame>

ロールに`APIGatewayLambdaExecRole`という名前を付け、 **［Next Step（次の手順）］** をクリックします。

［Role（ロール］タイプを選択します。［AWS Service Roles］の下の［AWS Lambda］を選択します。

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/AGJKQ70LznL5pcXe/docs/images/ja-jp/cdy7uua7fh8z/326kKGbahlvIwVFTi61Gfw/026d1fc0c8c6e3a489ec4fb840f551da/select-role-type.png?fit=max&auto=format&n=AGJKQ70LznL5pcXe&q=85&s=1ea8680cc29929a6cc8dfa5f8a34a213" alt="IAM Console - Select the Role Type - Service Roles - AWS Lambda" width="750" height="579" data-path="docs/images/ja-jp/cdy7uua7fh8z/326kKGbahlvIwVFTi61Gfw/026d1fc0c8c6e3a489ec4fb840f551da/select-role-type.png" />
</Frame>

［Attach Policy（ポリシーのアタッチ）］の画面で、 **［Next Step（次の手順）］** をクリックしてこの手順をスキップします。この時点で、ご自身が提供した情報を確認します。すべて正しい場合は、 **［Create Role（ロールの作成）］** をクリックします。終了したら、IAMホームページにロールが記載されていることが確認できます。

作成したロール「 **APIGatewayLambdaExecRole** 」を選択します。［Inline Policies（インラインポリシー）］の下矢印をクリックして、 **［Click Here（ここをクリック）］** リンクをクリックします。

［Custom Policy（カスタムポリシー）］を選択し、 **［Select（選択）］** をクリックします。ポリシーに「`LogAndDynamoDBAccess`」という名前を付け、ポリシードキュメントとして以下のコードを追加します（必ずDynamoDBテーブルのAmazon Resource Name (ARN)を最初に更新してください）。 **［Apply policy（ポリシーを適用）］** をクリックします。

```json lines theme={null}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AccessCloudwatchLogs",
      "Action": ["logs:*"],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Sid": "PetsDynamoDBReadWrite",
                  "Effect": "Allow",
      "Action": [
                  "dynamodb:DeleteItem",
                  "dynamodb:GetItem",
                  "dynamodb:PutItem",
                  "dynamodb:UpdateItem"
                  ],
      "Resource": ["DYNAMODB_TABLE_ARN_VALUE_FROM_PREVIOUS_STEP"]
    }
   ]
}
```

### 2.AWS Lambda関数を作成する

次の3つの手順で、DynamoDBテーブルのペット情報を取得および更新するためのAWS Lambda関数を作成します。

#### GetPetInfoのLambda関数を作成する

[AWS Lambdaコンソール](https://console.aws.amazon.com/lambda)で、 **［Create a Lambda Function（Lambda関数の作成）］** を選択します（今までAWS Lambda関数を作成したことがない場合は、 **［Get Started Now（今すぐ始める）］** をクリックします）。

［Select blueprint（ブループリントの選択）］画面で、 **［Blank Function（ブランク関数）］** を選択します。

その後、［Configure triggers（トリガーの構成）］画面が表示されます。 **［Next（次へ）］** をクリックして続行します。この時点ではこれを行う必要はありません。

最後に、［Configure function（関数の構成）］を尋ねられます。

以下の情報を使用して、該当するフィールドに入力します。

* **［Name（名前）］** ：`GetPetInfo`
* **［Runtime（ランタイム）］** ：Node.js 6.10

DynamoDBテーブルからペット情報を読み込むために **［Lambda function code（Lambda関数コード）］** エリアに貼り付けます。

```javascript lines theme={null}
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();

exports.handler = function(event, context) {
   var cb = function(err, data) {
      if(err) {
         console.log('error on GetPetsInfo: ',err);
         context.done('Unable to retrieve pet information', null);
      } else {
         if(data.Item && data.Item.pets) {
             context.done(null, data.Item.pets);
         } else {
              context.done(null, {});
         }
      }
   };

   dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, cb);
};
```

ロールについては、 **［Choose an existing role（既存のロールを選択）］** を選びます。次に、既存のロールとして **APIGatewayLambdaExecRole** を選択します。その他の設定はすべてデフォルト値のままにします。

**［Next（次へ）］** をクリックして、ご自身が提供した情報を確認します。すべて正しい場合は、 **［Create function（関数の作成）］** をクリックします。

**\[Test（テスト）］** をクリックし、インプットテストイベントを（Hello Worldテンプレートを使用する）デフォルトのままにします。テストが完了したら、［Execution Result（実行結果）］セクションに空のアウトプット(`{}`)が表示されます。テーブルは空です。

#### UpdatePetInfoのLambda関数を作成する

`GetPetInfo`関数を作成するときに使用する手順方法を繰り返しますが、関数コードとして代わりに以下を使用します。

```javascript lines theme={null}
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();
exports.handler = function(event, context) {
    var item = { username:"default",
                 pets: event.pets || {}
            };

    var cb = function(err, data) {
        if(err) {
            console.log(err);
            context.fail('unable to update pets at this time');
        } else {
            console.log(data);
                context.done(null, data);
        }
    };
    dynamo.putItem({TableName:"Pets", Item:item}, cb);
};
```

関数をテストするために、［Actions（アクション）］ドロップダウンをクリックし、 **［Configure sample event（サンプルイベントの構成）］** を選択します。サンプルデータとして以下を入力し、 **［Submit（送信）］** をクリックします。

```json lines theme={null}
{
  "pets": [{
    "id": 1,
    "type": "dog",
    "price": 249.99
  }]
}
```

空の結果(`{}`)が返されます。

`GetPetInfo` Lambda関数に戻り、 **［Test（テスト）］** を再びクリックします。ペットが1つ表示されます。

#### 3つめのLambda関数を作成する

もう一つLambda関数を作成します。この関数は何もしませんが、後のセクションで説明するように、CORSのOPTIONSメソッドで必要です。

上述の手順を使用して、`NoOp`という名前のLambda関数を作成します。この関数コードは以下の通りです。

```js lines theme={null}
exports.handler = function(event, context) {
    context.succeed('');
}
```

この3つ目のLambda関数を作成する代わりに、 API Gatewayで[OPTIONSメソッドの作成](#method-options)を選択することもできます。

### 3.Amazon API Gateway APIを作成する

2つのメソッドでAPIを作成します。1つはペット情報を`GET`、もう1つはペット情報を`POST`します。

#### 方式：ペット情報をGET

[Amazon API Gatewayコンソール](https://console.aws.amazon.com/apigateway)に移動して **［Create API（APIの作成）］** をクリックします。APIを作成するのが初めての場合は、 **［Get Started（開始）］** 画面が表示されます。

APIを作成するのが初めての場合は、［Example API（サンプルAPI）］を作成するよう求められます。 **［OK］** をクリックしてポップアップ通知を閉じ、 **［Example API（サンプルAPI）］** ボタンの代わりに、 **［New API（新規API）］** ラジオボタンを選択します。

APIを「`SecurePets`」と名づけ、 **［Create API（APIの作成）］** をクリックします。

`SecurePets` APIの［Resource（リソース）］タブに移動し、 **［Create Resource（リソースの作成）］** アクションをクリックします。

リソースに「`Pets`」の名前を付け、 **［Create Resource（リソースの作成）］** を再びクリックします。

左ペインで`/pets`を選択し、 **［CreateMethod（メソッドの作成］** ボタンをクリックします。

ドロップダウンで、［GET］を選択し、チェックマークボタンをクリックします。`GET`メソッドのために、以下の構成値を提供します。

* **［Integration type（統合タイプ）］** ：Lambda関数
* **Lambda Region（lambdaリージョン）** ：あなたがいる地域
* **［Lambda Function（Lambda関数）］** ：GetPetInfo

**［Save（保存）］** をクリックし、Lambda関数に権限を付与することをポップアップで求められたら **［OK］** をクリックします。

次に表示される［Method Execution（メソッドの実行）］ウィンドウで **［Test（テスト）］** をクリックします。

応答本文で1つペットが返されたことを確認できます。

#### 方式：ペット情報をPOSＴ

ペット情報を`POST` に使用するAPIの作成は、ペット情報を`GET`に使用したAPIの作成方法と似ています。

左ペインで`/pets`を選択し、 **［CreateMethod（メソッドの作成］** をクリックします。

ドロップダウンで、［POST］を選択し、チェックマークボタンをクリックします。

［Integration type（統合タイプ）］にLambda関数を選択し、あなたがいる地域を選択し、［Lambda Function（Lambda関数）］に「UpdatePetInfo」を選択します。

**［Save（保存）］** をクリックし、Lambda関数に権限を付与することをポップアップで求められたら **［OK］** をクリックします。

**［Test（テスト）］** をクリックし、以下を要求本文に貼り付けます。

```json lines theme={null}
{"pets": [
    {"id": 1, "type": "dog", "price": 249.99},
    {"id": 2, "type": "cat", "price": 124.99}
  ]
}
```

空の結果(`{}`)が返されます。

GETメソッドに戻り、 **［Test（テスト）］** を再びクリックし、テーブルにペットが2つ記載されていることを要求本文が示していることを確認します。

```json lines theme={null}
[
  {
    "id": 1,
    "price": 249.99,
    "type": "dog"
  },
  {
    "id": 2,
    "price": 124.99,
    "type": "cat"
  }
]
```

#### 方式：OPTIONS

アクションを起こさないlambda関数を作成する代わりに、API Gatewayで`OPTIONS`メソッドを作成することができます。

左ペインで`/pets`を選択し、 **［CreateMethod（メソッドの作成］** をクリックします。ドロップダウンで、［OPTIONS]を選択し、チェックマークボタンをクリックします。［Integration type（統合タイプ）］に［Mock］を選択します。 **［Save（保存）］** をクリックします。

応答本文は空欄のまま、 **［Test（テスト）］** をクリックします。`no data`と示す応答本文を受け取るはずです。

この時点で、AWS Lambda関数とAmazon API Gatewayメソッドは、セキュリティなしで定義されています。
