API Gatewayを使ってアクセスキー認証でLambdaを実行する

  • 27
    Like
  • 0
    Comment
More than 1 year has passed since last update.

とりあえず使ってみたのでメモ。

参考

リージョンの設定

API Gatewayは2015年7月11日現在はtokyoリージョンで使えないため、リージョンはUS-EAST(N.Varginia)に設定します

Lambda Functionの作成

Lambda Functionを実行するとJSONを返すものを作成します。

Lambdaのページを表示し、Create Lambda Function を選択します。(まだFucntionが一つもない場合、Getting Staredを選択)

次の画面でblueprintというテンプレートを選択できるようになったようですが、今回は使わないので Skip を選択。

次の画面で以下のように設定してきます。

  • Name->SampleApiGatewayFunction
  • Runtime->Node.js
  • LambdaFunctionCode->下部参照
  • Handler->index.handler(デフォルトのまま)
  • Role->すでに作成済みであれば対象のLambda用ロールを作成。ない場合、セレクトボックスからCreate New Roleの下部にあるBasic ExecutionRoleを選択
console.log('Loading event');

exports.handler = function(event, context) {
  context.done(null, 
    [{"id": 1, "type": "dog", "price": 249.99},
    {"id": 2, "type": "cat", "price": 124.99},
    {"id": 3, "type": "fish", "price": 0.99}]); // SUCCESS with message
};

レビュー後、問題なければ作成します。

次の画面で Test を選択し、呼び出されたタイミングでJSONが返却されるか確認します。(リクエスト時のJSONはなんでも良いです)

問題なければExecution resultの場所に以下が表示されるかと思います。

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

API Gatewayとの連携

次にAPI Gatewayと先ほど作成したLambda functionの紐付けを行います。

先ほど試験を行った画面の上部に API Endpoint というタブがあるのでそれを選択してください。

その後、表示される Add API endpoit というリンクがあるのでそれを選択してください。

Screen Shot 2015-07-11 at 9.01.53 AM.png

選択すると上記の画面が表示されると思います。
以下に今回設定した内容と説明を記載します。

設定名 今回の設定値 概要
API name LambdaMicroservice API Gatewayで利用するAPI名
Resource name SampleApiGatewayFunction  リソース名。ここで設定した値を使ってアクセスする際のURLが決められます。例えば https://xmauic0qce.execute-api.us-east-1.amazonaws.com/test/SampleApiGatewayFunction という感じで https://{api-id}.execute-api.{region}.amazonaws.com/{stage}/{resource name} という形になります。
Method Get 利用するHTTPメソッド
Deployment stage test API Gatewayでは複数の隔離された環境にAPIを配置することができ、今回どの環境に配置するかを指定します。任意の文字列が指定できますが、例えば「test」、「production」といったような値を設定することが多いとおもいます。
Security Open with access key 「AWS IAM」、「Open」、「Open with access key」の3つが選択できます。「Open」を選ぶと認証なしで、API(今回の場合、Lambda Fucntion)が叩ける状態になります。「Open with access key」を選ぶとあとで作成するAPIKey情報を知っている人だけ叩けます。「AWS IAM」を選ぶとIAMによる認証が出来ると思うのですが、まだ試していません。。。

作成が終わると以下のような表示がされます。なお、ここで表示されるURLは最終的にアクセスするURLでないので注意です。。(Lambdaとしてのエンドポイント?認証なしで設定しても表示されるURLからはアクセスできませんでした)

Screen Shot 2015-07-11 at 9.21.48 AM.png

Access Keyの作成と設定

APIにアクセする際に使うAccessKeyを作成します。

先ほどの画面で test となっているリンクを選択してAPI Gatewayの画面を表示します。

表示後、上からの2つ目のバーのAPIsとなっているところを選択し、 API Keys を選択します。

Screen Shot 2015-07-11 at 9.31.39 AM.png

遷移後、 Create API Keyを選択し、任意のNameを指定し、Enabledにチェックを入れて Save を選択します。

SaveするとどのAPIのどのステージにAPI Keyを設定するかの画面が表示されるため、以下を設定します。

  • Select API->LambdaMicroservice
  • Slect stage->test

Addボタンを選択すればAPI Keyに先ほど作成したAPIがひも付きます。
なお、表示されているAPI keyはあとで使うのでメモしておいてください

アクセスしてみる

準備ができたのでアクセスしてみます。
アクセスするURLを確認するため、上から2つ目のバーのAmazon API Gatewayというロゴを選択します。

すると LambdaMicroServiceという記載があると思います。(APIの一覧が確認できます。)LambdaMicroServiceの中の 1 stageとなっている部分を選択します。

Screen Shot 2015-07-11 at 9.53.31 AM.png

次にtestステージの現在のデプロイされたリソースが確認できるので先ほど作成したSampleApiGatewwayFunctionリソースを選択します。

Screen Shot 2015-07-11 at 9.55.50 AM.png

URLが表示され、本URLがLambda functionを実行するためのURLとなります。

試しにブラウザから上記リンクを表示してみます。

{"message": "Not able to access resource."}

認証がされていないため、上記エラーメッセージが表示されます。

認証はリクエスト時のヘッダに x-api-key: hoge-fuga-api-key という形で先ほどメモしたapi-keyを設定すればOKです。
今回はcurlでやってみます。

$curl --header "x-api-key: hoge-fuga-api-key" https://xmauic0qce.execute-api.us-east-1.amazonaws.com/test/SampleApiGatewayFunction
[{"id":1,"type":"dog","price":249.99},{"id":2,"type":"cat","price":124.99},{"id":3,"type":"fish","price":0.99}]%

認証ができた時にはLambdaFunctionで設定したJSONが返却されることが確認できました!

お掃除

API GatewayのAPIを削除します。

上から2つ目のバーのAmazon API Gatewayというロゴを選択し、LambdaMicroServiceを選択します。

次に上から2つ目のバーのResourcesを選択し、Dashbordを選択します。

そうするとログなどの情報が見える画面になるのですが、右に Delete API というボタンをあるので選択すれば削除できます。

なお、今回の手順だと発生しませんが、APIは作ったが、stageにdeployしてない場合、Dashbordリンクが表示されないっぽくて困惑しました。。

【2015/7/11追記】
リソース選択の画面でDelete API押せるようになってました!

API Gateway、Lambda Functionも不要であれば削除してください。(この2つは困惑することなく、できるかと思います)