【学習記録】API Gateway+Lambdaのチュートリアルで勉強

API GatewayとLambdaが今ひとつわかってないので手を動かして勉強しました。
内容は以下の動画を参考にさせてもらいました。

www.youtube.com

AWSマネジメントコンソースからlambdaを選択し、関数を作成します。

f:id:JunpeiNakasone:20210423123717p:plain

Function nameはTransationProcessor、RuntimeはPython 3.6、PermissionsではCreate a new role with basic Lambda permissionsを選択します。

※Create a new role with basic Lambda permissionsはCloudWatchのパーミッションも含まれているようです。

Create functionをクリックするとLambda関数が作成され、以下のようにDesignerが表示されます。
f:id:JunpeiNakasone:20210423124107p:plain

※動画だとここでAmazon CloudWatch Logsも表示されている。

Lambda関数のコードを確認してみると、ボイラープレートのコードがありました。

ローカルで以下のコードを作成します。

import json

print('Loading function')

def lambda_handler(event, context):
    transactionId = event['queryStringParameters']['transactionId']
    transactionType = event['queryStringParameters']['type']
    transactionAmount = event['queryStringParameters']['amount']

    print('transactionId=' + transactionId)
    print('transactionType=' + transactionType)
    print('transactionAmount=' + transactionAmount)

    transactionResponse = {}
    transactionResponse['transactionId'] = transactionId
    transactionResponse['type'] = transactionType
    transactionResponse['amount'] = transactionAmount
    transactionResponse['message'] = 'Hello from Lambda land'

    responseObject = {}
    responseObject['statusCode'] = 200
    responseObject['headers'] {}
    responseObject['headers']['Content-Type'] = 'application/json'
    responseObject['body'] = json.dumps(transactionResponse)

    return responseObject

マネジメントコンソールのLambdaのコードに上記のコードを貼り付け保存します。
f:id:JunpeiNakasone:20210423125325p:plain

これでLambdaの準備はできました。

API Gatewayのマネジメントコンソールを開きREST APIのBuildをクリックします。
f:id:JunpeiNakasone:20210423125828p:plain

API作成画面でNew APIを選択し、API nameはTransactionApis、Endpoint TypeはRegionalを選択してCreate APIをクリックします。
f:id:JunpeiNakasone:20210423130022p:plain

無事APIが作成され以下の画面に遷移しました。
f:id:JunpeiNakasone:20210423130138p:plain

ActionsからCreate Resourceをクリックします。
f:id:JunpeiNakasone:20210423130252p:plain

Resource Nameにtransactionsと入力し、それ以外はデフォルトのままでCreate Resourceをクリックします。
f:id:JunpeiNakasone:20210423130417p:plain

次にActionsからCreate Methodをクリックします。
f:id:JunpeiNakasone:20210423130503p:plain

MethodをGETにしてIntegrations typeはLambda Function、 Use Lambda Proxy integrationはチェック、Lambda Regionは先ほどLambdaを作成したリージョンを選択、LambdaはTransactionProcessorを選択してSaveをクリックします。
Integrations typeはAPIリクエストをどこに送るか、という内容で今回はLambdaを呼び出したいのでLambda Functionを選択しています。
EC2などのHTTPエンドポイントにリクエストを送りたい場合はHTTPを選択するようです。
別のAWSサービスに送る場合はAWS Serviceを選択するようです。

Use Lambda Proxy integrationsは重要そうな項目なのですが、まだ勉強できていないので後から調べたいと思います。

docs.aws.amazon.com

f:id:JunpeiNakasone:20210423131000p:plain

すると以下のポップアップが表示されました。
f:id:JunpeiNakasone:20210423131051p:plain

API GatewayにLambda関数を呼び出す許可を与えます、という意味だと思いますのでOKをクリックします。

すると以下の画面が表示されました。
f:id:JunpeiNakasone:20210423131658p:plain

図の意味はまだよくわかっていないので後から勉強します。

次にAPIをデプロイする必要があるのでActionsからDeploy APIをクリックします。
f:id:JunpeiNakasone:20210423131828p:plain

するとDeployする詳細を入力するポップアップが表示されます。
Deployment stageで[New Stage]を選択し、Stage nameはtestと入力してDeployをクリック。
※Stage nameでproductionとtestを分けたり、v1やv2など分けるようです。
f:id:JunpeiNakasone:20210423132104p:plain

無事デプロイされました。
f:id:JunpeiNakasone:20210423132202p:plain

test配下のtransactionのエンドポイントもできていることが確認できます。
f:id:JunpeiNakasone:20210423132649p:plain

ブラウザからアクセスしてみるとLambda関数で出力された値が帰ってきました。
f:id:JunpeiNakasone:20210423133021p:plain