Help us understand the problem. What is going on with this article?

Amazon API GatewayのHTTP API使ってみた

はじめに

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を指定する。
      スクリーンショット 2020-01-17 21.45.03.png

Cognitoの設定

非公開のlambdaを作りたかったので認証必須。
HTTP APIはCognito使うのが良さそう。
認証不要なAPIの場合は、この手順不要かと思います。

ユーザープールを作る

  • デフォルトでユーザープール作成する。
  • ユーザーを1人作成する。
    • メールが送られてくる。
  • アプリクライアントを作成する。
    • 次のチェックボックスだけONにする。
      • 認証用の管理 API のユーザー名パスワード認証を有効にする (ALLOW_ADMIN_USER_PASSWORD_AUTH)
      • 更新トークンベースの認証を有効にする (ALLOW_REFRESH_TOKEN_AUTH)(OFFにできなかった)

フェデレーティッドアイデンティティ

  • 先ほど作ったユーザープールの画面で下記をメモります。
    • ユーザープールID
      スクリーンショット 2020-01-17 22.08.52.png
    • アプリクライアントID
      スクリーンショット 2020-01-17 22.26.13.png
  • フェデレーティッドアイデンティティを開きます。
    スクリーンショット 2020-01-17 22.28.10.png
  • 新しいIDプールの作成ボタンを押して、メモった情報を入力し、作成します。
    スクリーンショット 2020-01-17 22.30.24.png

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を開く。
  • 認可からオーソライザーを作成する。
    スクリーンショット 2020-01-18 19.53.11.png
    • こんな感じでつくる。
      スクリーンショット 2020-01-19 12.22.50.png
  • 作ったオーソライザーをルートにアタッチする。
    スクリーンショット 2020-01-18 20.02.40.png

APIを叩いてみる

とりあえず、叩いてみる。
URLはlambdaのAPI Gatewayの箇所に書いてある。

スクリーンショット 2020-01-19 12.23.50.png

$ 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でもアクセスできる。
  • パスパラメータ等はまだつかえないのかな・・・?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした