Gateway~こんにちは。今回はAWS環境におけるサーバレスアーキテクチャの構築をご紹介させていただきます。今回構築するシステムは下記の様になります。Lambdaを利用した一般的なサーバレスアーキテクチャの構成に、Basic認証を設定するためのCloudFrontとLambda@Edgeを組み込んだものになります。FormationのJSONテンプレートを簡易的に作成するツールとなります。作成したJSONファイルはS3のバケットに保存される仕組みとなります。手順それでは、さっそく構築を行っていきましょう。はじめに、S3バケットを作成します。サイトページ用とJSONファイル保存用の2つのバケットを作成します。適当な名前でバケットを作成していただいて構いません。静的ウェブサイトホスティングの有効化は不要です。次にCloudFrontの設定を行い、作成したS3バケットに関連付けていきます。Distributionを選択し、下記の内容にてDistributionを作成します。index.html記載のない設定に関しましてはデフォルトのままで構いません。Lambda@Edgeの組み込みは後から行いますので、現時点では設定不要です。次に、JSONテンプレートの作成を行うLambda関数の作成を行います。3.6にてコードを記述しております。'https://xxxxxxxxxxxxxx.cloudfront.net/'}いろいろ書いていますが、行っていることは単純で下記の内容のみになります。最後に記載しているreturnは処理の実行後にリクエストページに戻るよう設定するためにCloudFrontのドメインURLを指定しています。上記コードに関しましては本ブログ用途で簡易的に作成したものとなりますので、入力値の判定等の処理は入れておりませんのでご注意ください。Gatewayの設定を行います。適当な名前でAPIを作成し、リソースの作成を行います。リソースを作成したらPOSTメソッドを追加し、先程作成したLambda関数のARNを指定します。POSTメソッドの追加が完了したら、リクエストとレスポンスに関する設定を行っていきます。統合リクエストを選択し、下記の本文マッピングテンプレートを追加します。$util.urlDecode($input.json("$"))}次にメソッドレスポンスを選択し、既存のレスポンスを削除、下記のレスポンス追加を行います。Location次に統合レスポンスの設定を行います。こちらもメソッドレスポンスと同様に既存の統合レスポンスを削除し、下記の統合レスポンスを追加します。作成した統合レスポンスのヘッダーのマッピングを選択し、下記マッピングの値を設定します。integration.response.body.location上記設定が完了したら、APIのデプロイを行い、一度動作確認を行ってみたいと思います。下記内容を記載したindex.htmlファイルをS3バケットにアップロードし、CloudFrontのドメインURLにアクセスしてみます。value="post"></br></form></body></html>正常に設定が行われている場合には以下の様な画面が表示されると思います。適当な内容を入力し、postをクリックしてみてサイトが再読み込みされれば正常です。Lambda関数で指定したS3バケットにJSONのデータが格納されているはずです。最後にLambda@Edgeを組み込み、Basicn認証の設定を導入したいと思います。ここで利用するコードは以下の内容を参考にさせていただきました。https://gist.github.com/lmakarov/e5984ec16a76548ff2b278c06027f1a4コード自体はそのままでも利用できるのですが、数点注意点があるのでご確認ください。・ID/Passwordに関してコード内部でのべた書きとなります(Lambda環境変数を試しましたが対応していないとのエラーでした)。・タイムアウト値に関してデフォルトの3秒でOK。反対に1分とか5分を指定するとCloudFront導入時に怒られるので注意。・作成リージョンに関してCloudFrontに組み込む形となるので、Lambda関数はus-east-1(バージニア北部)に作成する必要があります。上記のLambda関数を作成したら「アクション」から「新しいバージョンを発行」を選択し、CloudFrontに組み込めるよう設定します。CloudFrontサービスページにアクセスし、作成済みのDistributionを選択します。Behaviorsタブを選択し、既存の設定を編集します。下のLmabdaの設定箇所に下記内容を指定します。先程作成したLambda@EdgeのARN(arn:aws:lambda:us-east-1:123456789123:function:xxxxxxxxxxx:1)以上でBasic認証の組み込みも完了し、すべての作業が完了となります。最後にBasic認証の動作確認をしてみます。先程と同様にCloudFrontのドメインURLにアクセスしてみると認証情報を聞かれます。ここでlamdba@Edgeのコードに記載したユーザ名とパスワードを指定することで、S3のコンテンツにアクセスできるようになります。Gatewayのリソースポリシー)今回ご紹介したlambda@Edgeを利用したBasic認証の仕組みは、CloudFront経由のアクセスに認証をかける形となります。GatewayのデプロイURLを直接指定されると、バックエンドのLambdaにリクエストが届いてしまいます。Gatewayへのアクセスを制限する必要があります。Gatewayのリソースポリシーを利用したIP制限をBasic認証と合わせて導入しております。Gatewayへのアクセスを前段のCloudFrontまたはS3バケットからのみに制限する形を本当は取りたかったのですが、思ったような動作が得られず断念しました。まとめ今回はAWS環境におけるサーバレスアーキテクチャの構築に関してご説明しました。単純なアプリケーションなどであれば利用コストを削減することも可能で、運用やバックアップなどのタスクも削減できます。サーバレス化の向き不向きもありますがメリットが大きいので、AWSでのシステム構築時にはサーバレスアーキテクチャもお考えになってみてはいかがでしょうか。