変動が激しくバースト性のあるデータベースワークロードで、容量が数分で10倍に変動する。
→Aurora Serverless v2を使用する。最小/最大ACUを設定し、Auroraは接続を切断することなく数秒でスケーリングする。
理由: v2は既存のインスタンスに容量を追加することでスケーリングし、フェイルオーバーは発生しない。プロビジョニングされたAuroraはここまで高速なスケーリングはできず、Serverless v1はスケーリングが遅く、接続を一時停止する。
リファレンス↗
グローバルアプリケーションで、リージョン間DBフェイルオーバーに対して<1秒のRPOと<1分のRTOを必要とする。
→Aurora Global Databaseを使用する。ストレージベースのレプリケーションで、一般的なレプリケーションラグは1秒未満である。数秒でセカンダリを昇格できる。
理由: Global DBはトランザクションではなくページを転送するため、リージョン間でサブ秒の速度を実現する。論理レプリケーションによるリージョン間リードレプリカはこれに匹敵しない。
リファレンス↗
フルコピーの費用をかけずに、テスト用に本番データベースを再現する。
→Auroraクローニングを使用する。Copy-on-write方式で、最初のクローンは無料で、変更されたページのみが課金される。
理由: クローンはポイントインタイムで瞬時に隔離される。スナップショット+復元は数時間かかり、すぐに全ストレージの費用が発生する。
リファレンス↗
論理エラー(本番環境でのDROP TABLEなど)から数分で復旧し、数時間かけないようにする。
→Aurora MySQL Backtrackを使用する。バックアップから復元することなく、クラスターをその場で以前の時点に巻き戻す。
理由: Backtrackはその場で高速に実行される。PITRによる復元は新しいクラスターを作成するため、より遅く、アプリケーションの切り替えが必要となる。
リファレンス↗
レポートクエリを、より大きなメモリを持つ特定のリーダーインスタンスにルーティングする。
→Auroraカスタムエンドポイントを使用する。リーダーのサブセット(より大きなもの)を指すエンドポイントを定義する。
理由: デフォルトのリーダーエンドポイントはすべてのリーダーをラウンドロビンする。カスタムエンドポイントはワークロードタイプによってクラスターをパーティショニングする。
リファレンス↗
DynamoDBテーブルでホットパーティションのスパイクが発生し、一部の読み取り/書き込みがスロットリングされる。
→Auto Scalingとアダプティブキャパシティ(自動)でプロビジョニングする。単一のキーがホットスポットである場合は、パーティションキーを再設計する。
理由: アダプティブキャパシティは、アクションなしでパーティション間でスループットを再割り当てする。しかし、単一のキーがホットな場合は、スキーマの再設計(複合キー、書き込みシャーディング)のみが役立つ。
リファレンス↗
すべてのDynamoDB書き込みでサイドエフェクトを発生させ、検索インデックス作成のためにOpenSearchにプッシュする。
→DynamoDB StreamsとLambdaトリガーを使用する。Lambdaがストリームレコードをバッチ処理し、OpenSearchに書き込む。
理由: Streamsは項目レベルの変更を24時間キャプチャする。ネイティブトリガーモデルであり、より長い保持期間/分析のためにKinesis Data Streamsアダプターも存在する。
リファレンス↗
複数のDynamoDB項目にわたる2段階書き込みがアトミックである必要がある。
→TransactWriteItems / TransactGetItemsを使用する。最大100項目にわたってACIDセマンティクスを提供する。
理由: ネイティブトランザクションは分散SAGAの複雑さを回避する。コストは項目あたり通常の容量の2倍であるため、アトミック性が必要な場合にのみ使用する。
リファレンス↗
自己ホスト型MongoDBクラスターをマネージドサービスに移行し、APIを維持する。
→Amazon DocumentDBを使用する。MongoDB互換APIである。移行にはmongodump/mongorestoreまたはDMSを使用する。
理由: DocumentDBはMongoDB 4.0/5.0とAPI互換性がある(ほとんどの演算子に対応するが、すべてではない)。コミットする前にドライバー/機能の互換性を確認する。
リファレンス↗
レコメンデーションエンジンが1億ノードのソーシャルグラフを横断する必要がある。
→Amazon Neptuneを使用する。プロパティグラフ(Gremlin)またはRDF(SPARQL)を使用する。
理由: 目的別に構築されたグラフDBである。DynamoDBやRDSで関係をモデル化することも可能だが、ホップの深さが増すにつれてクエリパフォーマンスが低下する。
リファレンス↗
IoTフリートが秒間1000万の時系列データポイントを混合頻度の保持期間で放出する。
→Amazon Timestreamを使用する。メモリストア(最近のデータ)、マグネティックストア(履歴データ)という自動階層化を行う。
理由: 目的別に構築された時系列データベースであり、このレートでDynamoDB/RDSをスケーリングするとコストがかかりすぎる。組み込みの保持期間階層化によりストレージコストが削減される。
リファレンス↗
銀行の台帳で、すべてのレコード変更の暗号化による検証が必要。
→Amazon QLDBを使用する。不変で暗号的に検証可能なジャーナルである。証明のためにSHA-256ダイジェストエクスポートを使用する。
理由: QLDBは目的別に構築された台帳である。DynamoDB Streamsは変更履歴を提供するが、組み込みの暗号化チェーンは提供しない。
予測不能なピークがあり、ハンズオフな運用が可能なログ分析ワークロード。
→Amazon OpenSearch Serverlessを使用する。コンピューティングとストレージが分離されており、OCUが自動スケーリングする。
理由: クラスターのサイジングやシャード管理が不要。予測可能で継続的なワークロードの場合は、プロビジョニングされたドメインの方が安価である。
リファレンス↗
ペタバイト規模の分析で、弾力性のあるコンピューティングとチーム間でのデータ共有が必要。
→マネージドストレージを備えたRedshift RA3ノードを使用する。クラスター間データ共有(コピーなし)を行う。
理由: RA3はコンピューティングとストレージを分離し、それぞれを独立してスケーリングできる。データ共有により、チームのクラスター間でのETLが不要になる。
リファレンス↗
既存のRedshiftクラスターとS3データレイクがある。RedshiftからS3をクエリするか、Athenaを使用するか?
→クラスターテーブルとS3データの結合が必要な場合はRedshift Spectrumを使用する。S3のみで完全にサーバーレスなアドホッククエリが必要な場合はAthenaを使用する。
理由: SpectrumはRedshiftのコンピューティングを介してS3クエリを実行する。AthenaはスキャンされたTBごとに課金される。主要なデータが存在する場所に基づいて選択する。
リファレンス↗
異なるチームが同じGlue Catalogテーブルに対して異なる行/列の可視性を必要とする。
→行レベル、列レベル、セルレベルのフィルターを備えたAWS Lake Formationを使用する。LFタグを通じてアクセス許可を付与する。
理由: IAM/S3ポリシーでは行レベルの制御はできない。Lake FormationはGlue CatalogメタデータとAthena/Redshift Spectrum/EMRコンシューマーを通じてきめ細かいアクセスを強制する。
リファレンス↗
Glueジョブが毎日増分データを処理し、昨日のファイルを再処理してはならない。
→Glueジョブブックマークを使用する。処理済みのS3キー/DB行を追跡し、最後の成功したチェックポイントから再開する。
理由: ブックマークは手動での状態追跡なしで重複処理を回避する。完全に再処理する場合は無効にする。
リファレンス↗
イベントストリーミングのためにマネージドKafkaとKinesis Data Streamsのどちらを選択するか。
→既存のKafkaクライアント/エコシステムがある場合はMSKを使用する。Lambdaトリガー、Firehose、KCLといった密接なAWS統合とサーバーレスオプションが必要な場合はKinesisを使用する。
理由: どちらも耐久性のあるストリームを提供し、リプレイが可能である。MSKはKafka APIとエコシステムを保持する。Kinesisは小規模なストリームでコストが低く、ネイティブに統合される。
リファレンス↗
可変的なKafkaスループットで、ハンズオフなクラスター管理が必要。
→MSK Serverlessを使用する。パーティションとスループットを自動スケーリングし、パーティションとデータごとに課金される。
理由: ブローカーのサイジングが不要。継続的に高スループットを必要とする場合は、プロビジョニングされたMSKの方が安価である。
リファレンス↗
グルーLambdaを書かずにSQS → フィルター → Step Functionsを連携させる。
→EventBridge Pipesを使用する。ソース → オプションのフィルター → オプションのエンリッチメント → ターゲットというフローである。
理由: 一般的なLambdaをグルーとして置き換える。コード、コスト、運用上の表面積を削減する。
リファレンス↗
ソースから再放出することなく、先週のイベントを新しいコンシューマーで再生する。
→EventBridgeのアーカイブとリプレイを使用する。アーカイブは一致したイベントをキャプチャし、後でターゲットにリプレイする。
理由: 組み込みのリプレイ機能により、別のイベントストアが不要になる。インシデントからの復旧や新しいコンシューマーのオンボーディングに役立つ。
リファレンス↗
数百のプロデューサーがイベントを生成し、コンシューマーは型付きバインディングを必要とする。
→自動検出機能を備えたEventBridge Schema Registryを使用する。強力な型付けのコードバインディング(Java、Python、TypeScript)を生成する。
理由: 検出機能は観測されたイベントからスキーマを学習する。バインディングはコンパイル時の安全性を提供する。
リファレンス↗
高ボリュームの短いワークフロー(秒間10万以上)をサブ秒課金でオーケストレーションする。
→Step Functions Expressワークフローを使用する。実行ミリ秒ごとの課金で、最大5分間実行可能。
理由: 標準ワークフローは耐久性があり履歴が追跡され、状態遷移ごとに課金される。Expressは監査証跡と引き換えに、短命なフローのコストを削減する。
リファレンス↗
1000万個のS3オブジェクトをStep Functionを通じて並列処理する。
→Distributed Map状態を使用する。最大10,000の並列子実行が可能で、S3から直接ソースを読み込む。
理由: Inline Mapは40並列に制限される。Distributed Mapはサービスクォータに達することなく、S3バケットサイズのジョブまでスケールする。
リファレンス↗
FIFOキューが秒間300メッセージを超えるスループットを必要とする。
→高スループットモードが有効なSQS FIFOを使用する。リージョンあたりAPIごとに最大70,000メッセージ/秒に対応し、`MessageGroupId`でパーティショニングする。
理由: 標準FIFOはバッチ処理なしでは300メッセージ/秒に制限される。高スループットモードはグループIDで順序付けをパーティショニングする。
リファレンス↗
複数のコンシューマーがそれぞれ同じKinesisストリームでフル読み取りスループットを必要とする。
→Enhanced Fan-Out (EFO) を使用する。各コンシューマーはHTTP/2プッシュを介して、専用の2 MB/秒/シャードパイプを受け取る。
理由: デフォルトのポーリングでは、2 MB/秒/シャードの制限がコンシューマー間で共有される。EFOは高コストと引き換えに競合を排除する。
リファレンス↗
FirehoseからS3へデータを転送する際、パーティショニングが取り込み時間でなくイベント時間で行われるため、データレイククエリのスキャンが多すぎる。
→Firehoseの動的パーティショニングを使用する。JSONからイベント時間/テナントIDを抽出し、S3プレフィックス`year=YYYY/month=MM/tenant=X/`に書き込む。
理由: イベント時間に基づくAthena/Spectrumパーティションプルーニングは、スキャンコストとレイテンシーを大幅に削減する。
リファレンス↗
モバイル/ウェブクライアントがリアルタイム更新と選択的なフィールドフェッチを必要とする。
→サブスクリプション付きのAWS AppSync(GraphQL)を使用する。WebSocketをバックエンドとする。
理由: GraphQLクライアントは要求されたフィールドのみをフェッチし、差分を購読する。REST/HTTP API Gatewayは過剰なフェッチとポーリングを強制する。
リファレンス↗
内部APIがパブリックインターネットからアクセスできないようにする必要がある。
→インターフェースVPCエンドポイント経由でAPI Gatewayプライベートエンドポイントを使用する。リソースポリシーで特定のVPCに制限する。
理由: プライベートAPIはVPCおよび接続されたネットワークからのみ到達可能である。パブリックAPIは安全のためWAFと認証が必要となる。
リファレンス↗
S3オリジンをロックダウンし、CloudFrontのみが読み取れるようにする。
→Origin Access Control (OAC) を使用する。従来のOAIに代わり、SSE-KMSとすべてのS3機能をサポートする。
理由: OAIはSSE-KMSオブジェクトをサポートしない。AWSはすべての新しいディストリビューションでOACを推奨している。
リファレンス↗
S3にある特定の有料ビデオへのアクセスを時間制限する。
→CloudFront署名付きURL(URLごと)または署名付きCookie(複数のURL)を使用する。信頼されたキーグループがリクエストに署名する。
理由: S3の署名付きURLはCloudFrontのキャッシュをバイパスする。CloudFrontの署名付きURLはエッジでキャッシュし、かつアクセスを制限する。
リファレンス↗
軽量なビューワーリクエスト変換:ヘッダーの書き換え、リダイレクト、A/Bルーティング。
→CloudFront Functionsを使用する。JSでサブミリ秒の実行が可能で、すべてのエッジPOPで利用できる。
理由: Lambda@Edgeはリージョンエッジで完全なNode/Pythonを実行するため、より重く高価である。Functionsはシンプルな操作で10倍安価である。
リファレンス↗
EKSで強力な分離を伴う信頼できないマルチテナントワークロードを実行する。
→EKS Fargateのポッドごとの分離を使用する。各ポッドは専用のマイクロVMで実行される。
理由: マネージドノードグループはカーネルを共有するため、特権昇格がテナント間で発生する可能性がある。Fargateのカーネル分離はEKSで最も強力である。
リファレンス↗
EKSクラスターのオートスケーリングのレイテンシーが遅すぎる。ノードグループのインスタンスタイプが乱立している。
→Karpenterを使用する。保留中のポッド要件に基づいて、インスタンスタイプをジャストインタイムでプロビジョニングする。
理由: Cluster Autoscalerは事前に定義されたASGをスケーリングするため、遅く、制限がある。Karpenterは任意のEC2を数秒で多様化してスケーリングする。
リファレンス↗
EKSポッドが最小権限IAMを必要とする(ノードインスタンスロールの共有を避ける)。
→OIDCプロバイダー経由でIAM Roles for Service Accounts (IRSA) を使用する。ServiceAccountにロールARNをアノテーションする。
理由: EKS Pod Identityはより新しい代替手段であり、信頼モデルがよりシンプルである。IRSAは成熟しており、リージョン間で動作する。
リファレンス↗
ECS-on-EC2タスクの開始にスケールアウト時に5〜7分かかる。60秒未満で開始したい。
→ECS Capacity Providerと、`CapacityProviderReservation`のターゲットを約80%とするマネージドスケーリングを使用する。アイドルバッファを維持する。
理由: 予約されたバッファにより、新しいタスクは既存の容量に即座に着陸し、ASGが代替インスタンスを起動する間もサービスが継続される。
リファレンス↗
LambdaがSQSによってトリガーされるが、メッセージの5%しか一致せず、無駄な呼び出しが発生している。
→フィルター条件付きのイベントソースマッピングを使用する。Lambdaは一致するメッセージに対してのみ呼び出される。
理由: Lambda前のフィルターにより、無関係なメッセージに対する呼び出しごとのコストを回避できる。SQS、Kinesis、DynamoDB、MQ、Kafkaでフィルターがサポートされている。
リファレンス↗
本番アプリケーションが運用オーバーヘッドの低いLLMエンドポイントを必要とする。
→マネージド基盤モデル(Claude、Llama、Titan)にはAmazon Bedrockを使用する。カスタムモデルや厳密にチューニングされたオープンウェイトモデルをホストする必要がある場合にのみSageMakerを使用する。
理由: BedrockはAPIのみでインフラ不要。SageMakerは完全なMLプラットフォームであり、トレーニング/ファインチューニングのライフサイクルを自分で管理する場合に選択する。
リファレンス↗
モデルをトレーニングすることなく、ビジョン/NLP向けのマネージドAIを選択する。
→Rekognition(画像/動画のラベル、顔、コンテンツモデレーション)、Comprehend(感情、エンティティ、言語、PII検出)を使用する。Translate、Polly、Transcribeも選択肢。
理由: 事前トレーニング済みのAWS AIサービスは、一般的なタスクのMLライフサイクル全体をスキップできる。既成のものが合わない場合にのみSageMakerを使用する。
リファレンス↗
ウェブアプリがメール/パスワード、Google、Apple、SAMLエンタープライズSSOをサポートする。
→ホストされたUIを持つCognitoユーザープールを使用する。OIDCおよびSAML IdPを設定する。アプリケーションはCognito JWTを受け取る。
理由: ユーザープールはIdPを1つのトークンに集約する。IDプールはAWS認証情報との間でトークンを交換するだけであり、認証ではなくAWS APIアクセス用である。
リファレンス↗
DynamoDB Global Tablesで、2つのリージョンで同じキーへの同時書き込みが発生する。
→タイムスタンプによるLast-writer-wins方式を使用する。アプリケーションは冪等な書き込みを設計するか、書き込みをリージョンごとにパーティショニングする。
理由: GTレプリケーションは非同期のマルチマスターである。競合解決はタイムスタンプベースであり、アプリケーションは結果整合性を許容する必要がある。
リファレンス↗