@suzu6

主にWEBと解析の技術について書きます。

広く浅くも続ければ深くなるはず。

AWSで始めるサーバレスなブログサービス

ご覧になっているサイトはサーバレスなブログサービスとなっています。

AWSのサービスを使ってサーバレスなウェブアプリケーションを作成方法を紹介していきます。

この記事の要旨

この記事では、サーバレスアーキテクチャとはどんなものかAWSをベースにしてご紹介します。 そして、このブログサービスの構成の紹介をします。

サーバレスアーキテクチャとは

サーバレスアーキテクチャとは、サーバの構築や管理が必要ないアプリケーションの実行環境です。
サーバの構築や管理はクラウドの事業者に任せ、開発者はアプリケーションの開発に専念することが出来ます。

サーバーレスアーキテクチャ上のファンクションは、何らかのイベントをトリガーとして呼び出される。イベントごとに実行プロセスが起動し、ファンクションの終了とともにプロセスが終了します。

料金体系はプロセスの実行時間に対してのみ掛かるため、呼び出されない間は費用がかかりません。 また、自動的にスケーリングするため、アクセスの増減も柔軟に対応できます。 EC2などの常駐型のサーバに比べ、低コストでスケーラビリティに優れていまるようです。

ファンクションは、クラウドで提供されているその他のサービスと組み合わせてウェブアプリケーションを構築します。

AWSを見てみると、ファイル/データベースストレージ、メール配信、認証、IoTデバイスの管理や機械学習など様々なサービスがあります。それぞれ実装すると大変ですが、どれも簡単な設定で使えるようになっています。

この中から必要なサービスを選び、ファンクションで繋いで目的のサービスを構築していきましょう。


サーバレスアーキテクチャについてまとまっている記事

AWS Lambda

AWSでのファンクションはLambdaです。イベントによって処理を実行するサービスであり、サーバレスの中核となります。

Lambda 公式サイト

Lambdaを使った例は、

  • S3に画像をアップした時にサムネイル画像を作成する。
  • APIサーバとして、クライアントから通信を受けたらJSONを返す。
  • データベースに登録した値をみて、メールを通知する。
  • 指定の時間が来たら、バックアップを作成する。 など、様々な用途で活躍します。

また、すでにEC2やELBで構築済みでも、一部の機能(クーロンのイベント処理)を取り出してLambdaで実装することもオススメです。 特定の時間だけ負荷が掛かるような処理を切り出して置くことでサーバの性能を小さくしたり、ロジックの切り分けができます。

Lambdaの利用パターンは、こちらの記事に詳しく載っています。

Lambdaでのここまでの利用パターンまとめ

他のクラウドにあるLambdaと同等のサービスは、Microsft AzureのAzure FunctionsやGoogle Cloud PlatformのCloud Functionsがあります。

今回利用したAWSのサービス

サービス 概要
Lambda イベントに対して実行される計算処理のサービス
DynamoDB NoSQLのデータベースストレージ
S3 ファイルストレージ
API Gateway AWSのサービスをRESTfulなAPIとして結びつける

気をつける点はLambdaが並列分散する点です。LambdaとRDSを組み合わせて使うと、RDSのコネクションが増加してDBコネクションエラーになってしまいます。

参考:Lambda+RDSはアンチパターン

こちらに書かれているとおり、スケールアップの費用対効果が薄いようです。 そのため、データベースは分散データベースの運用とスケーリングに伴う管理作業をまかせることができるDynamoDBを利用した方が良いかと思います。

サーバレスなブログサービス

前置きが長くなりました。。。

本ブログのシステムは、AWS上にこの図の構成でサーバレスアーキテクチャを実現しています。

サーバレスなブログサービス

LambdaにPython+Flask(マイクロWebフレームワーク)で基本的なブログサービスの処理を書いています。

API GatewayにはRoute53で取得したドメインを割り当て、リクエストがあったらLambdaをキックするようにしています。

データベースはDynamoDBを利用して、記事の内容を保管します。NoSQLを初めて触ったので、RDBと特徴が全く違って苦労しましたが、なんとかブログの機能を持たせることができました。

画像などの静的ファイルはS3に置いて、Lambdaを呼びすぎないように分けています。ドメインが異なるため、CROSを有効に設定してあります。

現時点では、まだまだサービスを十分に活用できていません。

  • S3から直接ファイルを取得しているところを、キャッシュサービスのCloud Frontを使って高速化する。
  • Flaskに実装している管理者用の機能を分け、認証機能をCognitoに任せる。

など、運用しながら順次拡張していきたいと思っております。

まとめ

サーバレスアーキテクチャとは

  • サーバの構成や管理を(あまり)意識しなくてすみ、アプリの開発に専念できるできる
  • スケーラビリティに優れている
  • 利用した分だけ払う低コスト
  • 部分的な置き換えも可能

サーバレスアーキテクチャを勉強される方は、こちらの本がおすすめです。

動画シェアサイトをAWS Lambda, S3を使って実際に構築する手順が載っています。 その中で、どのようにLambdaを構成したら良いか大変参考になりました。また、DynamoDBとAuth0も詳しく書かれています。

最後まで読んでいただき、ありがとうございました。