LANG SELRCT

コードを書く場所についてはこちら

2019年4月3日水曜日

API GatewayでAPIを作成してLambda Functionと紐づけたい(API KEYを設定する)


API GatewayでAPIを作成してLambda Functionと紐づけたい(API KEYを設定しない)

の続きで、API KEYの設定を試した手順を書き残しておきます。



API KEY を設定しない場合(前の記事に書きました)

 1.Lambda Functionを作成する
  名前と言語を決める

 2.API Gatewayで API を作成する
  名前とエンドポイントタイプを決める
  アクションからメソッドを作成する
  Lambda関数の欄に1で作成したFunctionを入れる
  APIをデプロイからステージ名を決めてデプロイする


API KEY を設定する場合(今見ているこの記事)

 3.API KEYを作成する
  名前を決める

 4.Usageを新規作成する
  ステージを追加する
  API KEYをUsageに追加する
  1のFunctionを設定する
  APIをデプロイする


3.API KEYを作成する


「API Keys」をクリックします


「Actions」から「Create API key」を選択します


「Name」に任意の名前を入力して「Save」をクリックします


「Show」をクリックすると API KEY が表示されます



4.Usage Planを作成する


「Usage Plan」をクリックします


「Create」をクリックします


「Name」に任意の名前を入力します
「Throttling」と「Quota」の値を任意で設定します
「Next」をクリックします


「Add API Stage」をクリックします


「API」と「Stage」を選択して右端のチェックアイコンをクリックします


「Next」をクリックします


「Add API Key to Usage Plan」をクリックします


「Name」でAPI KEY名を入力して右端のチェックアイコンをクリックします


「Done」をクリックします


このような画面になります



API KEYを有効にするため、作ったAPIの「Resources」を選択します


メソッド名をクリックします


「Method Request」をクリックします


falseになっている「API Key Required」の鉛筆アイコンをクリックします


「true」にしてチェックアイコンをクリックします


「Actions」から「Deploy API」を選択します


「Deployment stage」を選択して「Deploy」をクリックします


「Invoke URL」をクリックします


API KEYが必須になったため、ブラウザには以下のようにForbiddenが返ってきます


Google Apps Scriptで API KEY を渡してアクセスしてみる

コード.gs
function runWithKey() {
  var url = 'https://API_ID.execute-api.us-east-1.amazonaws.com/beta/';
  var response = UrlFetchApp.fetch(url, getOptions());
  Logger.log(response);
  Logger.log(JSON.parse(response)['body']);
}

function getOptions() {
  var options = {
    'method': 'get',
    'contentType': 'application/json',
    'headers': get_headers()
  }
  return options;
}
  
function get_headers() {
  var headers = {
    "x-api-key": getProp('apigateway_key')
  }
  return headers;
}

function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}


補足

Lambda Functionでエイリアスを作ってバージョンを紐づけている場合
(例えば以下のようなエイリアスにそれぞれバージョンを設定している)
  • Alias:Version
    • Unqulified:$LATEST
    • dev:v2
    • prod:v1

それぞれのエイリアスの画面でAPI Gatewayを作成してやると
/beta の後にFunction名がついて、そのバージョンのFunctionを実行できました。
API Gatewayのステージを分けるのとはちょっと違いますが、エイリアス毎にAPI Gatewayを割り当てたい目的は果たせた。


その手順も書いておきます(prodエイリアスを例に)

左のメニューの「API Gateway」をクリックします
右に表示された「API Gateway」のtriggerをクリックします


「API」はSTEP2で作成したものを入力します
「Deployment stage」はこの記事では「beta」としたので選択します
「Security」は 「Open with API key」を選択します

右上の「Save」をクリックします


下部にAPI GatewayのURLとAPI Keyが表示されます

その後、ページを更新してもう一度同じ場所を見ると、API key:の文字列が手順3で作成したものに変わりました。


関連記事

API GatewayでAPIを作成してLambda Functionと紐づけたい(API KEYを設定しない)


参考

API Gateway コンソールでサンプルから API を作成してテストする
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-api-from-example-console.html

チュートリアル: Amazon API Gateway で AWS Lambda を使用する
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-on-demand-https-example.html

Create, Configure, and Test Usage Plans with the API Gateway Console
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-usage-plans-with-console.html