Posted at

AWSサーバーレスアーキテクチャ試した


やりたい事

infra.png


  • Cognito 経由でパスワード認証(トークンを受け取る)

  • API Gateway 経由で Lambda Function を実行 ... etc


Cognito


ユーザープールの作成



  • ユーザープールとは


    • ユーザーをまとめて管理するとこ



  • 作成方法


    • AWS コンソール Cognito から「ユーザープール作成」

    • or awscli から aws cognito-idp create-user-pool --pool-name POOL_NAME --auto-verified-attributes email


      • 扱う iam に実行権限 CreateUserPool が必要
        ユーザープールIDを使うのでメモっとく
        ### アプリクライアントの追加





  • アプリとしての単位

  • ユーザープール 1 : アプリクライアント n で設定できる


    • チュートリアルとかは 1 : 1 で設定されてる

    • 複数登録してどう使い分けるんやろね :thinking:




たとえば、サーバー側のアプリケーション、および Android 用アプリケーションを作成することができます。


プラットフォームで分けるスタイルの模様

ユーザープールのアプリクライアントの設定

クライアントIDをメモっとく


ユーザーの作成


  • 本来は(他のユーザーさんに使ってもらう場合は)登録 -> Eメールに検証飛んでるので確認 ->(初回パスワード変更)の手順からユーザー作成, 検証を行って貰わないとトークン取得とかができない



  • サクッと検証用(管理者用)ユーザーを作る場合は、コンソールとかから検証済みとして追加するだけでおっけー
    ## トークンの取得

  • ここまでで取得できた「ユーザープールID」「クライアントID」「ユーザー名」「パスワード」を使う
    トークンの取得例

import {

CognitoUserAttribute,
CognitoUserPool,
ISignUpResult,
CognitoUser,
AuthenticationDetails,
} from "amazon-cognito-identity-js";
import fetch, { Request, RequestInit, Response } from 'node-fetch';
interface Global { fetch(url: string | Request, init?: RequestInit | undefined): Promise<Response> }
declare var global: Global
global.fetch = fetch
interface IUser {
name: string;
password: string;
attributeList: Array<CognitoUserAttribute>; // ユーザー作成処理の名残
}
const poolData = {
UserPoolId: USER_POOL_ID,
ClientId: CLIEND_ID
};
const userPool = new CognitoUserPool(poolData);
...
...
function login(user: IUser) {
const details = new AuthenticationDetails({
Username: user.name,
Password: user.password
});
const cognitoUser = new CognitoUser({
Username: user.name,
Pool: userPool
});
cognitoUser.authenticateUser(details, {
onSuccess: result => {
console.log(`id token [${result.getIdToken().getJwtToken()}]`);
},
onFailure: err => {
console.log(err);
}
});
}
...
...


Lambda の用意


  • 今回は動作確認のためデフォルトのままを使用


    • テンプレートとして Node10.x を選ぶと hello world が返る関数が追加される




API Gateway

GET / をデプロイ


  1. API作成

  2. オーソライザーから最初に作った Cognito ユーザープールの選択


    1. トークンのソースは Authentication で

    2. テストからさっき取得したトークンを入力すると 200 + 管理ユーザー情報が返ってくる事が確認できる



  3. メソッドの作成 > GET

  4. Lambda と紐付ける

  5. メソッドリクエストの認可からオーソライザー選択


    1. これがないと認証のないAPIになる



  6. デプロイ(ステージ prod)
    curl とかから動作確認できる

$ curl ~/prod

{"message":"Unauthorized"} <- 認証失敗でコケ
...
$ curl ~/prod -H "Authentication: xxx"
{"statusCode":200,"body":"\"Hello from Lambda!\""}

できました :raised_hands:

あとはこれを繰り返してアプリ化でおっけーです。


その他参考リンク