サーバーレスアーキテクチャを活用したシステムの紹介

Webエンジニアをしています徳井です。
普段はWeb開発やシステムの保守を担当しています。
今回、サーバーレスアーキテクチャを活用したシステム開発を行いました。その構成についてお伝えしたいと思います。

はじめに

サーバーレスアーキテクチャは、スケーラビリティとコスト効率が高く、多くの企業で採用されています。

本記事では、AWSのStep Functions、Lambda、RDS、S3を使用し、データを取得、CSV形式でS3に保存、CloudFront署名付きURLでメール送信するシステムの構築について紹介します。

アーキテクチャの概要

本構成において、各サービスの役割は次の通りです。

  • Step Functions
    • 一連の処理フローをオーケストレーションし、各サービス間の連携を管理します。
  • Lambda
    • データ取得、CSVファイルの生成、メール送信などの各種処理を担当します。
  • RDS
    • データを保存するリレーショナルデータベースサービスです。
  • S3
    • 生成されたCSVファイルを保存するストレージサービスです。
  • CloudFront
    • S3に保存されたファイルへの署名付きURLを提供し、安全かつ効率的に配信します。
  • SES
    • メール送信サービスで、通知を送信します。
  • ECS Fargate
    • フルマネージドのコンテナオーケストレーションサービスで、コンテナ化されたアプリケーションのデプロイと管理を行います。
  • Secrets Manager
    • 機密情報を安全に管理します。

システムの処理

  1. ユーザーリクエスト(ECS・Fargate)
    • ユーザーがデータ出力画面を通じてデータのダウンロードをリクエストします。リクエストには、出力期間やフォーマットなどのパラメータが含まれます。
    • 今回は、AWS SDK を使用してStep Functionsを呼び出すようにしました。
  2. ワークフローの起動(Step Functions)
    • ECS Fargateからワークフローが起動されます。この際、AssumeRole を用いることで、アカウント間を跨ぐ呼び出しをセキュアに実行しています。
    • 必要な時に必要な権限だけを一時的に付与し、最小限の権限で安全に運用できるようにしています。
    • その後、データを取得してS3にCSVを保存し、そのS3の署名付きURLをユーザーにメールで送信します。もし、タイムアウトやエラーが発生した場合には、適切な通知が行われる仕組みです。
  3. データ取得・CSV生成S3へのアップロード(Lambda)
    • リクエストを受け取ったLambda関数がRDSからデータを取得し、指定されたフォーマットでCSVファイルを生成しS3にアップロードします。
  4. 署名付きURLの生成とメール送信(Lambda)
    • アップロード完了後、CloudFrontの署名付きURLを生成し、そのURLを含むメールをSESを使用してユーザーに送信します。
  5. エラー通知(Lambda)
    • 処理の途中でエラーが発生した場合、それを検知してチャットツールに通知します。
  6. タイムアウト通知(Lambda)
    • 処理の途中でタイムアウトが発生した場合、それを検知してメール通知します。
    • ※今回の要件で、Lambdaの制限(15分)内で出力できる範囲での出力を想定していたため、タイムアウトの場合、条件を絞って再度出力してもらうように促す仕様にしています。

工夫した点

CloudFrontと署名付きURLの活用

CloudFrontの署名付きURLを利用して、S3にアップロードされたCSVファイルへのアクセスを制限しています。認証が成功すればユーザーにファイルを提供しますが、有効期限が短く設定されているため、指定期限後は無効となり、個人情報漏洩のリスクが軽減されます。この方法により、長期間有効な公開リンクのリスクも回避できます。

さらに、アクセス管理の一環として、出力プロセスにタイムアウトやエラーが発生した場合、その状況を監視し、必要に応じて通知が送信される仕組みも実装されています。

タイムアウト・エラー通知と再試行

出力処理がLambdaの最大実行時間である15分を超える場合、タイムアウト通知がメールでユーザーに送信されます。この通知には、リクエストしたデータの範囲や条件を再確認し、適切な範囲で再出力を促す案内が含まれています。

また、タイムアウト以外のエラーが発生した場合は、運用チームにチャット通知が送られます。専用のチャットルームにエラーが通知されることで、即座に監視・対応が行えます。

なお、タイムアウトやエラーが発生した場合、システムは最大6回まで再試行を行い、それでも失敗が続いた場合にのみ通知が送信されるように設定されています。

サーバーレスアーキテクチャのスケーラビリティとコスト効率

今回のシステムでは、サーバーレス技術を最大限に活用しています。
特にAWS Lambdaは、リクエストに応じて自動的にスケールするため、データが少量でも大量でも効率的に処理可能です。さらに、Step Functionsは、各処理フローをスケーラブルにオーケストレーションする設計になっており、柔軟に対応可能です。

コスト面でも、サーバーを常時稼働させる必要がなく、オンデマンドで必要なリソースを使用することで効率的な運用が可能です。Lambda関数やStep Functionsは、実行時間に基づいて課金されるため、無駄なコストを抑え、必要な時にだけリソースを活用できます。

AWS SAM によるデプロイ

AWS SAMを使用して、Step FunctionsとLambdaをデプロイしました。これにより、サーバーレスアプリケーションのデプロイと管理がより効率的になりました。SAMを使って、Lambda関数やStep Functionsのステートマシンをテンプレート化し、自動でインフラを展開するプロセスが容易に実施できました。

具体的には、YAML形式のテンプレートを使用して、Lambda関数の定義やStep Functionsのワークフローを記述し、それを一括でデプロイしました。例えば、S3にアップロードされたファイルを処理するLambda関数と、その結果を他のサービスに渡すフローを管理するため、Step Functionsを利用しました。このテンプレートにすべての依存関係や権限設定を含めることで、デプロイ作業が自動化され、ミスのリスクを最小限に抑えることができました。

SAMを活用したことで、リソース管理がコードとして一元化され、人為的なミスがなくなり、属人化を防ぐことが期待できます。

AWS SAM(Serverless Application Model)の詳細については、公式ドキュメントをご覧ください。SAMの機能や導入方法が詳しく説明されており、サーバーレスアプリケーションのデプロイを効率化するための情報が満載です。

まとめ

今回紹介したデータ出力システムは、サーバーレスアーキテクチャを基盤としたスケーラビリティ、コスト効率、セキュリティを考慮した構成としました。
ユーザーからのリクエストに基づき、RDSからデータを取得し、それをS3にアップロードします。その後、CloudFrontの署名付きURLを生成し、メールでユーザーに送信するという一連のプロセスを実現しました。

さらに、エラーやタイムアウトが発生した際には、迅速に適切な通知が行われるため、システムの信頼性が高まります。この仕組みにより、ユーザーは安心してデータ出力を利用でき、スムーズな運用が可能となります。

今後もサーバーレス技術を活用し、さらなる改善を図っていきたいと思います。

最後に

弊社では多様なプロダクトがあり、様々なAWSサービスを積極的に活用しており、今後もその使用は一層増加する見込みです。

AWSを使用したプロジェクトの詳細に関してはカジュアル面談や採用過程で詳しくお話ができると思います。

エフアンドエムネット株式会社では一緒に働く仲間を募集しています!

詳しくは採用ページをご覧ください!