Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
47
Help us understand the problem. What is going on with this article?
@baikichiz

【API Gateway】API呼び出しにAPIキーを設定する

More than 3 years have passed since last update.

Amazon API Gatewayで公開するAPIにはAPIキーを設定できます。これにより、以下のようなことができます。

  • APIキーを知っている人だけがそのAPIを呼び出すことができる
  • ユーザごとにAPIキーを発行し、ユーザごとに呼び出し回数に制限をかけることができる

これを試してみました。

説明の前提

Amazon API Gatewayの公式ドキュメントの「API GatewayコンソールでサンプルからAPIを作成してテストする」の手順に従って、サンプルのAPIを作成したことを前提とします。
このAPIに対してAPIキーを設定します。

手順

APIキーの作成

AWSマネジメントコンソールにサインインし、Amazon API Gatewayの管理コンソールを開きます。
画面左端の一覧の「APIキー」をクリックします。
すると、APIキー一覧が表示されますので、「アクション」ボタンをクリックし、プルダウンメニューから「APIキーの作成」を選択します。
image.png

APIキーの作成画面が表示されるので、以下のように入力、設定して「保存」ボタンをクリックします。

  • 名前:testkey
  • APIキー:自動生成

image.png

作成したAPIキーの情報が表示されます。
image.png

ここで、「APIキー」の横の「表示」をクリックすると表示されるAPIキー文字列をメモしておきます。
あとで、APIを呼び出す際にこのAPIキーが必要になります。

使用量プランの作成

次に、使用量プランを作成します。
画面左側リストの「使用量プラン」をクリックし、「作成」ボタンをクリックします。
image.png

画面右側に「使用量プランの作成」パネルが表示されるので、以下のように入力して「次へ」ボタンをクリックします。

  • 名前: TestPlan
  • スロットリングの有効化:チェックあり
  • レート:1
  • バースト:1
  • クォータを有効にする:チェックあり
  • リクエスト数の指定:3リクエスト/月

image.png

これで使用量プランが作成されました。作成したTestPlanの情報が画面に表示されています。
image.png

使用量プラン、APIステージ、APIキーの関連付け

作成した使用量プランを、作成済みのPetStoreのAPIステージに関連づけます。画面下側の「APIステージの追加」ボタンをクリックし、表示されたフォームで以下のように選択します。

  • API: PetStore
  • ステージ: test

選択すると、チェックマークのボタンが出てくるので、それをクリックして関連づけを確定させます。
image.png

次に、使用量プランTestPlanと、先ほど作成したAPIキーtestkeyを関連付けします。
画面上部の「APIキー」タブをクリックし、「APIキーを使用量プランに追加」をクリックします。
名前を入力する欄が出現するので、「testkey」と入力し、右側のチェックマークのボタンをクリックします。
image.png

これで、使用量プランとAPIキーが関連づけられました。

API Gateway APIの設定を変更し、APIキーを必須にする。

最後に、PetStoreのAPIの設定を変更し、APIキーを必須項目にします。
今回は例として、PetStore APIのルートリソースのGETメソッドに対して、APIキーを必須に設定します。

API Gateway コンソールの 画面左側の「API」→「PetStore」の所をクリックし、「リソース」をクリックします。
画面に表示されたリソースツリーのルート「/」の「GET」のところをクリックします。
表示されたリクエスト・レスポンスのマッピング画面の「メソッドリクエスト」のリンクをクリックします。
image.png

すると、 メソッドリクエストの設定画面が表示されます。
「APIキーの必要性 false」となっているので、横の鉛筆アイコンをクリックして、「true」に変更し、チェックマークのボタンを押して変更を保存します。
image.png

設定変更したAPIをデプロイしましょう。「アクションボタン」→「APIのデプロイ」とクリックし...
image.png

「デプロイされるステージ」に「test」を指定して「デプロイ」ボタンをクリックです。
image.png

デプロイしたAPIステージのURLが表示されます。
image.png

これで、PetStore APIのルートに対するGETメソッドは、APIキーをヘッダにつけなければならなくなりました。

動作確認

先ほどデプロイしたURLにcurlでアクセスしてみましょう。

$ curl https://0puhoqspu0.execute-api.ap-northeast-1.amazonaws.com/test
{"message":"Forbidden"}

ルートリソースに対するGETメソッドを発行しましたが、APIキーをリクエストヘッダにつけていないので"Forbidden"と怒られてしましました。

APIキーをつけてみましょう

$ curl https://0puhoqspu0.execute-api.ap-northeast-1.amazonaws.com/test \
     --header 'x-api-key:<あなたのAPIキー>'
<html>
    <head>
        <style>
        body {
            color: #333;
            font-family: Sans-serif;
            max-width: 800px;
            margin: auto;
        }
        </style>
    </head>
    <body>
        <h1>Welcome to your Pet Store API</h1>
        <p>
            You have succesfully deployed your first API. You are seeing this HTML page because the <code>GET</code> method to the root resource of your API returns this content as a Mock integration.
        </p>
        <p>
            The Pet Store API contains the <code>/pets</code> and <code>/pets/{petId}</code> resources. By making a <a href="/test/pets/" target="_blank"><code>GET</code> request</a> to <code>/pets</code> you can retrieve a list of Pets in your API. If you are looking for a specific pet, for example the pet with ID 1, you can make a <a href="/test/pets/1" target="_blank"><code>GET</code> request</a> to <code>/pets/1</code>.
        </p>
        <p>
            You can use a REST client such as <a href="https://www.getpostman.com/" target="_blank">Postman</a> to test the <code>POST</code> methods in your API to create a new pet. Use the sample body below to send the <code>POST</code> request:
        </p>
        <pre>
{
    "type" : "cat",
    "price" : 123.11
}
        </pre>
    </body>
</html>Y

<あなたのAPIキー>のところは、「APIキーの作成」の節でメモしたAPIキー文字列で置き換えてください。
APIキーをつければ、期待通りにAPIの説明が書かれたHTMLが返されました。

なお、このAPIキーには使用量プランで呼び出し回数に制限をかけてあるので、上記のcurlコマンドを連発で実行すると、以下のようにエラーメッセージが返されるようになります。

{"message":"Too Many Requests"}

注意

今回デプロイしたAPIは、ルートリソース以外にはAPIキーが設定されていません。
第三者に不用意に呼び出されてしまわないよう、動作確認が終わった後は、ステージを削除しておきましょう。

image.png

まとめ

APIキー、使用量プランを作成し、API Gatewayのステージと関連付けしました。これにより、API Gateway APIに対して以下を確認しました。

  • APIキーを知っている人だけがアクセスできること
  • APIキーに関連づけた使用量プランを超えたアクセスを制限できること
47
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
47
Help us understand the problem. What is going on with this article?