migrating-hive-tables-to-s3-tables について
Migrating Hive Tables to S3 Tables は、ネイティブ移行 API を使って Glue Hive Parquet テーブルを S3 Tables バケットへ移す手順をコーディングエージェントに示します。事前確認、計画の承認、進捗管理、同期、切り替え前の検証を扱い、変更やデータ損失を防ぐ手順も含みます。
主な機能
- 01ソースと移行先の事前確認
- 02移行計画の確認と承認
- 03移行の追跡・同期・完了
- 04行数とサンプル値の検証
- 05権限とデータ損失へのガードレール
活用シーン
- 01Glue Hive Parquet テーブルを S3 Tables へ移行
- 02切り替え前に移行先との同期を維持
- 03移行先の昇格前にデータの一致を確認
MCP 対応
AWS MCP Server が利用可能な場合、このスキルと参照資料の読み込み、および AWS 呼び出しに使用できます。サーバーがなくても AWS CLI 構文で実行できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill migrating-hive-tables-to-s3-tablesインストール後、Claude Code で/migrating-hive-tables-to-s3-tablesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-setup.mdiam-roles.mdlifecycle.mdpreflight.mdtroubleshooting.mdvalidation.md詳細
Hive テーブルを S3 Tables に移行する
目次
- 概要
- 移行前に
- 使用する場面
- 使用しない場面(別のスキルを使用)
- 対象範囲と制約
- 6 つの移行 API
- 移行のライフサイクル
- 移行前のガードレール
- 移行後のガードレール
- 主要な API の形式
- セキュリティに関する考慮事項
- 参考資料
概要
このスキルでは、ネイティブの S3 Tables 移行 API を使用して、1 つの Glue Hive Parquet テーブルを S3 テーブルバケットに移行する手順をエージェントに案内します。Amazon S3 Tables は移行を計画し、列とオブジェクトの互換性を報告してデータをコピーし、移行を完了するまで移行先を移行元と同期させます。このスキルに従うコーディングエージェントは、事前チェックを実行し、移行を開始して、計画を提示して承認を得たうえで、進行状況を監視し、移行を完了して結果を検証します。
AWS MCP Server を利用できる場合は、このスキルとその参考資料(file="references/<name>.md" を指定した aws___retrieve_skill)を読み込み、AWS の呼び出しを実行するために使用します。
移行前に
エージェントへの指示: テーブル、データ、メタデータ、カタログエントリを変更する手順、および IAM、KMS、S3 バケットを変更する手順(ロールやポリシーの作成または編集、キーポリシーの編集、レポートバケットの作成)を実行する前に、必ず移行計画を提示し、ユーザーから明示的な承認を得てください。最初に正確な JSON またはコマンドを提示してください。キーポリシーについては、get-key-policy で読み取り、ステートメントを 1 つ追加してください。ポリシー全体を置き換えてはいけません。計画には、次の項目を必ず含めてください。
- 移行元テーブルと移行先のテーブルバケット、ネームスペース、テーブル名。
- 変更される書き込み先(ETL ジョブ、ストリーミングまたは取り込み、
INSERT/MERGE、CDC)。 - テーブルを読み取るクエリエンジンと下流のコンシューマー。
- 古い Glue テーブルまたは S3 プレフィックスを参照するデータセット、保存済みクエリ、権限。
ユーザーのリクエストで事前に承認されている内容(移行元、移行先、移行の意図を指定したもの)は、読み取り専用のチェックと、計画の確認を伴う Start のみを対象とします。計画の承認、setNull または drop ポリシーの受け入れ、Complete、およびあらゆる削除には、会話中に明示的な承認を得る必要があります。実際の状態が承認済みの内容(異なるスキーマ、パーティションレイアウト、行数、またはリソース)と異なる場合は、停止して相違点を説明し、再度承認を得てください。
計画の一環として、次の制約をユーザーに確認してください。
- 移行先へのすべての書き込みは、Iceberg 対応エンジン(Athena、EMR、Iceberg を使用する Glue など)を経由する必要があります。Parquet ファイルを S3 に直接書き込むライターは機能しません。
- すべてのリーダーが Iceberg と S3 Tables カタログをサポートしている必要があります。
- ジョブとクエリは、Glue Hive テーブルから S3 Tables カタログの参照先に切り替える必要があります。
- 移行元は変更しません。移行先の検証が済むまで、ライターは移行元を使い続けてください。
- 本番トラフィックを移行する前に、行数とサンプル値を検証してください(references/validation.md)。
サポートされる移行元と制限の全一覧については、S3 Tables へのテーブルの移行を参照してください。
実行環境: AWS MCP サーバーの有無にかかわらず動作します。手順では AWS CLI の構文を使用します。サンドボックスでの実行と監査ログ記録には、AWS MCP サーバーの使用を推奨します。移行コマンドは
aws s3tablesの一部です。古い CLI にコマンドがない場合は、references/api-setup.mdを参照してください。
使用する場合
ソースが Parquet データを含む Glue Data Catalog の Hive テーブル(TableType=EXTERNAL_TABLE、Hive Parquet SerDe)で、移行先が同じアカウントおよびリージョンにある S3 テーブルバケットの場合に、このスキルを使用します。
- ネイティブ移行 API を使って、そのテーブルをマネージド Iceberg として S3 Tables に移行する場合。
- カットオーバー前に、移行したテーブルをアクティブな Hive ソースと同期させておく場合。
使用しない場合(別のスキルを使用)
以下は、ほかのエージェントスキルの名前です。これらの依頼にはこのスキルを使用せず、指定されたスキルを読み込んでください。このスキルを使用しない場合を尋ねられたときは、すべてのケースを列挙してください。
- CTAS、Glue ETL、または EMR/Spark を使って自分で Iceberg に移行する場合:
ingesting-into-data-lakeスキルを使用します(このスキルはマネージド移行 API のみを対象としています)。 - セルフマネージドまたは標準の Iceberg テーブルを変換する場合:
ingesting-into-data-lakeスキルを使用します。 - 生ファイル(Glue テーブルのない Parquet、CSV、JSON)やその他のソース(JDBC、Snowflake、BigQuery、DynamoDB)を読み込む場合:
ingesting-into-data-lakeスキルを使用します。 - 空の Iceberg テーブルを新規作成する場合:
creating-data-lake-tableスキルを使用します。 - Athena クエリを実行または管理する場合:
querying-data-lakeスキルを使用します。 - テーブルやアセットの場所を特定する場合:
finding-data-lake-assetsスキルを使用します。カタログを監査する場合:exploring-data-catalogスキルを使用します。 - Glue 接続を設定する場合:
connecting-to-data-sourceスキルを使用します。 - 移行先が S3 Tables 以外の場合。
プロンプトのパターン(トリガーとなる表現)
- 「Glue Hive テーブル
<db>.<tbl>をテーブルバケット<name>に移行してください。」 - 「ネイティブ移行 API を使って、既存の Hive テーブルを S3 Tables にインポートしてください。」
- 「CTAS や Glue/Spark ジョブを実行せずに、Parquet Hive テーブルを Iceberg に移行してください。」
- 「StartTableMigration を使って
<tbl>を変換してください。」 - 「カットオーバー前に、移行したテーブルをソースと同期させておいてください」→ Sync。
- 「移行したテーブルを完了してください」→ Complete。
- 「移行
<id>のステータスまたは計画を確認してください」→ Get。 - 「テーブル移行の一覧を表示してください」→ List。
対象範囲と制約
- ソース: 移行先のテーブルバケットと同じアカウントおよびリージョンにある Glue Hive Parquet テーブル。
- 移行先: 既存の S3 テーブルバケットおよび名前空間。移行時にテーブルが作成されます。
- サポート対象外(最新の一覧は S3 Tables 移行ガイドで確認してください): Lake Formation に登録されたテーブル、テーブルのロケーション外にあるパーティション、Parquet 以外の形式、Iceberg ソース、アカウント間の移行、SSE-C、アーカイブストレージクラス。これらを事前チェックで確認し、いずれかに該当する場合は中止してください。Lake Formation に登録されたテーブルの場合は、サポート対象外であることをユーザーに伝え、移行 ID を添えて AWS Support または担当のアカウントチームに問い合わせ、サポートを依頼するよう提案してください。Lake Formation の設定は変更しないでください。
- 互換性の問題は計画時に報告されます。承認する前に、必ず計画を確認してください。
- 全件成功または全件失敗のコピー: オブジェクトが1つでも失敗すると、移行全体が失敗します。
succeededの実行では、失敗したオブジェクトはありません。 - 指定した汎用バケットに、テーブル互換性、オブジェクト互換性、オブジェクト移行の3種類のレポートが書き込まれます。
- コストと所要時間: 移行ではデータのコピーがもう1つ作成されます。ソースを廃止するまで、ストレージ容量が概ね2倍になることを見込んでください。大規模なテーブルでは、数時間かかる場合があります。
- クォータ: S3 Tables のクォータを参照してください。
- 移行ポリシー: デフォルトでは、互換性のない列があると実行は失敗します。
incompatibleValuesPolicy: setNullとunmatchedSourceFieldsPolicy: dropは列全体に適用され、その場合も実行結果はsucceededと報告されます。setNullまたはdroppedとなった列はデータ損失として扱い、明示的な承認を得てください。
6つの移行 API
| API | 目的 | フェーズ |
|---|---|---|
StartTableMigration | 移行を計画して開始します。--review-migration-plan を指定すると、pendingReview の状態で一時停止します。 | 開始 |
GetTableMigration | state、hasValidPlan、planningStats、migrationStats、migrationOutput、failureReason を返します。 | 追跡、レビュー |
UpdateTableMigration | 承認(--requested-state queued)またはキャンセルを行います。 | 承認 |
SyncTableMigration | 前回の計画後に発生したソースの変更を適用します。最新の状態になるまで繰り返します。 | 同期 |
CompleteTableMigration | 移行先を読み書き可能にします。--table-arn を指定します。空の本文を返します。移行状態は succeeded のままです。get-table で確認します(managedByService が null であること)。 | 完了 |
ListTableMigrations | 1つのテーブルバケットまたはテーブルの移行を一覧表示します。 | 検出 |
リクエストとレスポンスの形式は、references/lifecycle.md に記載されています。
移行のライフサイクル(フェーズ)
- 事前確認 → references/preflight.md、references/iam-roles.md
- 開始と計画:
start-table-migration --review-migration-planを実行します。planning→pendingReview。 - レビュー:
get-table-migrationを実行し、互換性レポートを確認して、承認のために計画を提示します。 - 承認と移行:
update-table-migration --requested-state queuedを実行し、migrating→succeededになるまでポーリングします。 - 同期(任意):
sync-table-migrationを実行します。最新の状態になるまで繰り返します。 - 検証:
succeeded状態のテーブルについて、完了前に Athena で移行先にクエリを実行し、ソースと比較します → references/validation.md。検証はすべての移行で必須です。ユーザーがオプトアウトしない限り、指示がなくても行数とサンプルのチェックを実行します。件数が不足している場合は、sync-table-migrationで調整します(完了後は実行できません)。 - 完了: 同等性が確認され、ユーザーが承認したら、
complete-table-migration --table-arn ...を実行し、その後get-tableでmanagedByServiceが null であることを確認します。
フェーズ2~7については、references/lifecycle.md を参照してください。
移行前のガードレール(毎回、開始前に実行)
以下のすべてに合格するまで、start-table-migration を呼び出さないでください。コマンドは
references/preflight.md と references/iam-roles.md にあります。
- 計画の承認。 移行前の確認 に記載された計画が提示され、承認されています。
- 認証情報とリージョン。
sts get-caller-identityが成功し、移行元と移行先が同じアカウントおよびリージョンにあります。 - 移行元は Glue Hive Parquet。
TableType=EXTERNAL_TABLEで、Hive Parquet 形式および SerDe を使用していること。Iceberg、ACID/トランザクションテーブル、ストレージハンドラーは対象外です。catalogIdを記録してください。 - パーティションの場所。 すべてのパーティションの場所がテーブルの場所の配下にあること。配下にないパーティションがあると、計画時に
UNSUPPORTED_PARTITIONSで失敗します。パーティションプロジェクションとskip.header.line.countも確認してください。 - Lake Formation。 移行元テーブルまたはその場所が Lake Formation に登録されている場合は、サポート対象外のため中止してください(移行ガイドで現在のサポート状況を確認してください)。Lake Formation の設定は変更しないでください。
- 移行先の存在確認。 テーブルバケットと名前空間が存在すること。名前空間がない場合、開始時に
NotFoundExceptionで失敗します。 - 移行ロールの信頼関係。 ステートメントは1つで、プリンシパルは
migration.s3tables.amazonaws.com、条件はaws:SourceAccountとaws:SourceArnであること。 - 移行ロールの権限。 対象範囲を限定した移行元の S3 および Glue の読み取り権限、移行先への書き込み権限、レポートバケットへの書き込み権限があること。呼び出し元にも、このロールに対する
iam:PassRole権限が必要です。また、iam:PassedToService=migration.s3tables.amazonaws.comを条件として指定してください。 - KMS。 データがカスタマーマネージドキーで暗号化されている場合は、
kms:Decryptとkms:GenerateDataKeyを許可してください。SSE-KMS の移行先では、キーポリシーでmaintenance.s3tables.amazonaws.comも許可する必要があります。許可されていない場合、テーブルの作成に失敗し、計画が完了しません(事前確認 §7 と IAM ロール を参照)。
移行後のガードレール(完了前に成功を検証)
詳細は references/validation.md を参照してください。
Complete の前に、succeeded 状態のテーブルでチェック1~7を実行してください。Complete の後は Sync が拒否されます。Complete の後は、get-table で managedByService が null であることだけを確認してください。
- 最終状態:
state: succeededで、failureReasonが null であること。 - オブジェクト数の確認:
objectsFailedMigrationが0で、objectsMigratedが計画されたオブジェクト数と一致すること。一致しない場合は、移行元のオブジェクト数を確認してください(以前の同期で追加されたファイルであれば正当な場合があります)。失敗と判断する前に、行数が一致することも確認してください。 - 行数の一致: 移行先の
count(*)が移行元と一致すること。 - パーティションの一致: パーティションごとの行数が一致すること(パーティション化されたテーブル)。
- 行のスポットチェック: タイムスタンプなどの変換された列を含め、サンプル値が一致すること。
- スキーマの確認: すべての列の型ラベル(
Lossless、Widened、Converted)が計画で承認済みであること。IncompatibleまたはUnsupportedがないこと。 - カタログの命名:
"s3tablescatalog/<table-bucket>"."<namespace>"."<table>"としてクエリすること。
主な API の形式
sourceType=glueTable(トップレベル)、source={"glueTable":{"catalogId":"<acct>","databaseName":"<db>","tableName":"<tbl>"}}です。catalogIdは必須です。ロールメンバーはroleARNです。--destination-table={"tableBucketARN":"<arn>","namespace":"<ns>","name":"<tbl>"}です。migrationOutputは必須です。形式は{bucket, prefixes}で、bucketは汎用バケットの ARN です。prefixesでは、オプションでtableCompatibilityReport、objectCompatibilityReport、objectMigrationReportを設定します。dataMigration.migrationPoliciesはオプションです。unmatchedSourceFieldsPolicy(fail|drop)、incompatibleValuesPolicy(fail|setNull)を設定できます。どちらもデフォルトはfailです。- 信頼ポリシーに
sts:ExternalIdを追加しないでください。Amazon S3 Tables はこれを送信しません。 - 状態:
new → planning → pendingReview → queued → migrating → succeeded。また、failed、cancelling、cancelledもあります。 - キャンセル時または失敗時も、移行先テーブルは保持されます。
hasValidPlanが true の場合は、sync-table-migrationで再開します。そうでない場合は、テーブルを削除して最初からやり直します。ルールについては、references/lifecycle.md を参照してください。 succeeded状態の移行のみ完了できます。2 回目の完了処理は409 ConflictExceptionまたは400 BadRequestExceptionを返します。どちらも「すでに完了済み」として扱ってください。- Athena の参照形式:
"s3tablescatalog/<table-bucket>"."<namespace>"."<table>"。テーブルバケットを Glue Data Catalog と統合する必要があります。
セキュリティに関する考慮事項
- 説明のみで、同梱コードや依存関係はありません。
- 移行ロール:
aws:SourceAccountおよびaws:SourceArn条件を使用してmigration.s3tables.amazonaws.comを信頼します。権限は、対象のソース、移行先、レポートリソースに限定します。 - 暗号化: 移行先のテーブルバケットとレポートバケットでは、TLS のみを許可するバケットポリシーとあわせて SSE-KMS を推奨します。移行先でカスタマーマネージドキーを使用する場合は、キーポリシーで
maintenance.s3tables.amazonaws.comを許可する必要があります。 - ログ記録: 移行 API とロールの引き受けについて CloudTrail を有効にし、対象バケットで S3 データイベントまたはサーバーアクセスログを有効にして、失敗に関する CloudWatch アラームを設定します。ログの保存先を暗号化してください。
- 生成されたコマンド、レポート、状態ファイルにシークレットを含めないでください。
参考資料
| ファイル | トピック |
|---|---|
| references/api-setup.md | 移行コマンドが aws s3tables CLI に含まれていることの確認 |
| references/preflight.md | 認証情報、ソースの確認、パーティションの場所、Lake Formation、移行先 |
| references/iam-roles.md | 呼び出し元のポリシー、および移行ロールの信頼と権限 |
| references/lifecycle.md | 状態遷移とフェーズごとの呼び出し:開始、レビュー、承認、同期、完了 |
| references/validation.md | Athena による行数、集計、サンプルの確認、およびカタログの命名 |
| references/troubleshooting.md | failureReason コードと修正方法 |