LoginSignup
0
2

More than 3 years have passed since last update.

Lambda入門#4 API Gatewayとの連携

Last updated at Posted at 2020-02-27

昨日の続き、やってきます!

参考URL

今日も以下の記事を参考にしてやったことを記載しています。

1.APIゲートウェイの設定
https://dev.classmethod.jp/cloud/aws/getting-start-api-gateway/

2.APIゲートウェイのバージョン管理(lambda連携)
https://dev.classmethod.jp/cloud/aws/version-management-with-api-gateway-and-lambda/

API Gatewayと連携させるlambdaの設定

まずはちゃんとAPIゲートウェイの設定を覚えていきたいと思います。

上記で紹介した1.の記事を参考にまずはAPIゲートウェイのバックエンドになるlambdaを設定しておきます。
AWSが用意しているblueprintを利用します。

lambdaにログインして、[設計図の使用]にチェック入れます。

image.png

設計図のフィルター欄に「hello」と入力して、「hello-world-python」を選択し、[設定]をクリックします。

image.png

関数名は前回までに作成していたものと被らないように気をつけつつ、適当に入力して、[既存のロールを使用する]で前回に作成されたロールを指定しておきます。
※前回同様に「基本的なlambdaアクセス権限で新しいロールを作成」を選択して、新しいロールを自動的に作成しても大丈夫です。

image.png

[関数の作成]を指定し、関数が作成されたらコードを確認してみます。
記事内にコードの内容が説明されていますので、そのまま引用しますね。

eventがリクエスト元から受け取る内容ですが、「hello-world-python3」では3つの値をprint(CloudWatchに記録される)してkey1をreturnするようになっています。

実際にこのblueprintを使用して作成したlambdaのコードは以下のようになっています。

hello-world-pythonオリジナル
import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

これを記事に従って、以下のように変更してみます。

hello-world-python変更版
import json


def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    return event

受信したイベントの内容をそのまま出力するだけの処理に書き換わっています。
書き換えたら、lambda上でコードの保存を行います。
テストを行うために適当にHello Worldテンプレートを利用したテストイベントを1つ作成します。

image.png

正常に実行されました。

image.png

これでAPI Gatewayと連携させるlambdaの設定は完了です。

APIゲートウェイの設定

次にAPI Gatewayですが、APIの種類を選択するところからスタートします。

image.png

ここでは[REST API]のエリアに表示されている[構築]をクリックします。
↓のような画面が表示されるので、[新しいAPI]を選択します。

image.png

image.png

API名、説明は任意の内容で設定します。
エンドポイントタイプは[リージョン]とします。
CloudFrontは利用しないし、プライベートのVPCからのアクセスではないためです。

image.png

ひとまず、出来上がりました!

image.png

ここから、「リソース」と「メソッド」を作成していきます。
記事に書いてくださっている説明が鬼分かりやすいので、そのまま引用します。

リソース:簡単に説明するとAPIのパスです。
メソッド:リソースに対するアクションで、HTTPのメソッド「GET, POST」等と連携します。

APIゲートウェイ リソースとメソッドの作成

まずはリソースから作成していきます。
[アクション]-[リソースの作成]を選択します。

image.png

オプションはいじらずにリソース名だけ入力して、作成します。

image.png

リソースが出来ました!

image.png

次にこの作成したリソースに対するメソッドを作成します。

image.png

プルダウンメニューから選べるので、[POST]を選択します。

image.png

✔マークをクリックすると、画面右側にセットアップ画面が表示されます。

image.png

統合タイプに[Lambda関数]を選択し、[Lambda関数]に先ほど作成した関数を指定します。
関数名は途中まで入力すると補完してくれます。

image.png

[保存]をクリックすると、以下のように権限を与える警告が表示されるのですが、ここは[OK]をクリックします。

image.png

この完成したメソッドをテストしてみましょう!

image.png

上記、画像の通り、[テスト]という表示がありますので、そちらをクリックします。
[リクエスト本文]に{"test":1}と入力して[テスト]をクリックします。

image.png

テストは完了し、[レスポンス本文]に先ほど指定した値が返ってくることが確認できました。
ただ、この時点では外部からのアクセスはできないため、外部からもアクセスできるようにデプロイを行います。

image.png

デプロイにつきましても、参考にした記事から引用します!

デプロイ
APIを外部に公開する作業。
初回デプロイ時にはそのAPIのエンドポイント(URL)が生成されます。
デプロイ時にはその段階のリソース・メソッド等の設定を反映したバージョンが作成され、以後デプロイするたびにバージョンが増えます。デプロイされたバージョンの内容を変更することはできません。
エンドポイントに来るリクエストをどのバージョンで処理するかはステージで関連付けます。

そして、もう一つの重要な概念が[ステージ]です。

ステージ
エンドポイントとデプロイバージョンを紐付けるエイリアスです。
例えば、devとprodという2つのステージを用意しておき、devに最新バージョンのデプロイを行い、prodは安定したバージョンのままにしておき、開発用とエンドユーザに提示するエンドポイントを分けることができます。

要はデプロイで外部に公開できるようになるのですが、本番用の安定バージョンなエンドポイントと開発用の不安定なエンドポイントをエイリアスで分けようっていうことです。

APIゲートウェイ デプロイ

では、デプロイの設定に入るのですが、外部に公開すると誰でもアクセスできるようになってしまうため、APIキーを作成し、APIリクエスト時に認証が必要になるよう構成します。

画面左側のメニューにある[APIキー]を選択します。
image.png

APIキーの画面に切り替わったら、[アクション]-[APIキーの作成]をクリックします。

image.png

名前は適当につけて、保存します。
image.png

APIキーが出来上がるので、これをメソッドに紐づけます。

image.png

また、先ほどまで作成していたPOSTメソッドの画面まで戻り、[メソッドリクエスト]をクリックします。

image.png

この画面で[APIキーの必要性]を[false]から[true]に変更します。

image.png

image.png

trueに変更されたことを画面から確認して、[アクション]の[APIのデプロイ]を選択します。

image.png

ステージは今回に併せて、新規で作成するので、任意の名前で作成し、デプロイします。

image.png

エンドポイントが払い出されました!

image.png

最後に、APIキーとの紐づけを行います。
また、画面左側のメニューから[使用量プラン]を選択します。

image.png

画面右側のエリアから[作成]をクリックします。
image.png

今回は特にスロットリングとクォータの設定は行わずに[次へ]をクリックします。

image.png

次のAPIステージの追加で先ほど作成したAPIとステージの情報を紐づけます。

image.png

image.png

image.png

最後に✔ボタンをクリックして、[次へ]をクリックします。

image.png

image.png

ここで、APIキーを使用量プランに追加することでAPIキーがAPIゲートウェイと紐づくようになります。

image.png

これも途中まで入力すると補完されます。
image.png

✔ボタンをクリックして、[完了]をクリックします。
image.png

image.png

APIの動作確認

作成したエンドポイントに対して、curlコマンドでアクセスしてみます!

動作確認コマンド
# APIキーがない場合
$ curl -d '{"test":1}' https://api.example.com/dev/test
{"message":"Forbidden"}

# APIキーを指定した場合
$ curl -d '{"test":1}' -H 'x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' https://api.example.com/dev/test
{"test": 1}

上記のURLは適宜、作成したものに変更してみてください。
APIキーがない場合、「Forbidden」のメッセージが返ってくるはずです!

次回もAPIゲートウェイのバージョン管理について続きをやっていきます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2