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

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

# 参考

+ [Walkthrough: API Gateway and Lambda Functions](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started.html)
+ [Use an API Key in API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-api-keys.html)

# リージョンの設定

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](https://qiita-image-store.s3.amazonaws.com/0/20193/7a5938fb-995f-db6b-d4d7-8e6aaf5e54e2.png "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](https://qiita-image-store.s3.amazonaws.com/0/20193/5f34feea-c598-f000-63c6-148f62849539.png "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](https://qiita-image-store.s3.amazonaws.com/0/20193/1841d978-ec74-a6ed-b60d-6259d566013b.png "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](https://qiita-image-store.s3.amazonaws.com/0/20193/c3eb08d4-69ad-7c6d-4549-dd1d86e62c2d.png "Screen Shot 2015-07-11 at 9.53.31 AM.png")

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

![Screen Shot 2015-07-11 at 9.55.50 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/55655e5c-13a2-14cd-1ced-3e3f291f24e2.png "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つは困惑することなく、できるかと思います）