AWSサーバレス構築チュートリアル補足

チュートリアルURL

チュートリアル概要

API Gateway → AWS Lambda → DynamoDBというサーバレススタンダード構成+Cognitoによる認証を学べます。
使われるテンプレートは、地図から位置を指定してユニコーンを手配するというユーモア溢れる謎のサイトです。

モジュール 1:静的ウェブホスティング

(主に用語の)理解が難しいのがS3のセキュリティ関連。

■ACL
バケットやオブジェクト個々に設定されたアクセス制御
■バケットポリシー
バケット全体のアクセス制御ポリシー
■アクセスポイントポリシー
アクセスポイントのアクセス制御ポリシー

バケットポリシーはACLの後に作られたため設定が冗長的に見えますが、バケット全体の制御はバケットポリシー、オブジェクトに対する制御はACLを使った方が良さそう。
ACLでパブリックになっていてもバケットポリシーがdenyならブロックされます。手順上のパブリックアクセス(オン・オフ)で設定するのは上記で設定されたアクセス制限を有効にするかどうかで、手順ではバケットポリシーを有効にするために、BlockPublicPolicyとRestrictPublicBucketsのチェックを外させています。

モジュール 2:ユーザー管理

Cognitoのユーザプール設定。一般的なユーザ管理に必要なことをほぼ勝手にやってくれます。
手順ではcognitoのみがIDプロバイダになっていますが、ユーザプール作成後にフェデレーションからFacebookなどのSMSやOIDC認証によるID認証も設定できます。それらの詳細は以下参照。

ここではconfig.jsonに記載したcognitoの情報を元にjs sdkを使用してregister.htmlにてユーザ登録を行います。

// cognito-auth.js
    function register(email, password, onSuccess, onFailure) {
       var dataEmail = {
           Name: 'email',
           Value: email
       };
       var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail);

       // CognitoUserPoolのsignin()を実行.
       userPool.signUp(email, password, [attributeEmail], null,
           function signUpCallback(err, result) {
               if (!err) {
                   // 成功したらverify.htmlへ遷移.
                   onSuccess(result);
               } else {
                   onFailure(err);
               }
           }
       );
   }

成功すると登録したメアドに認証コードが送信され、verify.htmlにて認証すればアカウントが有効になります。


// cognito-auth.js function verify(email, code, onSuccess, onFailure) { // CognitoUserのconfirmRegistration()を実行. createCognitoUser(email).confirmRegistration(code, true, function confirmCallback(err, result) { if (!err) { onSuccess(result); } else { onFailure(err); } }); }

成功するとride.htmlに遷移しJwtTokenの取得処理が行われます。

// cognito-auth.js
    WildRydes.authToken = new Promise(function fetchCurrentAuthToken(resolve, reject) {
       var cognitoUser = userPool.getCurrentUser();

       if (cognitoUser) {
           // current userのsessionを取得しJwtTokenを取得する.
           cognitoUser.getSession(function sessionCallback(err, session) {
               if (err) {
                   reject(err);
               } else if (!session.isValid()) {
                   resolve(null);
               } else {
                   resolve(session.getIdToken().getJwtToken());
               }
           });
       } else {
           resolve(null);
       }
   });

モジュール 3: サーバーレスサービスバックエンド

DynamoDBの詳細は別途。
テストイベントのデータはAPI Gatewayから渡されるデータとなります。
詳細は以下。

ここではブラウザ上で直接コードを書いてますが、業務ではソース管理や外部モジュールの取り込みなど、ローカル環境が必要なのでもっと色々面倒そう。この辺は別途整理。

モジュール 4: RESTful API

トークンソースのAuthorizationはトークンを設定するhttp-header名。
実際にアクセスするURLはステージ名/リソース名となるので注意。

以上、サーバレス環境チュートリアルとなる。
ミドルのセットアップ等を一切せずにWebAPIを作れてしまうので、ちょっとしたバックエンドを立てる際の効率は劇的に向上しそうです。

この記事が気に入ったらサポートをしてみませんか?