SEあれこれ

インフラもコードもデータも。SEが仕事で出会う技術のあれこれを書き留めています。

AWS Backupで複数サービスに散らばったバックアップ運用を一元化する

この記事で分かること
  • 各サービス個別のバックアップ機能とAWS Backupが何を分担するのか
  • バックアッププランによるルール一元管理とVault Lockでの改ざん防止
  • クロスリージョン・クロスアカウントコピーと復元テストの自動化
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / AWS Backup / 対象サービス: RDS、DynamoDB、EBS、EFS
対象読者
RDSの自動バックアップ、DynamoDBのポイントインタイムリカバリ、EBSスナップショットのライフサイクル管理をそれぞれ個別の仕組みで設定しており、統一的な監査・保持ポリシーの管理に苦労しているSE

個別バックアップ機能の限界

 (1) これまでの回で扱った通り、RDS/Auroraには自動バックアップ機能が、DynamoDBにはポイントインタイムリカバリが、EBSにはスナップショット機能が、それぞれ個別に用意されています。個々のサービス単位では十分な機能ですが、複数サービスにまたがるシステム全体で「保持期間は何日か」「暗号化されているか」「誰がいつバックアップを取得・削除したか」を横断的に把握しようとすると、サービスごとに異なる管理画面・APIを確認する必要があり、統制が難しくなります。

 (2) AWS Backupは、これら複数サービスのバックアップ設定を「バックアッププラン」という単位で一元管理し、リソースタグに基づいて自動的に対象を割り当てられるようにするサービスです。

観点各サービス個別のバックアップAWS Backup
設定場所サービスごとに異なるコンソール・API1つのバックアッププランで一元設定
対象の割り当てリソースごとに個別設定タグベースで自動割り当て
改ざん防止サービスによって対応状況が異なるVault Lockで統一的にWORM(改ざん不可)化
監査レポートサービスごとに個別確認統合されたコンプライアンスレポート

バックアッププランの作成

aws backup create-backup-plan \
  --backup-plan '{
    "BackupPlanName": "standard-daily-backup",
    "Rules": [{
      "RuleName": "daily-rule",
      "TargetBackupVaultName": "production-vault",
      "ScheduleExpression": "cron(0 18 * * ? *)",
      "StartWindowMinutes": 60,
      "CompletionWindowMinutes": 180,
      "Lifecycle": {"DeleteAfterDays": 35, "MoveToColdStorageAfterDays": 7}
    }]
  }'

 (3) ScheduleExpressionはEventBridge Scheduler応用編の回で扱ったcron式と同じ書式です。Lifecycle設定で、一定期間後にコールドストレージへ自動移行させる設定は、S3設計パターンの回で扱ったライフサイクルルールの考え方をバックアップ全般に適用したものと捉えられます。

タグベースでの対象割り当て

aws backup create-backup-selection \
  --backup-plan-id "plan-abc123" \
  --backup-selection '{
    "SelectionName": "production-tagged-resources",
    "IamRoleArn": "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole",
    "ListOfTags": [{"ConditionType": "STRINGEQUALS", "ConditionKey": "BackupPolicy", "ConditionValue": "standard"}]
  }'

 (4) BackupPolicy: standardというタグを付けたリソース(RDSインスタンス、DynamoDBテーブル、EBSボリューム等)が、サービスの種類を問わず自動的にこのプランの対象になります。IAMロール設計ベストプラクティスの回で扱ったタグベースの管理と同様、新しいリソースを作成する際にタグを付けるだけでバックアップ対象への組み込みが完了する運用が実現します。

補足

タグベースの自動割り当ては便利な反面、意図せずタグが付いてしまったリソースが想定外にバックアップ対象になったり、逆にタグの付け忘れでバックアップから漏れたりするリスクがあります。AWS Configのようなリソース設定監視の仕組みと組み合わせ、必須リソースへのタグ付け漏れを検知する運用を併せて検討してください。

Vault Lockによる改ざん防止

 (5) ランサムウェア対策やコンプライアンス要件から、バックアップデータ自体を「誰も削除・変更できない」状態(WORM: Write Once Read Many)にしたい場合、Vault Lockを使います。

aws backup put-backup-vault-lock-configuration \
  --backup-vault-name "production-vault" \
  --min-retention-days 30 \
  --max-retention-days 365 \
  --changeable-for-days 3

 (6) changeable-for-daysで指定した猶予期間を過ぎると、Vaultの設定自体がロックされ、AWSアカウントのルートユーザーであっても保持期間の短縮や削除ができなくなります。Payment Cryptographyの回で扱ったような、規制対応が求められるシステムのバックアップ要件に応える機能です。

注意

Vault Lockを本番適用する前に、猶予期間中に設定内容を十分に見直してください。ロック後は保持期間を短縮する変更ができなくなるため、テスト環境で十分な検証を行った上で本番のVaultに適用することを推奨します。

クロスリージョン・クロスアカウントコピー

 (7) 災害対策として、バックアップデータを別リージョン・別アカウントへ自動的にコピーする設定も、バックアッププラン内で定義できます。

{
  "RuleName": "daily-rule-with-copy",
  "TargetBackupVaultName": "production-vault",
  "ScheduleExpression": "cron(0 18 * * ? *)",
  "CopyActions": [{
    "DestinationBackupVaultArn": "arn:aws:backup:us-west-2:210987654321:backup-vault:dr-vault",
    "Lifecycle": {"DeleteAfterDays": 90}
  }]
}

 (8) Resilience Hubの回で扱ったRTO/RPO評価の一環として、このクロスリージョンコピーの有無・遅延時間が、実際の災害対策要件を満たしているかの検証対象になります。バックアップの取得だけでなく、コピー先が本当に別障害ドメインに配置されているかを確認することが重要です。

復元テストの自動化

 (9) バックアップは取得しているだけでは不十分で、実際に復元できることを定期的に検証する必要があります。AWS Backupの復元テスト機能を使うと、定期的に実際のリストア処理を自動実行し、成功/失敗を記録できます。

aws backup create-restore-testing-plan \
  --restore-testing-plan '{
    "RestoreTestingPlanName": "monthly-restore-verification",
    "ScheduleExpression": "cron(0 3 1 * ? *)",
    "RecoveryPointSelection": {"Algorithm": "LATEST_WITHIN_WINDOW", "RecoveryPointTypes": ["SNAPSHOT"]}
  }'
確認結果

検証環境でRDSとDynamoDBの両方をタグベースで単一のバックアッププランに割り当てたところ、サービスの種類を問わず、同じスケジュール・同じ保持期間ポリシーの下でバックアップが実行されることを確認しました。個別に設定を確認する手間が減り、監査時の説明もシンプルになっています。

Organizationsでの一元展開

 (10) Organizationsマルチアカウント管理の回で扱った組織構造を前提に、AWS Backupはバックアップポリシー自体をOrganizations経由で組織全体・特定OUに強制適用できます。AWS Firewall Managerの回で扱った組織全体へのセキュリティポリシー展開と同様の考え方で、バックアップ取得の徹底を一元的に統制できます。

重要な注意

復元テストや実際のリストア操作は、対象リソースによっては新しいリソースの作成(追加コストの発生)を伴います。復元テストプランの対象範囲とスケジュールを設計する際は、テスト自体のコストも見積もりに含めてください。

まとめ

 (11) AWS Backupは、サービスごとに分散していたバックアップ設定を、タグベースの一元的なプランとして統合し、Vault Lockでの改ざん防止や復元テストの自動化まで含めて運用できるようにするサービスです。Resilience HubやOrganizationsマルチアカウント管理で扱ってきた可用性・組織統制の知見と組み合わせることで、バックアップ運用の属人化を防ぎ、監査対応もしやすい体制を構築できます。

参考資料

対応サービスの範囲や料金体系は更新されることがあるため、導入前に公式ドキュメントの最新情報を確認してください。

LitestarでFastAPIとは違う設計思想のAPIフレームワークに触れる

この記事で分かること
  • LitestarがFastAPIと比べて何を重視した設計になっているか
  • レイヤードな依存性注入(Provide)とガードによるルート単位の認可制御
  • SQLAlchemyプラグインでのDB連携とビルトインのキャッシュ機構
記事の検証情報
確認日
2026年9月1日
検証環境
Python 3.12 / litestar 2.x系 / uvicorn / SQLAlchemyプラグインでの動作確認
対象読者
前回までのFastAPIの回で構築してきたAPIの経験があり、後発の設計を持つフレームワークがどう違うのか比較しておきたいSE

FastAPIとの立ち位置の違い

 (1) 以前FastAPIの回では、型ヒントベースのバリデーションと自動ドキュメント生成を中心に扱いました。Litestarは同じくASGIベースの非同期Webフレームワークですが、FastAPIより後発として設計されており、依存性注入の仕組みやレイヤードなミドルウェア構成、DTO(Data Transfer Object)によるリクエスト/レスポンスの分離など、大規模アプリケーションでの構造化をより強く意識した設計になっています。

 (2) パフォーマンス面でも、Litestarは内部実装の最適化により、多くのベンチマークでFastAPIより高いスループットを示す傾向がありますが、実務上の判断基準としては「既存のエコシステム(拡張ライブラリの充実度)を取るか、設計の新しさと構造化のしやすさを取るか」という選択になります。

観点FastAPILitestar
依存性注入Dependsによる関数レベルの注入Provideによるレイヤー(ルート/コントローラ/アプリ)単位の注入
認可制御Dependsで個別に実装Guardという専用の仕組みで宣言的に定義
リクエスト/レスポンス変換Pydanticモデルを直接使用DTOレイヤーで内部モデルと明確に分離可能
エコシステムの成熟度非常に充実発展途上だが急速に拡大中

最小構成のAPI

from litestar import Litestar, get

@get("/orders/{order_id:int}")
async def get_order(order_id: int) -> dict:
    return {"order_id": order_id, "status": "shipped"}

app = Litestar(route_handlers=[get_order])

 (3) パスパラメータの型を{order_id:int}のようにルートパス自体に埋め込む書き方は、FastAPIの型ヒントベースの推論とは異なるLitestar特有の記法です。この書き方により、ルーティング定義を見ただけで期待される型が分かりやすくなっています。

レイヤードな依存性注入

 (4) LitestarのProvideは、アプリケーション全体・ルーターグループ・個別のハンドラという複数のレイヤーで定義でき、下位のレイヤーが上位の依存関係を自動的に引き継ぎます。

from litestar import Litestar, Router, get
from litestar.di import Provide

async def get_db_session() -> AsyncSession:
    async with async_session_maker() as session:
        yield session

@get("/orders/{order_id:int}")
async def get_order(order_id: int, db_session: AsyncSession) -> dict:
    order = await db_session.get(Order, order_id)
    return {"order_id": order.id, "status": order.status}

order_router = Router(
    path="/api",
    route_handlers=[get_order],
    dependencies={"db_session": Provide(get_db_session)},
)

app = Litestar(route_handlers=[order_router])

 (5) Router単位で依存関係を定義しておくと、配下の全ハンドラで自動的に利用可能になります。SQLAlchemyの回で扱ったセッション管理を、ルーターの階層構造に沿って整理しやすい設計です。

Guardによる認可制御

 (6) 認可ロジックは、ハンドラ関数の中に埋め込むのではなく、Guardという専用の関数として切り出せます。Verified Permissionsの回で扱った「認可ロジックの外部化」に近い発想が、フレームワークレベルで用意されている形です。

from litestar.exceptions import PermissionDeniedException
from litestar.connection import ASGIConnection
from litestar.handlers.base import BaseRouteHandler

def require_admin_role(connection: ASGIConnection, _: BaseRouteHandler) -> None:
    if connection.user.role != "admin":
        raise PermissionDeniedException("管理者権限が必要です")

@get("/admin/reports", guards=[require_admin_role])
async def get_admin_reports() -> dict:
    return {"report": "..."}
補足

GuardはRouter単位でも指定できるため、「このルーター配下は全て管理者権限が必要」という宣言を1箇所にまとめられます。個々のエンドポイントに認可チェックを書き忘れるリスクを、構造的に減らせる設計です。

DTOによるリクエスト/レスポンスの分離

 (7) 内部のデータモデル(SQLAlchemyのORMモデル等)と、APIとして公開する形式を明確に分離したい場合、DTOレイヤーを使います。

from litestar.dto import DataclassDTO, DTOConfig
from dataclasses import dataclass

@dataclass
class Order:
    id: int
    status: str
    internal_notes: str  # 内部用の非公開フィールド

class OrderDTO(DataclassDTO[Order]):
    config = DTOConfig(exclude={"internal_notes"})

@get("/orders/{order_id:int}", return_dto=OrderDTO)
async def get_order(order_id: int) -> Order:
    return Order(id=order_id, status="shipped", internal_notes="社内メモ")

 (8) excludeで指定したフィールドは、APIレスポンスから自動的に除外されます。Pydanticバリデーションの回で扱ったスキーマとは異なるレイヤーで、内部モデルの構造を変えずに公開範囲だけを制御できる点が特徴です。

SQLAlchemyプラグインとの連携

from litestar.plugins.sqlalchemy import SQLAlchemyPlugin, SQLAlchemyAsyncConfig

sqlalchemy_config = SQLAlchemyAsyncConfig(
    connection_string="postgresql+asyncpg://user:pass@localhost/dbname",
    session_dependency_key="db_session",
)

app = Litestar(
    route_handlers=[order_router],
    plugins=[SQLAlchemyPlugin(config=sqlalchemy_config)],
)

 (9) このプラグインを使うと、セッションのライフサイクル管理(接続のオープン・クローズ、トランザクションのコミット・ロールバック)がフレームワーク側に統合され、SQLAlchemyの回で扱ったような手動のセッション管理コードを大きく減らせます。

ビルトインのレスポンスキャッシュ

@get("/products/popular", cache=60)
async def get_popular_products() -> list[dict]:
    return await fetch_popular_products_from_db()
確認結果

cache=60を指定したエンドポイントに対して短時間に複数回リクエストを送ったところ、DBへの問い合わせが実際には1回だけ発生し、以降のリクエストはキャッシュされたレスポンスが返されることを確認しました。Redis/ElastiCacheの回で扱ったような外部キャッシュを別途構築せずとも、頻繁にアクセスされる読み取り専用エンドポイントの負荷を簡単に減らせます。

注意

デフォルトのキャッシュはインメモリで動作するため、複数インスタンスで運用する場合はインスタンス間でキャッシュが共有されません。本番運用で一貫したキャッシュ挙動が必要な場合は、Redisバックエンドのキャッシュストアを設定する必要があります。

既存のFastAPI資産からの移行判断

 (10) すでにFastAPIで大規模なコードベースを持っている場合、Litestarへの全面移行はコストに見合わないことが多いです。新規プロジェクトの立ち上げや、認可・レイヤー構造を重視する部分的なマイクロサービスなど、Litestarの設計思想が活きる場面から試験的に導入するのが現実的なアプローチです。

重要な注意

Litestarはまだエコシステムの成熟途上にあり、FastAPIでは当たり前に存在する拡張ライブラリが未対応であるケースがあります。本番採用前に、必要な周辺ライブラリ(認証プロバイダ連携、監視ツール連携等)のLitestar対応状況を確認してください。

まとめ

 (11) Litestarは、FastAPIが切り開いた型ヒントベースのAPI開発という土台の上に、依存性注入・認可・DTOといった大規模アプリケーション向けの構造化機構を強化したフレームワークです。FastAPIやSQLAlchemyで培ってきた知見を活かしながら、設計の選択肢の一つとして触れておく価値があります。

参考資料

APIやプラグインの対応状況は活発に更新されているため、導入前に公式ドキュメントの最新版を確認してください。

AWS Outpostsで低レイテンシ・データレジデンシー要件をオンプレミスのまま満たす

この記事で分かること
  • Direct Connectが担うネットワーク接続と、Outpostsが担うコンピュート拡張の違い
  • VPCサブネットの一部をオンプレミスに物理配置する仕組み
  • Local Zonesとの使い分け、導入までの現実的なリードタイム
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / AWS Outposts(ラック型) / VPCサブネットのOutposts配置構成の確認
対象読者
工場の製造ラインなど、通信の途絶が許されない現場や、データを物理的に施設内に留める必要がある要件があり、パブリッククラウドへの全面移行が難しいSE

Direct Connectとの役割の違い

 (1) 前回AWS Direct Connectの回では、オンプレミスとAWSリージョンを専用線でつなぎ、ネットワーク経路を安定させる方法を扱いました。これはあくまで「接続」の話であり、コンピュートやストレージ自体は依然としてリージョン側(AWSのデータセンター)に存在します。AWS Outpostsは、これとは異なるアプローチで、AWSのコンピュート・ストレージのハードウェア自体を、自社のデータセンターや工場内に物理的に設置するサービスです。

 (2) Outposts上では、EC2・EBS・S3(互換API)・ECS・EKS・RDSといったAWSサービスが、オンプレミスの施設内でそのまま動作します。ネットワークが途絶した場合でも、Outposts内で完結する処理は継続でき、リージョンとの通信断がそのままサービス停止につながるDirect Connect単体の構成とは異なる耐障害性を持ちます。

観点AWS Direct ConnectAWS Outposts
提供するものオンプレミス-AWS間の専用ネットワーク接続オンプレミスに設置するAWSのコンピュート/ストレージハードウェア
処理の実行場所依然としてAWSリージョンオンプレミス施設内
ネットワーク断絶時の挙動AWSサービスへのアクセス不可Outposts内の処理は継続可能
主な用途帯域保証・低レイテンシな接続データレジデンシー、超低レイテンシ処理、通信途絶への耐性
補足

OutpostsとDirect Connectは併用されるのが一般的です。Outposts自体もリージョンとの定期的な通信(Service Link)を必要とし、そのコントロールプレーン通信の経路としてDirect Connectが使われるケースが多くあります。

VPCサブネットの物理配置

 (3) OutpostsのAWS的な扱いとして特徴的なのは、既存のVPC内に「Outposts上に配置されたサブネット」を作成できる点です。VPC設計パターンの回で扱った通常のサブネット設計の延長として、一部のサブネットだけが物理的にオンプレミスのラックに存在する、という構成になります。

aws ec2 create-subnet \
  --vpc-id "vpc-0123456789abcdef0" \
  --cidr-block "10.0.100.0/24" \
  --outpost-arn "arn:aws:outposts:ap-northeast-1:123456789012:outpost/op-0123456789abcdef0" \
  --availability-zone "ap-northeast-1a"

 (4) このサブネットに配置したEC2インスタンスは、通常のリージョン内インスタンスと同じAPI・同じVPCネットワーキング(セキュリティグループ、ルートテーブル)で扱えます。アプリケーション側からは、動いている場所がオンプレミスかリージョンかを意識せずに済むよう設計されています。

典型的なユースケース

製造ラインの低レイテンシ処理

 (5) 工場のラインで発生するセンサーデータをリアルタイムに処理し、数十ミリ秒以内に制御信号を返す必要がある場合、リージョンとの往復通信では間に合わないことがあります。Outposts上にコンピュート処理を配置することで、施設内で完結する低レイテンシな処理ループを実現できます。IoT Core応用編の回で扱ったフリート管理の対象デバイスが、この構成のデータソースになります。

データレジデンシー要件への対応

 (6) 特定の業界・地域の規制で、データを特定の物理施設内から一切出せないという要件がある場合、Outposts上でS3互換のストレージを使い、データそのものをオンプレミス施設内に留めたまま、管理・APIはAWSと同じ形で扱えます。

注意

Outposts上のS3互換ストレージやEBSは、リージョンのS3・EBSとは独立したリソースです。バックアップやディザスタリカバリの設計では、Outposts側の障害(施設自体の被災等)に備えた、リージョン側へのレプリケーション戦略を別途検討する必要があります。

Local Zonesとの使い分け

 (7) 低レイテンシを目的とする点では、AWS Local Zones(特定の都市部に設置された小規模なAWSインフラ拠点)も選択肢になります。Local ZonesはAWSが管理する施設内にあり自社設置は不要ですが、地理的に対応都市が限られます。自社の特定施設内で完結させる必要がある、あるいはLocal Zonesが提供されていない地域である場合はOutpostsが唯一の選択肢になります。

観点AWS Local ZonesAWS Outposts
設置場所AWSが管理する拠点(都市部)自社施設内
対応地域Local Zones提供都市に限定任意の自社施設(電力・空調要件を満たせば)
データレジデンシー自社施設内には留まらない自社施設内に完全に留まる

ハードウェアの調達とリードタイム

 (8) Outpostsはラック単位(1U型のOutposts Serverもあり)で提供され、注文から実際に設置・稼働開始までには、電力・冷却要件の確認、物理搬入、初期セットアップを含め、数ヶ月単位のリードタイムが必要になります。Direct Connectの回で扱った物理回線敷設と同様、AWSコンソール操作だけでは完結しないプロジェクトです。

確認結果

Outposts上に作成したサブネットにEC2インスタンスを起動したところ、通常のリージョン内EC2と同じAMI・同じセキュリティグループ設定がそのまま適用され、既存のCI/CDパイプラインやIaC定義(Terraform/CDK)を大きく変更せずに展開できることを確認しました。オンプレミス特有の追加作業は、物理設置とネットワーク接続の初期構成にほぼ限定されています。

運用面での考慮

 (9) Outposts自体のハードウェア保守・故障対応はAWSが担いますが、施設側の電力・空調・物理セキュリティは利用者側の責任です。Well-Architected Frameworkの回で扱った信頼性の柱を、物理インフラの運用責任まで含めて検討する必要があります。

重要な注意

Outpostsはコントロールプレーンの一部についてリージョンとの通信(Service Link)に依存しているため、完全にネットワーク孤立した状態での長期運用は想定されていません。ネットワーク断絶が長時間続いた場合の挙動を、事前に公式ドキュメントで確認し、業務継続計画に組み込んでおいてください。

まとめ

 (10) AWS Outpostsは、Direct Connectのようなネットワーク接続の強化では満たせない「処理そのものをオンプレミスに置く」という要件に応えるサービスです。Direct ConnectやVPC設計パターンで扱ってきたハイブリッド構成の知見の上に、低レイテンシ・データレジデンシーという特有の要件がある場合の選択肢として押さえておく価値があります。

参考資料

対応リージョン・ハードウェア構成・料金体系は変更されることがあるため、導入検討時に公式ドキュメントの最新情報を確認してください。

AWS Batch on EKSで既存のKubernetes運用資産をバッチ処理基盤に活かす

この記事で分かること
  • 通常のAWS Batch(ECS基盤)とEKS基盤の違い、選ぶ基準
  • EKSクラスタをBatchのコンピューティング環境として登録する設定
  • Kubernetes Jobとしてバッチジョブが実行される仕組みと既存ツールとの共存
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / AWS Batch(EKSコンピューティング環境) / 既存のEKSクラスタ / kubectlでのJob確認
対象読者
アプリケーションはすでにEKSで運用しており、バッチ処理のためだけに別途ECSベースの基盤を増やすことに違和感を持っているSE

ECS基盤とEKS基盤の使い分け

 (1) 以前AWS Batchの回では、ECS(またはFargate)をコンピューティング環境として使うBatchジョブの構成を扱いました。多くの組織にとってこれで十分ですが、すでにEKS Kubernetes入門の回で扱ったようにアプリケーション運用をKubernetesに統一している場合、バッチ処理のためだけにECSという別の実行基盤の知識・監視・運用ツールを持つことになり、運用の分断が生まれます。

 (2) AWS Batch on EKSは、Batchのジョブスケジューリング機能(優先度キュー、依存関係管理、リトライ)はそのままに、実際のジョブ実行先を既存のEKSクラスタに向けられる構成です。ジョブは内部的にKubernetesのJobリソースとして実行され、kubectlで状態を確認できます。

観点AWS Batch(ECS/Fargate基盤)AWS Batch on EKS
実行基盤ECSタスクKubernetes Job
既存Kubernetes運用との親和性低い(別の運用系統)高い(kubectl・既存監視ツールがそのまま使える)
ノード管理Batchが管理するECSクラスタ既存のEKSノードグループを共用可能
向いている組織ECS中心の運用すでにEKSに標準化している運用
補足

AWS Batch on EKSは、GPUジョブや大規模な機械学習の前処理バッチなど、既存のEKSクラスタ上のGPUノードプールを再利用したいケースでも有効です。バッチ専用のGPUインスタンス群を別建てする必要がありません。

EKSクラスタをコンピューティング環境として登録

 (3) 既存のEKSクラスタに、Batch用の名前空間を作成し、AWS Batchからアクセスできるように権限を設定します。

kubectl create namespace aws-batch

aws batch create-compute-environment \
  --compute-environment-name "eks-batch-compute" \
  --type MANAGED \
  --eks-configuration '{
    "eksClusterArn": "arn:aws:eks:ap-northeast-1:123456789012:cluster/existing-app-cluster",
    "kubernetesNamespace": "aws-batch"
  }' \
  --compute-resources '{
    "type": "EC2",
    "minvCpus": 0,
    "maxvCpus": 64,
    "instanceTypes": ["m5.xlarge"],
    "subnets": ["subnet-0123456789abcdef0"]
  }'

 (4) eksClusterArnで既存クラスタを指定するだけで、新たにクラスタを構築する必要はありません。kubernetesNamespaceで指定した名前空間内に、Batchが管理するPodがスケジューリングされます。既存のアプリケーションPodと名前空間レベルで分離されるため、リソース競合の管理がしやすくなります。

ジョブ定義とキューの設定

aws batch register-job-definition \
  --job-definition-name "nightly-data-aggregation" \
  --type container \
  --eks-properties '{
    "podProperties": {
      "containers": [{
        "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/batch-aggregator:latest",
        "resources": {"requests": {"cpu": "2", "memory": "4Gi"}}
      }]
    }
  }'

aws batch create-job-queue \
  --job-queue-name "eks-batch-queue" \
  --priority 1 \
  --compute-environment-order '[{"order": 1, "computeEnvironment": "eks-batch-compute"}]'

 (5) podPropertiesには、通常のKubernetes Podスペックに近い形式でコンテナ・リソース要求を定義します。Dockerマルチステージの回で扱ったビルド手法で作成したイメージを、そのままここで指定できます。

既存のkubectl・監視ツールとの共存

 (6) ジョブが実行されると、指定した名前空間内にKubernetes Jobとして現れるため、通常のPodと同じようにログや状態を確認できます。

kubectl get jobs -n aws-batch
kubectl logs -n aws-batch job/nightly-data-aggregation-abc123

 (7) Managed Service for Prometheusの回で扱ったADOTコレクタによるメトリクス収集も、Batchが管理するPodに対して同様に機能します。バッチジョブのリソース使用状況を、アプリケーションPodと同じPrometheus/Grafanaダッシュボードで横断的に監視できる点は、EKS基盤を選ぶ大きな利点です。

注意

Batchが管理するPodと、通常のアプリケーションPodが同じノードグループのリソースを奪い合うと、双方のパフォーマンスに影響が出ることがあります。バッチワークロード専用のノードグループを分け、Kubernetesのテイント・トレラレーション機能でPodのスケジューリング先を制御する設計を検討してください。

依存関係のあるジョブフロー

 (8) Step Functions応用編の回で扱ったDistributed Mapのような大規模並列処理と、AWS Batch on EKSを組み合わせる構成も可能です。Step Functionsからジョブ投入のオーケストレーションを行い、実際の計算処理はEKS上のBatchジョブとして実行する、という役割分担です。

確認結果

既存のEKSクラスタにBatch用の名前空間を追加し、集計処理のジョブを投入したところ、既存のアプリケーションPodとは名前空間レベルで分離されつつ、同じクラスタのノードリソースを使って正常にジョブが完了することを確認しました。ジョブの実行ログも、通常のkubectl logsコマンドでそのまま確認できています。

GPUワークロードでの活用

 (9) 機械学習の前処理やバッチ推論のようなGPUを必要とする処理では、既存のEKSクラスタにあるGPUノードプールを、アプリケーションの推論サービスとバッチ処理の両方で共有できる点が実務上のメリットになります。夜間バッチの間だけGPUノードをスケールアップし、日中はアプリケーション用に戻す、といった運用も、既存のCluster Autoscaler/Karpenterの設定を活かして構築できます。

重要な注意

AWS Batch on EKSは比較的新しい統合であり、通常のECS基盤のBatchに比べて対応機能(一部のリトライ戦略やスケジューリングオプション)に差がある場合があります。既存のECS基盤からの移行を検討する際は、必要な機能が現時点でサポートされているか、事前に公式ドキュメントで確認してください。

まとめ

 (10) AWS Batch on EKSは、Batchのジョブ管理機能を活かしつつ、実行基盤を既存のEKSクラスタに統合できる選択肢です。AWS BatchやEKS Kubernetes入門で扱ってきた知見を組み合わせ、すでにKubernetesに標準化している組織であれば、バッチ処理のためだけに別の運用系統を増やさずに済む構成として検討する価値があります。

参考資料

対応機能やジョブ定義の仕様は更新されることがあるため、導入前に公式ドキュメントの最新情報を確認してください。

Amazon Kinesis Video Streamsでカメラ映像を取り込み、解析パイプラインにつなぐ

この記事で分かること
  • Kinesis Data Streamsと何が違うのか、映像データ特有の要件
  • Producer SDKでのデバイスからのストリーム送信とHLS再生の仕組み
  • Rekognitionと連携したリアルタイム映像解析パイプラインの組み方
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / Kinesis Video Streams / Rekognition Video連携 / HLSストリーミング再生確認
対象読者
工場や倉庫の監視カメラ映像をAWSに取り込み、録画保存だけでなくリアルタイムでの異常検知にも活用したいSE

Kinesis Data Streamsとの違い

 (1) 以前Kinesisの回で扱ったKinesis Data Streamsは、JSON等の構造化されたイベントデータをシャード単位で扱うストリーミングサービスでした。Kinesis Video Streams(KVS)は名前は似ていますが、映像・音声という時系列のメディアデータに特化した別サービスです。フラグメント(数秒単位の映像チャンク)という単位でデータを管理し、再生・シーク・保存といった映像特有の操作をサポートします。

 (2) IoT Core応用編の回で扱ったフリート管理の対象が、センサーデータのようなテキスト・数値データだったのに対し、KVSはカメラデバイスという「映像を送信するIoTデバイス」向けの取り込み口という位置づけになります。

観点Kinesis Data StreamsKinesis Video Streams
データの種類JSON等の構造化イベント映像・音声・時系列センサーデータ
管理単位シャードストリーム(フラグメント単位で内部管理)
再生・シーク非対応HLS/DASH形式での再生に標準対応
典型的な用途アプリケーションイベント処理監視カメラ、ドライブレコーダー、ドローン映像

ストリームの作成とデバイスからの送信

aws kinesisvideo create-stream \
  --stream-name "warehouse-camera-01" \
  --data-retention-in-hours 24 \
  --media-type "video/h264"

 (3) カメラデバイス側では、Producer SDK(C++/Java/組み込み向けの各種SDK)を使い、H.264等でエンコードされた映像フレームをKVSへ送信します。GStreamerと連携するプラグインも提供されており、既存の映像パイプライン資産を活用しやすくなっています。

# GStreamerを使ったサンプルパイプライン(概念例)
gst-launch-1.0 v4l2src device=/dev/video0 ! \
  videoconvert ! x264enc ! h264parse ! \
  kvssink stream-name="warehouse-camera-01" \
    aws-region="ap-northeast-1"
補足

データ保持期間(data-retention-in-hours)を設定すると、KVSは内部的にその期間分の映像フラグメントを保持し、後から遡って再生・エクスポートできます。長期保存が必要な場合は、S3へのアーカイブ処理を別途組み込みます。

HLSでのライブ・過去映像再生

 (4) 保存された映像は、HLS(HTTP Live Streaming)形式のURLを取得することで、一般的な動画プレイヤーやブラウザからそのまま再生できます。

aws kinesis-video-archived-media get-hls-streaming-session-url \
  --stream-name "warehouse-camera-01" \
  --playback-mode "LIVE"

 (5) playback-modeをON_DEMANDにすると、特定の過去時間範囲を指定した再生用URLを発行できます。監視カメラ映像の「あの時間帯を見返したい」という要件に、追加の録画基盤を構築せずに対応できます。

Rekognitionと連携したリアルタイム解析

 (6) KVSに流れ込む映像を、Amazon Rekognition Videoと連携させることで、人物検出・異常行動検知等のリアルタイム解析が可能になります。Bedrockマルチモーダルの回で扱った画像理解とは異なるアプローチで、Rekognitionは映像解析に特化したモデルを提供しています。

aws rekognition create-stream-processor \
  --input '{"KinesisVideoStream": {"Arn": "arn:aws:kinesisvideo:ap-northeast-1:123456789012:stream/warehouse-camera-01/1234567890"}}' \
  --output '{"KinesisDataStream": {"Arn": "arn:aws:kinesis:ap-northeast-1:123456789012:stream/detection-events"}}' \
  --settings '{"FaceSearch": {"CollectionId": "authorized-personnel"}}' \
  --role-arn "arn:aws:iam::123456789012:role/RekognitionStreamProcessorRole" \
  --name "warehouse-face-detection"

 (7) 検出結果は、指定したKinesis Data Streamに構造化イベントとして出力されます。ここから先はKinesisの回で扱った処理(Lambdaでのイベント処理、DynamoDBへの記録等)にそのままつながります。「未登録の人物が検知されたら通知する」といったフローを、EventBridgeやSlack自動化の回で扱った仕組みと組み合わせて構築できます。

注意

顔検出・顔認識機能を含む映像解析は、プライバシーへの配慮が特に強く求められる領域です。従業員や来訪者の映像を解析する場合、事前の告知・同意取得や、関連する法令(個人情報保護法等)への準拠を、技術実装以前に確認しておく必要があります。

WebRTCによる双方向リアルタイム通信

 (8) 監視用途とは別に、遠隔からカメラ映像を低遅延で確認したい、あるいは音声で応答したいという双方向コミュニケーションの要件には、KVSのWebRTC機能を使います。HLSは数秒〜数十秒の遅延が生じますが、WebRTCは1秒未満の低遅延を実現します。

確認結果

検証用のカメラデバイスからGStreamer経由でKVSへ映像を送信し、HLSのライブ再生URLをブラウザで開いたところ、数秒程度の遅延で映像が表示されることを確認しました。Rekognitionのストリームプロセッサを組み合わせた検証でも、人物の検出イベントがKinesis Data Streamに正しく出力されています。

S3への長期アーカイブ

 (9) KVSのデータ保持期間を超えて長期保存したい映像は、フラグメントセレクタを使ってS3へのエクスポートジョブを構築します。S3設計パターンの回で扱ったライフサイクル管理を、エクスポート後のアーカイブ映像にも適用し、古い映像は低頻度アクセスストレージクラスへ移行するといった設計が可能です。

重要な注意

カメラデバイスの認証情報(IAMロールやアクセスキー)が漏洩すると、映像ストリームへの不正アクセスや、なりすましによる偽映像の送信につながるリスクがあります。IoT Core応用編の回で扱ったFleet Provisioningのようなデバイス単位の証明書管理を、カメラデバイスにも適用することを検討してください。

まとめ

 (10) Kinesis Video Streamsは、監視カメラやドライブレコーダーのような映像デバイスからのデータ取り込みを、再生・保存・リアルタイム解析まで含めて扱える専用サービスです。KinesisやIoT Core応用編で扱ってきたストリーミング・デバイス管理の知見を、映像という特有のデータ形式に応用する選択肢として押さえておくとよいでしょう。

参考資料

対応コーデックやSDKの提供状況は更新されることがあるため、導入前に公式ドキュメントの最新情報を確認してください。

AWS AppConfigでフィーチャーフラグと設定変更を安全にデプロイする

この記事で分かること
  • Parameter StoreでのFラグ管理とAppConfigの違い
  • デプロイ戦略(段階的ロールアウト)とCloudWatchアラームによる自動ロールバック
  • Lambda拡張機能を使ったアプリケーション側での低レイテンシな設定取得
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / AWS AppConfig / Lambda拡張機能 / CloudWatchアラーム連携
対象読者
フィーチャーフラグや動的な設定値をParameter Storeで管理しているが、変更を全ユーザーに一斉反映してしまい、問題発生時に気づくのが遅れた経験があるSE

Parameter Storeとの違い

 (1) 以前Secrets Manager/Parameter Storeの回では、設定値やシークレットの管理を扱いました。Parameter Storeは値を保存・取得する仕組みとしては優れていますが、値を更新した瞬間にすべての参照元へ即座に反映される点は、フィーチャーフラグの運用においてはリスクにもなります。新機能を有効化した直後に不具合が発覚しても、即座に全ユーザーへ影響が及んでしまいます。

 (2) AWS AppConfigは、この「設定変更の反映」自体を、デプロイという単位で段階的に・監視しながら行える仕組みを提供します。単なる値のストレージではなく、「新しい設定値をどれだけの時間をかけて、どの範囲に、どう安全に展開するか」を制御するデプロイメントサービスです。

観点Parameter StoreAWS AppConfig
値の反映更新後、即座に全参照元へ反映デプロイ戦略に従って段階的に反映
異常時の対応手動でのロールバックCloudWatchアラーム連携で自動ロールバック
設定の検証なし(自前で実装)デプロイ前のバリデーション(JSON Schema等)
取得のレイテンシAPI呼び出しごとに発生Lambda拡張機能でローカルキャッシュ、低レイテンシ

アプリケーションとプロファイルの作成

aws appconfig create-application --name "order-service-config"

aws appconfig create-configuration-profile \
  --application-id "app-abc123" \
  --name "feature-flags" \
  --location-uri "hosted" \
  --type "AWS.AppConfig.FeatureFlags"

 (3) AWS.AppConfig.FeatureFlagsタイプを指定すると、フィーチャーフラグ専用のスキーマ(有効/無効の切り替えに加え、フラグごとの属性値も持てる構造)が自動的に適用されます。

段階的デプロイ戦略

 (4) 新しい設定を反映する際、一気に100%へ展開するのではなく、時間をかけて対象範囲を広げるデプロイ戦略を定義できます。

aws appconfig create-deployment-strategy \
  --name "gradual-rollout" \
  --deployment-duration-in-minutes 30 \
  --growth-factor 20 \
  --growth-type LINEAR \
  --final-bake-time-in-minutes 10

 (5) この設定は、30分かけて20%ずつ段階的に新しい設定値を反映し、100%到達後もさらに10分間(final-bake-time)監視を続けるという意味です。Fault Injection Simulatorの回で扱った段階的な検証の考え方が、フィーチャーフラグのデプロイにもそのまま適用されています。

補足

緊急のフラグ無効化(不具合発生時の即時オフ)には、AWS.AppConfig.AllAtOnceのような即時反映の戦略も用意されています。通常の機能追加は段階的に、緊急停止は即時に、と用途に応じて使い分けます。

CloudWatchアラームによる自動ロールバック

 (6) デプロイ中にエラー率の上昇などをCloudWatchアラームで検知すると、AppConfigはデプロイを自動的に中断し、直前の設定値へロールバックします。

aws appconfig start-deployment \
  --application-id "app-abc123" \
  --environment-id "env-prod" \
  --deployment-strategy-id "gradual-rollout" \
  --configuration-profile-id "profile-flags" \
  --configuration-version "3"

 (7) 環境(Environment)に、あらかじめCloudWatch監視設計パターンの回で扱ったようなアラーム(エラー率、レイテンシ等)を関連付けておくことで、この自動ロールバックが機能します。人が張り付いて監視しなくても、異常が検知された時点でデプロイが止まる仕組みです。

注意

アラームの閾値が緩すぎると、実際に問題が起きているのにロールバックが発動しないことがあります。逆に厳しすぎると、通常の変動でも頻繁にロールバックしてしまいます。CloudWatch監視設計パターンの回で扱ったSLI/SLOの考え方に沿って、適切な閾値を設定してください。

Lambda拡張機能での低レイテンシな取得

 (8) アプリケーションが毎回AppConfig APIを直接呼び出すと、そのAPI呼び出し自体がレイテンシに影響します。Lambda関数からは、AppConfig拡張機能(サイドカー的に動作するレイヤー)を使い、ローカルキャッシュ経由で設定値を取得するのが定石です。

import urllib.request
import json

def get_feature_flag(flag_name: str) -> bool:
    url = f"http://localhost:2772/applications/order-service-config/environments/production/configurations/feature-flags"
    with urllib.request.urlopen(url) as response:
        flags = json.loads(response.read())
    return flags.get(flag_name, {}).get("enabled", False)

def lambda_handler(event, context):
    if get_feature_flag("new_checkout_flow"):
        return process_with_new_flow(event)
    return process_with_legacy_flow(event)

 (9) 拡張機能がバックグラウンドで定期的に最新設定をポーリングし、ローカルのlocalhostエンドポイントにキャッシュを保持するため、Lambda関数の実行のたびにAppConfig本体へアクセスする必要がありません。Lambdaパフォーマンス最適化の回で扱ったコールドスタート対策の考え方とも相性が良い構成です。

確認結果

段階的デプロイ戦略を使い、意図的にエラー率の高いテスト用設定値をデプロイしたところ、CloudWatchアラームの閾値到達を検知して、AppConfigがデプロイを自動的に停止し、直前の安定した設定値へロールバックすることを確認しました。人の監視なしに異常なフラグ変更の影響を最小限に抑えられています。

スキーマバリデーション

 (10) 設定プロファイルにJSON Schemaを関連付けておくと、不正な形式の設定値がデプロイされる前に検証で弾かれます。Panderaの回で扱ったスキーマ検証の考え方を、実行時のデータではなく設定変更そのものに適用しているイメージです。

重要な注意

フィーチャーフラグが増えすぎると、どのフラグがどのコードパスに影響するか把握しづらくなり、技術的負債化しやすくなります。役目を終えたフラグ(恒久的に有効化された機能等)は、定期的にコードとAppConfig側の設定の両方から削除する運用を心がけてください。

まとめ

 (11) AWS AppConfigは、設定変更・フィーチャーフラグの反映を「単なる値の書き換え」から「監視付きの段階的デプロイ」へと引き上げる仕組みです。Secrets Manager/Parameter Storeで扱ってきた設定管理の延長として、変更のリスクをコントロールしたい場面での実用的な選択肢になります。

参考資料

対応するデプロイ戦略の設定値やLambda拡張機能の仕様は更新されることがあるため、導入前に公式ドキュメントの最新情報を確認してください。

Amazon Aurora DSQL入門:マルチリージョンでも強整合なPostgreSQL互換DB

この記事で分かること
  • Aurora DSQLがAurora Serverless v2と何が違うのか
  • 楽観的並行性制御(OCC)がもたらす制約と設計上の注意点
  • マルチリージョンActive-Active構成でのクラスタ作成と接続
記事の検証情報
確認日
2026年9月1日
検証環境
AWS CLI v2 / Aurora DSQL(プレビュー〜GA相当) / psycopg2/SQLAlchemyでの接続確認
対象読者
複数リージョンにまたがるアプリケーションを構築しており、リードレプリカのレプリケーション遅延やフェイルオーバー時の複雑さに悩んでいるSE

Aurora Serverless v2との違い

 (1) 以前Aurora Serverless v2の回では、単一リージョン内でのオートスケーリング構成を扱いました。Aurora Serverless v2は、あくまで従来型のプライマリ・リードレプリカ構成を自動でスケールさせるものであり、複数リージョンにまたがる書き込みには対応していません。Aurora DSQLは、これとは根本的にアーキテクチャが異なる、分散SQLデータベースという新しいカテゴリのサービスです。

 (2) 最大の特徴は、複数リージョンでActive-Active(すべてのリージョンで読み書き可能)構成を取りながら、強整合性を維持できる点です。従来のAuroraでは、書き込みは単一のプライマリインスタンスに集約する必要がありましたが、Aurora DSQLは分散トランザクション技術により、どのリージョンからの書き込みも一貫性を保って処理します。

観点Aurora Serverless v2Aurora DSQL
書き込み可能な場所単一のプライマリインスタンス複数リージョンから同時に書き込み可能
スケーリング単位ACU(インスタンス相当)完全サーバーレス(インスタンス概念なし)
整合性モデル強整合(単一リージョン内)強整合(複数リージョンをまたいでも)
ロック方式悲観的ロック(通常のPostgreSQL/MySQL同様)楽観的並行性制御(OCC)
補足

Aurora DSQLはPostgreSQL互換のワイヤプロトコルを持ちますが、内部実装は通常のPostgreSQLエンジンとは異なります。トリガーやストアドプロシージャなど、一部のPostgreSQL機能はサポート対象外となっているため、既存のPostgreSQLアプリケーションを移行する際は対応状況を事前に確認する必要があります。

クラスタの作成

aws dsql create-cluster \
  --deletion-protection-enabled \
  --tags Environment=production

 (3) マルチリージョン構成にする場合、複数のリージョンでクラスタを作成し、それらをピアリングします。

aws dsql create-multi-region-clusters \
  --linked-cluster-properties '{
    "witnessRegion": "us-west-2",
    "clusters": [
      {"region": "ap-northeast-1"},
      {"region": "ap-southeast-1"}
    ]
  }'

 (4) witnessRegionは、分散合意形成のための第三のリージョンです。VPC設計パターンの回で扱ったマルチAZ構成の考え方をリージョンレベルに拡張したイメージで、2つの書き込みリージョンに加えて、コーディネーション用の監視役リージョンを置く構成になっています。

楽観的並行性制御(OCC)という設計上の制約

 (5) Aurora DSQLは、トランザクションの競合を「事前にロックで防ぐ」のではなく「事後に検出して片方を失敗させる」楽観的並行性制御を採用しています。これは、複数リージョンにまたがるロック待ちのレイテンシを避けるための設計判断です。

import psycopg2

conn = psycopg2.connect(host="cluster-endpoint.dsql.ap-northeast-1.on.aws", ...)
try:
    with conn.cursor() as cur:
        cur.execute("UPDATE inventory SET stock = stock - 1 WHERE product_id = %s", ("A-1001",))
        conn.commit()
except psycopg2.errors.SerializationFailure:
    conn.rollback()
    # 競合が検出された場合、アプリケーション側でリトライする
    ...

 (6) 同じ行を複数のトランザクションがほぼ同時に更新しようとすると、一方はコミット時にSerializationFailureで失敗します。Tenacityの回で扱ったリトライ制御を組み込み、こうした競合失敗を自動的にリトライする設計が、Aurora DSQLを使う上での基本パターンになります。

注意

同一行への高頻度な更新が集中するホットスポット(例えば人気商品の在庫カウンタ)は、OCCの性質上、競合によるリトライが頻発しやすくなります。カウンタ的な値を扱う場合は、行を分割して集計時にまとめる、あるいはDynamoDB設計パターンの回で扱ったアトミックカウンタのような別の仕組みを検討するなど、アクセスパターンに応じた設計上の工夫が必要です。

SQLAlchemyでの接続

from sqlalchemy import create_engine

engine = create_engine(
    "postgresql+psycopg2://admin@cluster-endpoint.dsql.ap-northeast-1.on.aws:5432/postgres",
    connect_args={"sslmode": "require"},
)

 (7) SQLAlchemyの回で扱った通常のPostgreSQL接続とほぼ同じ書き方で接続できます。認証にはIAM認証トークンを使う方式が推奨されており、Secrets Manager/Parameter Storeの回で扱ったような固定パスワードの管理から解放される設計になっています。

確認結果

2つのリージョンにまたがるクラスタに対して、それぞれのリージョンから同じテーブルへの書き込みを検証したところ、両リージョンの書き込みが強整合性を保って反映されることを確認しました。従来のリードレプリカ構成で発生しがちなレプリケーション遅延による読み取り不整合が、この構成では発生していません。

向いているユースケース・向かないユースケース

 (8) グローバルに分散したユーザーベースを持ち、どのリージョンからでも最新のデータを強整合に読み書きしたいアプリケーション(在庫管理、予約システム等)には強みを発揮します。一方、複雑なストアドプロシージャやトリガーに依存した既存システムの移行、あるいは同一レコードへの超高頻度な更新が集中するワークロードには、現時点では不向きな面があります。

重要な注意

Aurora DSQLはサービスとして比較的新しく、対応機能やSDK・ドライバの成熟度が従来のAuroraと同水準になるまで発展途上の部分があります。本番採用の判断にあたっては、必要なPostgreSQL機能が実際にサポートされているか、公式の互換性ドキュメントで入念に確認してください。

まとめ

 (9) Aurora DSQLは、複数リージョンにまたがる強整合な読み書きという、従来のAuroraでは実現しにくかった要件に応える分散SQLデータベースです。Aurora Serverless v2で扱ってきた単一リージョンでのスケーリングとは異なる設計思想を持つため、グローバル展開するアプリケーションのデータ層を検討する際の新しい選択肢として押さえておく価値があります。

参考資料

対応機能やリージョン展開状況は活発に更新されているため、導入前に公式ドキュメントの最新情報を確認してください。