サーバーレス
SQSの選択
SQSはポーリング処理型のキューイングサービス。
- Amazon SNS
- フルマネージド型pub/subメッセージングを実施するサービス
- メール通知やプッシュ通知による連携処理に利用する
- Amazon SQS
- フルマネージド型のキューイングサービス
- ポーリング処理によるタスクの並列実施に利用する
- Amazon SES
- Eメール機能を可能にするサービス
- アプリケーション上にEメール送受信機能を実装する際に利用する
- 安全、グローバル、大規模にEメールを送信が可能になる
- Amazon MQ
- JMS、NMS、AMQP、STOMP、MQTT、WebSocketなどの業界標準APIやメッセージング用プロトコルを使用するApache ActiveMQ向けのマネージド型メッセージブローカーサービス
- Amazon Kinesis Data Streams
- 5MBまでの容呈のあるデータをストリーム処理することが可能でシャード単位でデータを順番通りに送信することができる
Amazon SQS
参考
特徴
メッセージの制約
- メッセージ数は無制限に利用可能
- メッセージサイズは最大256KB
- コンシューマー側では一度に10件までメッセージを受信可能
メッセージの保持期間
- SQSのキューメッセージは保持期間の間は保存される
- デフォルト4日間(最小60秒~最大14日で設定可能)
- アプリケーション上でメッセージを削除する処理を実施しないと、期問を超過するまでキューが滞留してしまう
- DeleteMessageAPIを使ってメッセージを削除しない限り、保持期間中のメッセージは処理後も保持される
キュータイプ
- 標準キュー
- 順序が正確ではなく重複がありうる
- 1秒当たりのトランザクション数はほぼ無制限
- FIFOキュー
- 順序が正確で重複がない
- 1秒当たりのトランザクション数は300が制限
可視性タイムアウト
処理担当のインスタンス以外からは一定時間(30秒~12時間)キューが見えなくなる機能。
他のコンシューマーが同じメッセージを再処理しないように可視性タイムアウトを設定することで、重複処理を防ぐことができる。
キュータイプ
- 遅延キュー
- キューへの新しいメッセージの配信を数秒間遅延させることができる機能(0秒から15分で設定)
- 優先度付きキュー
- キューの処理順序に優先度をつけることができる
- これにより、優先対応があるタスクを最初に処理するようにワークフローを設定できる
- デッドレターキュー
- 正常に処理(消費)できないメッセージを別のキューへと移動させる
- 処理不能なキューが蓄積されるのを防ぎつつ、処理できなかった理由を後で解析できる
- 一時キュー
- 高スループットでコスト効率に優れたアプリケーション管理向けに利用されるキュー
- 各一時キューへのトラフィックが少ない場合はAPI呼び出しが少なくなり、スループットを高める
- 一時キューが使用されなくなると、クライアントは一時キューを自動的にクリーンアップする
- 特定スレッドまたはプロセスの軽量通信チャネルとして機能
- 仮想キューとの間でメッセージを送受信を実施
- 一時キュークライアントを利用して、リクエスト・レスポンスなどの一般的なメッセージパターンを開発できる
キューの詳細設定
- メッセージ重複排除ID
- 送信されたメッセージの重複排除に使用するトークン
- 同一の重複排除IDが設定されたメッセージをキューへ送っても5分間の間は受付けられないように設定できる
- FIFOのみで利用する
- 暗号化
- AWS KMSを使用して送信データを暗号化する
- メッセージタイマー
- 個々のメッセージにキューに追加されたメッセージの初期表示不能期間を指定する機能
- 45秒のタイマーでメッセージを送信すると、キューの最初の45秒間は表示されない
- 個々のメッセージではなくキュー全体に対して遅延の秒数を設定するには、遅延キューを使用する
- 個々のメッセージのメッセージタイマー設定はキュー全体よりも優先される
アクセス管理
SQSポリシーを利用して他アカウントや他リソースからのアクセスをコントロールすることができる
バッチアクション
1回のアクションで複数のメッセージを操作するなどのバッチ処理が設定できる。
- SendMessageBatch
- DeleteMessageBatch
- ChangeMessageVisibilityBatch
基本構成
フロントエンドサーバーとバックエンドサーバーに分けて疎結合化する。
フロントエンドで処理が終わったらバックエンドへ処理を持っていき、バックエンドで継続処理をする。
バックエンドで負荷がかかっていても、フロントエンドはそれを意識せずに処理を行っていき、キューにメッセージ(処理結果)を溜める。
バックエンドは処理が可能になったらポーリング処理をして処理を開始する。
Auto Scalingを利用し、CloudWatchメトリクスに基づいてキューの処理量に応じてサーバーの自動スケーリングを行う。

Amazon SNS
フルマネージド型のプッシュ型通知サービスで、他のサービスとの非同期通信を可能にする。
特徴
- 単一発行メッセージ
- FIFOトピックを利用すると順序を保証可能
- 取り消し不可
- メッセージサイズは最大256KB
SNS連携
- Amazon CloudWatch:Billing Alertの通知
- Amazon SES:Bounce/Complaintのフィードバック通知
- Amazon SQS:SNS通知によりキューを配信して処理を実行
- Amazon S3:ファイルがアップロードされたときの通知
- Amazon Elastic Transcoder:動画変換処理完了/失敗時の通知
- AWS Lambda:SNSをトリガーとして処理を起動する
Amazon SES
フルマネージド型/サーバーレス型のコスト効率に優れたEメールサービス。
- スケーラブルな構成で信頼性が高いフルマネージド型
- メール送信:トランザクションメールなどの高品質なコンテンツを顧客に送信可能
- メール受信:受信したメールをトリガーにS3やLambdaなどを起動可能
- バウンス処理:メールが送れなかった場合の処理を規定
メール送信方法
単なるメールサーバーとして利用するだけでなく、アプリから自動でメール送信や連携処理に利用可能。
- HTTP REST API
- SendEmail API:From/To/Subject/Bodyだけ用意すればSES側でメッセージを生成して送信する
- SendRawEmail API:メッセージ全体をアプリケーション側で生成して送信する
- 認証:AWSアクセスキーとシークレットアクセスキーを使用
- SMTPエンドポイント
- 生成済みEmailメッセージを受け取ってSESのSMTPエンドポイントを経由してメールを送信する。SMTPを前提としてプログラムから直接利用する場合などに利用
- 利用ボート
- 25
- 465(SMTP over SSL)
- 587(Message Submission)
- TLS(Transport Layer Security)が必要
- 認証:専用IAMユーザを作成してそのクレデンシャルを使用
Lambda
サーバーを起動せずにプログラミングコードを実行する仕組み。
簡易なアプリケーション処理を構築することができる。
特徴
- 実行基盤は全てAWS側で管理されているマネージド型サービス
- AWSサービスと連携させることでLambda関数(ファンクション)と呼ばれる簡単にイベントドリブンなアプリケーションを実装可能
- Java、Go、PowerShell、Node.js、C#、Python、Rubyのランタイムをサポート
【関数の内容】
- コード
- 関数のコードと依存関係を作る。スクリプト言語の場合は、組み込みエディタで関数コードを編集が可能。ライブラリを追加するには、またはエディタでサポートされていない言語の場合は、デプロイパッケージをアップロードする。デプロイパッケージのサイズが50MBを超える場合はS3からアップロードする
- ランタイム
- 関数を実行するLambdaランタイムのこと
- ハンドラー
- 関数の呼び出し時にランタイムで実行されるメソッド
課金
リクエスト数とコードの実行時間で課金される。
- コード実行時間に対しての課金されるため、サーバーを保持して処理コードを実行するよりもコスト効率が非常に高い
- リクエストの数とコードの実行時間に基づいて課金
- 実行時間はコードの実行が開始された瞬間から処理が返されるか、中止されるまでの時間で計算される。値は100ミリ秒単位で切り上げられる
- 1か月ごとに100万件の無料リクエスト、および40万GB-秒のコンピューティング時間が無料枠になっている
制限
- 関数のタイムアウト時問はデフォルト値は3秒で、許容されている最大値は900秒(15分)。タイムアウトに達すると、関数が停止される
- 関数の最大同時実行数はデフォルトは100で、最大は1000(申請によって数十万まで引き上げ可能)
- 関数の実行時に使用できるメモリの量128MB~10,240MB
- /tmpディレクトリのストレージの保存可能容量は512MB~10,240MB
- Lambdaレイヤーを最大5つまで設定可能
実装
パーミッション
Execution RoleによりLambdaがS3やDynamoDBなどその他リソースで実行できる許可設定を行う。
AWS Labmdaアプリケーション
Lambda関数をイベントソースやその他のリソースと組み合わせたもので、協調して動作することによりタスクを実行する。
- AWS Serverless Application Repository
- 数クリックでアカウントにデプロイできるLambdaアプリケーションのコレクションを提供
- リポジトリにはプロジェクトの開始点として使用できるアプリケーションとサンプルが保存されている
- AWS SAM+CloudFormation
- CloudFormationの拡張機能であり、CloudFormationのデプロイ機能を利用できる
- Lambda関数を迅速に記述可能な構文で定義することができる
Lambdaの処理タイミング
他のAWSサービスやSDKを利用してアプリケーションから呼び出して実行することが可能。
- 非同期呼び出し
- 関数を非同期的に呼び出してイベントを処理する
- 関数を非同期的に呼び出す場合は、関数コードからのレスポンスを待機しない
- 同期呼び出し
- 関数を同期的に呼び出すと、Lambdaが関数を実行し、レスポンスを待つ
- 実行完了時に、実行された関数のバージョンなどの追加データとともに、Lambda関数内でセットしたレスポンスが返ってくる
スケーリング
- 自動でスケーリングする方式
- 関数の最大同時実行数はデフォルトは100で、最大は1000(申請によって数十万まで引き上げ可能)
- スケーリングする内容を事前に設定する方式
- 予約同時実行
- 関数の同時インスタンスの最大数を予め予約しておいて、保証する
- メリットは、他の関数が関数のスケーリングを妨げないことと、関数のスケーリングが制御不能にならないこと
- プロビジョニング済み同時実行
- リクエストされた数の実行環境を初期化して、関数の呼び出しに即座に応答する準備をしておく
- 予約同時実行
その他のLambdaに関する機能
Lambdaレイヤー
Lambdaファンクション間で共通する機能をライブラリのように別機能にしてLambdaレイヤーとして定義・参照できる。
Lambda@Edgde
CloudFrontのエッジロケーションを使って、エッジ側でLambda関数を実行することで処理を効率化する。
RDSプロキシ
Lambdaを利用してRDSデータベースに接続する際は、RDSプロキシをエンドポイントの代わりに利用して接続することでコネクションを効率的に実行することができる。
VPCアクセス
Lambdaは指定しなければリージョン内のどこかで設定されるが、指定することでVPC内にLambdaを設定することもできる。
インターネットを経由せずにVPC内のAWSリソースにアクセスができるようになる。
IAMロールに"AWSLambdaVPCAccessExecutionRole"のポリシーをアタッチしておく。
コード署名
Lambda関数にコード署名を付与することで、コードが変更されず、信頼された発行元から提供されていることを証明できる。
AWS Signer
コード署名サービス。
API Gateway
API(Application Programming Interface)とはシステムとシステムをつなぐ連結器のこと。

参考
API Gatewayは、APIの作成・管理・保護・監視などを提供するフルマネージド型のサービス。
APIコールを実行してLambda関数を起動してサーバーレスアプリケーションを実行する。
参考
- 最大数十万個のAPI同時呼び出し·受付が可能
- アクセス制御の管理
- DDoS攻撃対応やスロットリングによるバックエンド保護
- EC2/Lambda/任意のウェブアプリケーションのワークロード処理を実行する
- Lambdaと密接に統合されている
- Swagger/Open APIのインポートによってAPIを定義
- WebSocketを利用したリアルタイムかつ双方向通信のAPIも処理可能
APIのタイプ
- HTTP ΑΡI
- 使用したAPIコールの分だけ料金が発生
- REST APIよりも低いレイテンシーとコストでRESTful APIを作成する
- AWS Lambda関数またはルーティング可能なHTTPエンドポイントにリクエストを送信できる
- RESTful API
- 受信したAPIコールと転送データ量に対してのみ料金が発生
- バックエンドのHTTPエンドポイント、Lambda関数、その他のAWSのサービスを使用する
- 主に同期通信に依存するアプリケーションに利用する
- クライアントがサービスにリクエストを送信し、サービスが同期的に応答するリクエスト/レスポンスモデルを使用する
- WebSocket API
- 送受信したメッセージ数および分単位の接続合計時間で料金が発生
- 双方向用の通信方式でクライアントはサービスにメッセージを送信し、サービスは個別にクライアントにメッセージを送信することで豊かなクライアント/サービスの対話を実現する
- チャットアプリ、コラボレーションプラットフォーム、マルチプレイヤーゲーム、金融取引プラットフォームなどのリアルタイムアプリに使用
API Gatewayの統合
APIメソッドを作成して、Lambdas関数やWEBサイトなどのバックエンドポイントと統合する。
統合タイプ
- Lambda統合
- Lambda関数との統合方式
- Lambda関数はAPI Gatewayと密接に連携しており、プロキシ統合またはLambda非プロキシ(カスタム)統合を使用して、APIメソッドをLambda関数に統合する
- HTTP統合
- バックエンドのHTTPエンドポイントを公開する
- HTTPプロキシ統合またはHTTPカスタム統合を使用して、APIメソッドをHTTPエンドポイントに統合する
- プライベート統合
- VPC外のクライアントからVPC内にあるHTTP/HTTPSリソースにアクセスするために利用する統合方式
- API Gatewayがサポートする認証方法によりAPIへのアクセスを制御できる
- Mock統合
- バックエンドを統合することなく、API Gatewayから直接APIレスポンスを生成できる統合方式
- これによりAPIを操作する必要がある他の依存チームのブロックを解除できる
- また、APIの概要やAPIへのナビゲーションを提供できるAPIのランディングページをプロビジョニングすることが可能となる
Lambda統合
- Lambdaプロキシ統合
- API Gatewayがクライアントリクエスト全体をバックエンドLambda関数にマッピングして、Lambda関数と統合する
- API Gatewayに許可ロールを設定して統合設定するだけで自動的にマッピングして統合できる
- クライアントがAPIリクエストを送信すると、API Gatewayは、統合されたLambda関数に rawリクエストをそのまま渡す。リクエストパラメータの順序は保持されない
- このリクエストデータには、リクエストヘッダー、クエリ文字列パラメータ、URLパス変数、ペイロード、およびAPI設定データが含まれる
- Lambda非プロキシ統合
- プロキシ統合のセットアップステップに加えて、受信リクエストデータがどのように統合リクエストにマッピングされるか、統合レスポンスデータの結果がメソッドレスポンスにマッピングされるかを指定する
APIエンドポイントのタイプ
- エッジ最適化APIエンドポイント
- CloudFrontと連携してグローバルにクライアントが分散している場合に最適にルーティングする
- APIリクエストは最寄りのCloudFront POP(Point Of Presence)にルーティングされる
- CloudFrontは、リクエストをオリジンに転送する前に、Cookie名の自然な順序でHTTP Cookieを並べ替える
- リージョナルAPIエンドポイント
- 同じリージョンのクライアントに最適なルーティングをする
- 同じリージョンのAPIを呼び出す場合などにリージョン別APIは接続のオーバーヘッドを減らするこができる
- CloudFrontを利用することも可能である
- プライベートAPIエンドポイント
- VPC内のクライアントに最適なルーティングをする
- VPCからしかアクセスできないAPIエンドポイント
- インターフェイスVPCエンドポイントにはVPC内に作成するエンドポイントネットワークインターフェイス(ENI)を利用する
- リソースポリシーを利用してアクセスを制御できる
APIの拡張機能
キャッシュ機能
キャッシュを有効にすると、エンドポイントへの呼び出しの数を減らし、APIへのリクエストのレイテンシーを短くできる。
スロットリング
リクエスト数が多すぎる場合、制限をかけることで、トラフィックの急増に対してバックエンドサービスを守る。
サーバー側のスロットリング制限、クライアントあたりのスロットリング制限ができる。
API Gatewayの認証方式
- リソースポリシー(REST APIのみ)
- JSON形式のリソースポリシーを定義することで、他のリソースからのAPI Gatewayへのアクションの許可または拒否を設定する
- IAM認証
- APIのアクセス権限を設定したIAMポリシーを作成し、IAMユーザーやIAMロールに付与してAPIへのアクセスを制御する。APIメソッドでIAM認証を有効化する
- Lambdaオーソライザー
- Lambda関数を作成することで、認証プロバイダーでの認証結果を元に、APIへのアクセス制御をメソッド単位で実施
- Cognitoオーソライザー
- 認証プロバイダとしてCognitoユーザープールを用いて、APIへのアクセス制御をメソッド単位で実施


