はじめに
lambdaをさわっててAPIGatewayのコンソールを覗いてみたら見覚えのない選択肢がありました。
このHTTP API
なるもの、新機能らしいです。
しかも出たばかり。
ホットなので使ってみました。
※検証時点ではプレビュー版となります。
HTTP API
クラスメソッドさんが解説してくれてます。
いつも助かります。
https://dev.classmethod.jp/cloud/aws/amazon-api-gateway-http-or-rest/
なにやら従来のREST APIよりも簡単に使えそうな雰囲気ですね。
やりたい事
curlでapi叩いてlambda動かしたい。
認証も噛ませたい。
やってみた
lambda作る
- ウィザードに従い、ぽちぽち作る。
- 言語はpython3.7を指定。
- ソースはこんな感じ。
import json
def lambda_handler(event, context):
return {
'isBase64Encoded': False,
'statusCode': 200,
'headers': {},
'body': '{"message": "Hello Lambda"}'
}
-
トリガーを追加
からAPI Gatewayを追加する。-
HTTP API
を指定する。
-

Cognitoの設定
非公開のlambdaを作りたかったので認証必須。
HTTP APIはCognito使うのが良さそう。
認証不要なAPIの場合は、この手順不要かと思います。
ユーザープールを作る
- デフォルトでユーザープール作成する。
- ユーザーを1人作成する。
- メールが送られてくる。
- アプリクライアントを作成する。
- 次のチェックボックスだけONにする。
認証用の管理 API のユーザー名パスワード認証を有効にする (ALLOW_ADMIN_USER_PASSWORD_AUTH)
-
更新トークンベースの認証を有効にする (ALLOW_REFRESH_TOKEN_AUTH)
(OFFにできなかった)
- 次のチェックボックスだけONにする。
フェデレーティッドアイデンティティ
- 先ほど作ったユーザープールの画面で下記をメモります。
ユーザープールID




API Gatewayの設定
公式資料はこれかな?
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-examples.html
認証を有効にしたいので、下記の設定を行う。
公式資料はこれ。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-jwt-authorizer.html
- API Gatewayのコンソールから、lambdaから作成したAPIを開く。
-
認可
からオーソライザーを作成する。



APIを叩いてみる
とりあえず、叩いてみる。
URLはlambdaのAPI Gatewayの箇所に書いてある。
$ curl https://mnh3XXXXXX.execute-api.ap-northeast-1.amazonaws.com/default/http-api-test
{"message":"Unauthorized"}
認証作ったし動かなくて正解。
認証情報の取得
JWTなる認証はJSON形式のトークンを使って認証をやりとりするそうな。
まずはトークン取得。
-
--user-pool-id
はユーザープールIDを指定。 -
--client-id
はアプリクライアントIDを指定。 -
--auth-parameters
はcognitoで作成したユーザーの名前とパスワードを指定。
$ aws cognito-idp admin-initiate-auth --user-pool-id ap-northeast-1_ItJXXXXXX --client-id 6fflXXXXXXXXXXXXXXXXXXXXXX --auth-flow ADMIN_USER_PASSWORD_AUTH --auth-parameters "USERNAME=tsuyoshi,PASSWORD=password"
{
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"Session": "MktQ~(長いので省略)~Qoj9zrYg-lsWI",
"ChallengeParameters": {
"USER_ID_FOR_SRP": "tsuyoshi",
"requiredAttributes": "[]",
"userAttributes": "{\"email_verified\":\"true\",\"email\":\"hori@hogehoge.jp\"}"
}
}
https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-initiate-auth.html
まずはパスワード変更してね。って事らしい。
https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-respond-to-auth-challenge.html
パスワード変更する
-
--user-pool-id
はユーザープールIDを指定。 -
--client-id
はアプリクライアントIDを指定。 -
--challenge-responses
でユーザーの名前と新しいパスワードを指定。 -
--session
は直前に実行したコマンドで返ってきたSessions
の値をコピペ。
$ aws cognito-idp admin-respond-to-auth-challenge --user-pool-id ap-northeast-1_ItJXXXXXX --client-id 6fflXXXXXXXXXXXXXXXXXXXXXX --challenge-name NEW_PASSWORD_REQUIRED --challenge-responses NEW_PASSWORD='P@55w0rd',USERNAME=tsuyoshi --session "MktQk~(長いので省略)~Qoj9zrYg-lsWI"
改めてトークンの取得。
$ aws cognito-idp admin-initiate-auth --user-pool-id ap-northeast-1_ItJXXXXXX --client-id 6fflXXXXXXXXXXXXXXXXXXXXXX --auth-flow ADMIN_USER_PASSWORD_AUTH --auth-parameters "USERNAME=tsuyoshi,PASSWORD=P@55w0rd"
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "eyJr~(省略)~MaT_g",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "eyJ~(省略)~KVw",
"IdToken": "eyJr~(省略)~uXg"
}
}
認証につかうのはAuthenticationResult.IdToken
っぽい。
証情報をつかってAPIを叩く
$ curl -H 'Authorization: eyJr~(省略)~uXg' https://mnh3XXXXXX.execute-api.ap-northeast-1.amazonaws.com/default/http-api-test
{"message": "Hello Lambda"}
うごいた!
備考
- オーソライザーをデタッチしたら、認証介さずアクセスできた。オープンなAPI。
- urlはdefaultを省略できるので
https://mnh3XXXXXX.execute-api.ap-northeast-1.amazonaws.com/http-api-test
でもアクセスできる。 - パスパラメータ等はまだつかえないのかな・・・?