Serverless FrameworkのExampleを見て、サーバーレスの様々な実装を学ぼう
概要
CX事業本部の佐藤です。
Serverless FrameworkではExampleとして、さまざまなサーバーレスの実装パターンを公開しています。実際に業務で使用するようなサーバーレス実装が多数ありサンプルコードが公開されているため、実際に動かしてみたりソースコードを見たりして学ぶことができ、とても参考になります。
サンプルコードはGitHubリポジトリに公開されています。
https://github.com/serverless/examples
オーソドックスなサーバーレス実装パターン
Exampleのサーバーレスのサンプルパターンの中からオーソドックスな実装パターンを一覧にしてみました
- API Gateway、Lambda、DynamoDBを使用したシンプルなREST API
- Cognito、Auth0を使用したカスタムオーソライザー
- Kinesis Data StreamとElasticserachを使ったストリーム処理
- CloudFrontを使った、Single Page Applicationのホスティング
- AWS IoTルール on Lambda
Auth0を使用したカスタムオーソライザーのサンプルを動かしてみる
ExampleではAWSにデプロイして動作確認する方法が記載されています。今回は、Exampleの中のAWS | Auth0 Custom Authorizers APIを動かしてみたいと思います。
概要図
環境
項目 | バージョン |
---|---|
macOS | Mojave 10.14.5 |
node | v10.16.0 |
npm | 6.9.0 |
セットアップ
- serverless frameworkのインストール
$ npm install -g serverless
- サンプルコードのインストール
$ serverless install -u https://github.com/serverless/examples/tree/master/aws-node-auth0-custom-authorizers-api -n auth0-custom-authorizers
- ライブラリのインストール
$ cd auth0-custom-authorizers $ npm install
- Auth0のセットアップ
- Auth0にアクセスします
- 右上のサインアップをクリック
- EメールやGoogleアカウントなどでサインアップします
- ダッシュボードが開かれるため、CREATE APPLICATIONをクリックします
- Nameに
aws-node-auth0-custom-authorizers-api
と入力します - Choose an applization typeに
Single Page Web Applications
を選択します
- Auth0のクライアントIDの取得と設定
- Auth0のダッシュボードの
Applications
→aws-node-auth0-custom-authorizers-api
→Settings
タブを選択し、Client ID
の値をコピーします - プロジェクトの
secrets.example.json
をsecrets.json
に名前を変更し、AUTH0_CLIENT_ID
の値を先ほどコピーしたクライアントIDに置き換えます{ "AUTH0_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXX" }
- Auth0のダッシュボードの
- Auth0のPublic Keyの取得と設定
- Auth0のダッシュボードの
applications
→aws-node-auth0-custom-authorizers-api
→settings
→Show Advanced Settings
→Certificates
を選択します DOWNLOAD CERTIFICATE
をクリックし、PEM形式のファイルをダウンロードし、public_key
という名前でプロジェクトのルートに保存します
- Auth0のダッシュボードの
- AWS環境にデプロイする
$ serverless deploy
Serverless: Excluding development dependencies... Serverless: Creating Stack... Serverless: Checking Stack create progress... ..... Serverless: Stack create finished... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Uploading service auth0-custom-authorizers.zip file to S3 (153.89 KB)... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... .............................................................................. Serverless: Stack update finished... Service Information service: auth0-custom-authorizers stage: dev region: ap-northeast-1 stack: auth0-custom-authorizers-dev resources: 26 api keys: None endpoints: POST - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/api/public POST - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/api/private functions: auth: auth0-custom-authorizers-dev-auth publicEndpoint: auth0-custom-authorizers-dev-publicEndpoint privateEndpoint: auth0-custom-authorizers-dev-privateEndpoint layers: None Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
デプロイできました
-
プロジェクトの
frontend/app.js
ファイルの上部のAUTH0_CLIENT_ID
、AUTH0_DOMAIN
、PUBLIC_ENDPOINT
、PRIVATE_ENDPOINT
の値をそれぞれ更新します// Fill in with your values const AUTH0_CLIENT_ID = 'your-auth0-client-id-here'; const AUTH0_DOMAIN = 'your-auth0-domain-here.auth0.com'; const AUTH0_CALLBACK_URL = window.location.href; // eslint-disable-line const PUBLIC_ENDPOINT = 'XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/api/public'; const PRIVATE_ENDPOINT = 'https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/api/private';
- プロジェクトの
frontend/
フォルダ配下をホスティングします。好きなホスティングサービスで良いですが、今回はS3の静的Webサイトホスティングの機能を使います。- 適当な名前のS3バケットを作成します
- S3バケットに
frontend/
フォルダ配下をアップロードします$ s3 sync s3:{バケット名} frontend/
- S3バケットのプロパティのStatic website hostingを有効にします
- Static website hostingを選択
- このバケットを使用してウェブサイトをホストするを選択
- インデックスドキュメントに
index.html
を入力 - 保存
- アクセス権限を設定します
- バケットのアクセス権限タブを選択します
- ブロックパブリックアクセスを選択し、パブリックアクセスをすべてブロックのチェックを外し、保存します
- バケットポリシーを選択し、以下の内容をコピペし保存します
{ "Version": "2008-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::{バケット名}/*" } ] }
- Auth0の
Allowed Callback URLs
とAllowed Origins (CORS)
の設定- Auth0ダッシュボードを開きます
Application
->Settings
を選択しますAllowed Callback URLs
、Allowed Origins (CORS)
にホスティングしたURLを入力します。例:http://{バケット名}.s3-website-ap-northeast-1.amazonaws.com/
- SAVE CHANGES
{バケット名}.s3-website-ap-northeast-1.amazonaws.com
にアクセスして以下のような画面になればOKです
動作確認
このサンプルでは、認証が必要ないパブリックなAPIと認証が必要なプライベートなAPIがあります。
- まずは、
Call Protected API
を叩いてみます
UnAuthorized
となりました
- 次に、
Call Protected API
を叩いてみます。
Hi ⊂◉‿◉つ from Public API
と表示されてます。うまくいってるようです。
- 次に、Auth0でログインします。
自分のEメールか、Googleなどでサインインします。サインイン後、再び
Call Protected API
を叩いてみます。
先ほどはUnAuthorized
でしたが、今回はHi ⊂◉‿◉つ from Private API. Only logged in users can see this
と表示されました。うまくいってそうです。
まとめ
このように、実際にデプロイして動作を確認することで、サーバーレスの実装イメージが湧きやすくなると思います。他にもいろいろなサンプルがあるため、実際に動かしてみてサーバーレスアーキテクチャの勉強をしていきましょう。