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

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

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

  • Amazon DynamoDBテーブルからペットを取得して保管しているサービスロジックを実行するために、AWS Lambda関数を使用してAmazon API Gatewayがセットアップされる。

  • ペットのリストの取得および更新のための認証されていない2つのRESTサービスメソッドが作成されている。

始める前に、 Node.jsをインストールしておいてください。

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

Amazon DynamoDBコンソールで、[Create Table(テーブルの作成)]をクリックします。

DynamoDB Console - Create Table

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

  • [Table name(テーブル名)]:Pets

  • [Primary key(プライマリキー)]:ユーザー名

  • [Primary key type(プライマリキーの種類)]:String(文字列)

  • [Use default settings(デフォルト設定を使用)]:チェックなし

  • Read capacity units(読み込みキャパシティユニット)]:3

  • Write capacity units(書き込みキャパシティユニット)]:3

DynamoDB Console - Configure Newly Created Table

[Create(作成)]をクリックして、指定した設定でテーブルを作成します。

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

DynamoDB Console - Table Details - Amazon Resource Name

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

AWS IAMコンソールに移動します。

左側のメニューの [Roles(ロール)]をクリックし、[Create New Role(新しいロールを作成)]ボタンをクリックします。

IAM Console - Roles - Create New Roles

ロールにAPIGatewayLambdaExecRoleという名前を付け、[Next Step(次の手順)]をクリックします。

[Role(ロール]タイプを選択します。[AWS Service Roles]の下の[AWS Lambda]を選択します。

IAM Console - Select the Role Type - Service Roles - AWS Lambda

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

作成したロール「APIGatewayLambdaExecRole」を選択します。[Inline Policies(インラインポリシー)]の下矢印をクリックして、 [Click Here(ここをクリック)]リンクをクリックします。

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

{
  "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"]
    }
   ]
}

Was this helpful?

/

2.AWS Lambda関数を作成する

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

GetPetInfoのLambda関数を作成する

AWS 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関数コード)]エリアに貼り付けます。

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);
};

Was this helpful?

/

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

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

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

UpdatePetInfoのLambda関数を作成する

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

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);
};

Was this helpful?

/

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

{
  "pets": [{
    "id": 1,
    "type": "dog",
    "price": 249.99
  }]
}

Was this helpful?

/

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

GetPetInfo Lambda関数に戻り、[Test(テスト)]を再びクリックします。ペットが1つ表示されます。

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

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

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

exports.handler = function(event, context) {
    context.succeed('');
}

Was this helpful?

/

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

3.Amazon API Gateway APIを作成する

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

方式:ペット情報をGET

Amazon API Gatewayコンソールに移動して[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つペットが返されたことを確認できます。

方式:ペット情報をPOST

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

左ペインで/petsを選択し、 [CreateMethod(メソッドの作成]をクリックします。

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

[Integration type(統合タイプ)]にLambda関数を選択し、あなたがいる地域を選択し、[Lambda Function(Lambda関数)]に「UpdatePetInfo」を選択します。

[Save(保存)]をクリックし、Lambda関数に権限を付与することをポップアップで求められたら[OK] をクリックします。

[Test(テスト)]をクリックし、以下を要求本文に貼り付けます。

{"pets": [
    {"id": 1, "type": "dog", "price": 249.99},
    {"id": 2, "type": "cat", "price": 124.99}
  ]
}

Was this helpful?

/

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

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

[
  {
    "id": 1,
    "price": 249.99,
    "type": "dog"
  },
  {
    "id": 2,
    "price": 124.99,
    "type": "cat"
  }
]

Was this helpful?

/

方式:OPTIONS

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

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

応答本文は空欄のまま、[Test(テスト)]をクリックします。no dataと示す応答本文を受け取るはずです。

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