こんにちは!
普段Web開発や保守をしており、
サーバーレス構成で開発を行ったので、その記事を記載します。
はじめに
今回は、サーバーレスアーキテクチャを活用した出力システムの構成についてご紹介します。
サーバーレスアーキテクチャは、スケーラビリティとコスト効率が高いため、多くの企業で採用されています。
本記事では、AWSのStep Functions、Lambda、RDS、S3を使用して、データを取得し、CSV形式でS3に保存した後、CloudFrontの署名付きURLでメール送信するシステムの構築について詳しく解説します。
構成図
各サービスの役割
- Step Functions
- 一連の処理フローをオーケストレーションし、各サービス間の連携を管理します。
- Lambda
- 各種処理を担当します。
- RDS
- ログを保存するリレーショナルデータベースサービスです。
- S3
- 生成されたCSVファイルを保存するストレージサービスです。
- CloudFront
- S3に保存されたファイルへの署名付きURLを提供し、安全かつ効率的に配信します。
- SES
- メール送信サービスで、通知を送信します。
- ECS Fargate
- フルマネージドのコンテナオーケストレーションサービスで、コンテナ化されたアプリケーションのデプロイと管理を行います。
- Secrets Manager
- 機密情報を安全に管理します。
システム詳細
-
ユーザー操作(ECS・Fargate)
ユーザーが画面を通じて処理リクエストします。
StepFunctionsの呼び出し方は複数あり、今回はAWS SDK を使用しました。 -
CSV生成(Lambda)
Lambda関数がRDSからデータを取得し、CSVファイルを生成しS3に出力します。 -
署名付きURLの生成とメール送信(Lambda)
アップロード完了後、CloudFrontの署名付きURLを生成し、そのURLを含むメールをSESを使用してメール送信します。 -
エラー通知(Lambda)
処理の途中でエラーが発生した場合、それを検知して通知します。
セキュリティの強化
CloudFrontの署名付きURLを活用し、S3にアップロードされたCSVファイルへのアクセスを制限します。署名付きURLは、指定した期限が過ぎると無効になり、セキュリティを強化します。これにより、ユーザーは一時的にしかファイルにアクセスできず、個人情報の漏洩リスクを軽減します。具体的には、署名付きURLの有効期限を「通知後3時間」に設定しています。
エラーハンドリングと通知
ログ出力処理がLambdaの最大実行時間である15分を超える場合、タイムアウト通知がメールでユーザーに送信され、再確認を促します。また、タイムアウト以外のエラーが発生した場合は、運用チームにチャット通知が送られ、迅速に対応できる体制を整えています。
システムは最大6回まで再試行を行い、それでも失敗が続いた場合にのみ通知が送信されます。
サーバーレス技術の活用
今回のシステムでは、サーバーレス技術を最大限に活用しています。特にAWS Lambdaは、リクエストに応じて自動的にスケールするため、データが少量でも大量でも効率的に処理可能です。また、Step Functionsは、各処理フローをスケーラブルにオーケストレーションする設計になっており、柔軟に対応可能です。
コスト面でも、サーバーを常時稼働させる必要がなく、オンデマンドで必要なリソースを使用することで効率的な運用が可能です。LambdaやStep Functionsは、実行時間に基づいて課金されるため、無駄なコストを抑えられます。
AWS SAMによるデプロイ
AWS SAMを使用してStep FunctionsとLambdaをデプロイしました。これにより、サーバーレスアプリケーションのデプロイと管理が効率化され、YAML形式のテンプレートを使用して、Lambda関数の定義やStep Functionsのワークフローを一括でデプロイ可能です。
SAMを活用することで、リソース管理がコードとして一元化され、人為的なミスが減少し、属人化を防ぐことが期待できます。
まとめ
今回紹介した出力システムは、サーバーレスアーキテクチャを基盤としたスケーラビリティ、コスト効率、セキュリティを考慮した構成となっています。ユーザーからのリクエストに基づき、RDSからデータを取得し、それをS3にアップロードし、CloudFrontの署名付きURLを生成してメールで送信するという一連のプロセスを実現しました。
エラーやタイムアウトが発生した際には迅速に適切な通知が行われ、システムの信頼性が高まります。この仕組みにより、ユーザーは安心してログ出力を利用でき、スムーズな運用が可能となります。
今後もサーバーレス技術を活用し、さらなる改善を図っていきたいと思います。