

# インポート形式のクォータと検証
<a name="S3DataImport.Validation"></a>

## インポートクォータ
<a name="S3DataImport.Validation.limits"></a>

us-east-1、us-west-2、および eu-west-1 の各リージョンでは、Amazon S3 からの DynamoDB のインポートは、一度に 15 TB の合計インポートソースオブジェクトサイズで 50 個の同時インポートジョブに対応できます。他のすべてのリージョンでは、合計サイズが 1 TB で最大 50 個の同時インポートタスクに対応できます。各インポートジョブでは、すべてのリージョンで最大 50,000 個の Amazon S3 オブジェクトを使用できます。これらのデフォルトクォータはすべてのアカウントに適用されます。これらのクォータを改訂する必要があると考える場合は、アカウントチームに連絡してください。ケースバイケースで検討されます。DynamoDB の制限の詳細については、「[Service Quotas](ServiceQuotas.html)」を参照してください。

## 検証エラー
<a name="S3DataImport.Validation.Errors"></a>

インポートプロセス中に、DynamoDB でデータの解析中にエラーが発生することがあります。エラーごとに、DynamoDB は CloudWatch ログを出力し、発生したエラーの総数を記録します。Amazon S3 オブジェクト自体の形式が正しくない場合や、その内容が DynamoDB 項目を形成できない場合は、オブジェクトの残りの部分の処理がスキップされることがあります。

**注記**  
Amazon S3 データソースに同じキーを共有する項目が複数ある場合、項目は 1 つが残るまで上書きされます。この場合、1 つの項目がインポートされ、他の項目が無視されたかのように見えることがあります。重複した項目はランダムな順序で上書きされ、エラーとしてカウントされず、CloudWatch ログにも出力されません。  
インポートが完了すると、インポートされた項目の総数、エラーの総数、および処理された項目の合計数が表示されます。トラブルシューティングをさらに進めるには、インポートされた項目の合計サイズと処理されたデータの合計サイズを確認することもできます。

インポートエラーには、API 検証エラー、データ検証エラー、および設定エラーの 3 つのカテゴリがあります。

### API 検証エラー
<a name="S3DataImport.Validation.Errors.API"></a>

API 検証エラーは、同期 API からの項目レベルのエラーです。一般的な原因として、アクセス許可の問題、必須パラメータの欠落、およびパラメータ検証の失敗が挙げられます。API コールが失敗した理由の詳細は、`ImportTable` リクエストによってスローされる例外に含まれています。

### データ検証エラー
<a name="S3DataImport.Validation.Errors.Data"></a>

データ検証エラーは、項目レベルまたはファイルレベルで発生する可能性があります。インポート中、ターゲットテーブルにインポートする前に、DynamoDB ルールに基づいて項目が検証されます。項目が検証に失敗し、インポートされない場合、インポートジョブはその項目をスキップし、次の項目に進みます。ジョブの終了時に、インポートのジョブは FAILED に設定され、FailureCode、ItemValidationError、および FailureMessage「Some of the items failed validation checks and were not imported。Please check CloudWatch error logs for more details.」(一部の項目は検証チェックに失敗したため、インポートされませんでした。詳細については、CloudWatch エラーログを確認してください) が表示されます。

 データ検証エラーの一般的な原因として、オブジェクトが解析できない、オブジェクトの形式が正しくない (入力で DYNAMODB\$1JSON が指定されているが、オブジェクトが DYNAMODB\$1JSON でない)、および指定されたソーステーブルキーとスキーマの不一致が挙げられます。

### 設定エラー
<a name="S3DataImport.Validation.Errors.Configuration"></a>

設定エラーは、通常、アクセス許可の検証によるワークフローエラーです。インポートワークフローでは、リクエストを受け入れた後、一部のアクセス許可がチェックされます。Amazon S3 や CloudWatch など、必要な依存関係の呼び出しで問題が発生した場合、プロセスでインポートステータスが FAILED とマークされます。`failureCode` および `failureMessage` は、失敗の理由を指します。該当する場合、失敗メッセージには、CloudTrail での失敗の理由を調査するために使用できるリクエスト ID も含まれます。

よくある設定エラーとして、Amazon S3 バケットの URL が間違っていることや、Amazon S3 バケット、CloudWatch Logs、および Amazon S3 オブジェクトの復号に使用される AWS KMS キーにアクセスする許可がないことが挙げられます。詳細については、「[Using and data keys](encryption.usagenotes.html#dynamodb-kms)」(データキーの使用) を参照してください。

### ソース Amazon S3 オブジェクトの検証
<a name="S3DataImport.Validation.Errors.S3Objects"></a>

ソース S3 オブジェクトの検証を行うには、次のステップを実行します。

1. データ形式と圧縮タイプの検証 
   + 指定したプレフィックスで一致するすべての Amazon S3 オブジェクトが、同じ形式 (DYNAMODB\$1JSON、DYNAMODB\$1ION、CSV) であることを確認します。
   + 指定したプレフィックスで一致するすべての Amazon S3 オブジェクトが、同じ方法 (GZIP、ZSTD、NONE) で圧縮されていることを確認します。
**注記**  
ImportTable 呼び出しで指定された入力形式が優先されるため、Amazon S3 オブジェクトには、対応する拡張子 (.csv、.json、.ion、.gz、.zstd など) は必要はありません。

1. インポートデータが目的のテーブルスキーマに準拠していることを検証します
   + ソースデータの各項目にプライマリキーがあることを確認します。ソートキーはインポートのオプションです。
   + プライマリキーとソートキーに関連付けられた属性タイプが、テーブル作成パラメータで指定されているように、テーブルおよび GSI スキーマの属性タイプと一致することを確認します。

### トラブルシューティング
<a name="S3DataImport.Validation.Troubleshooting"></a>

#### CloudWatch ログ
<a name="S3DataImport.Validation.Troubleshooting.Cloudwatch"></a>

インポートジョブが失敗した場合、詳細なエラーメッセージが CloudWatch Logs に投稿されます。これらのログにアクセスするには、まず出力から ImportArn を取得し、次のコマンドを使用して describe-import を実行します。

```
aws dynamodb describe-import --import-arn arn:aws:dynamodb:us-east-1:ACCOUNT:table/target-table/import/01658528578619-c4d4e311
}
```

出力例:

```
aws dynamodb describe-import --import-arn "arn:aws:dynamodb:us-east-1:531234567890:table/target-table/import/01658528578619-c4d4e311"
{
    "ImportTableDescription": {
        "ImportArn": "arn:aws:dynamodb:us-east-1:ACCOUNT:table/target-table/import/01658528578619-c4d4e311",
        "ImportStatus": "FAILED",
        "TableArn": "arn:aws:dynamodb:us-east-1:ACCOUNT:table/target-table",
        "TableId": "7b7ecc22-302f-4039-8ea9-8e7c3eb2bcb8",
        "ClientToken": "30f8891c-e478-47f4-af4a-67a5c3b595e3",
        "S3BucketSource": {
            "S3BucketOwner": "ACCOUNT",
            "S3Bucket": "my-import-source",
            "S3KeyPrefix": "import-test"
        },
        "ErrorCount": 1,
        "CloudWatchLogGroupArn": "arn:aws:logs:us-east-1:ACCOUNT:log-group:/aws-dynamodb/imports:*",
        "InputFormat": "CSV",
        "InputCompressionType": "NONE",
        "TableCreationParameters": {
            "TableName": "target-table",
            "AttributeDefinitions": [
                {
                    "AttributeName": "pk",
                    "AttributeType": "S"
                }
            ],
            "KeySchema": [
                {
                    "AttributeName": "pk",
                    "KeyType": "HASH"
                }
            ],
            "BillingMode": "PAY_PER_REQUEST"
        },
        "StartTime": 1658528578.619,
        "EndTime": 1658528750.628,
        "ProcessedSizeBytes": 70,
        "ProcessedItemCount": 1,
        "ImportedItemCount": 0,
        "FailureCode": "ItemValidationError",
        "FailureMessage": "Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details."
    }
}
```

上記のレスポンスからロググループとインポート ID を取得し、それを使用してエラーログを取得します。インポート ID は、`ImportArn` フィールドの最後のパス要素です。ロググループ名は `/aws-dynamodb/imports` です。エラーログストリーム名は `import-id/error` です。この例では、`01658528578619-c4d4e311/error` のようになります。

#### 項目にキー pk がない
<a name="S3DataImport.Validation.Troubleshooting.Missing"></a>

ソース S3 オブジェクトにパラメータとして指定されたプライマリキーが含まれていない場合、インポートは失敗します。例えば、インポートのプライマリキーを列名「pk」として定義する場合などです。

```
aws dynamodb import-table —s3-bucket-source S3Bucket=my-import-source,S3KeyPrefix=import-test.csv \ 
            —input-format CSV --table-creation-parameters '{"TableName":"target-table","KeySchema":  \
            [{"AttributeName":"pk","KeyType":"HASH"}],"AttributeDefinitions":[{"AttributeName":"pk","AttributeType":"S"}],"BillingMode":"PAY_PER_REQUEST"}'
```

列「pk」が、次のコンテンツを含むソースオブジェクト `import-test.csv` にありません。

```
title,artist,year_of_release
The Dark Side of the Moon,Pink Floyd,1973
```

データソースにプライマリキーがないため、項目の検証エラーによりこのインポートは失敗します。

CloudWatch エラーログの例:

```
aws logs get-log-events —log-group-name /aws-dynamodb/imports —log-stream-name 01658528578619-c4d4e311/error
{
"events": [
{
"timestamp": 1658528745319,
"message": "{\"itemS3Pointer\":{\"bucket\":\"my-import-source\",\"key\":\"import-test.csv\",\"itemIndex\":0},\"importArn\":\"arn:aws:dynamodb:us-east-1:531234567890:table/target-table/import/01658528578619-c4d4e311\",\"errorMessages\":[\"One or more parameter values were invalid: Missing the key pk in the item\"]}",
"ingestionTime": 1658528745414
}
],
"nextForwardToken": "f/36986426953797707963335499204463414460239026137054642176/s",
"nextBackwardToken": "b/36986426953797707963335499204463414460239026137054642176/s"
}
```

このエラーログには、「One or more parameter values were invalid: Missing the key pk in the item」(1 つ以上のパラメータ値が無効でした: 項目にキー pk がありません) と表示されます。このインポートジョブが失敗したため、「target-table」テーブルが存在し、項目がインポートされなかったことから空になっています。最初の項目が処理され、オブジェクトは項目の検証に失敗しました。

問題を解決するには、「target-table」が不要になった場合は削除します。次に、ソースオブジェクトに存在するプライマリキー列名を使用するか、ソースデータを次のように更新します。

```
pk,title,artist,year_of_release
Albums::Rock::Classic::1973::AlbumId::ALB25,The Dark Side of the Moon,Pink Floyd,1973
```

#### ターゲットテーブルが存在する
<a name="S3DataImport.Validation.Troubleshooting.TargetTable"></a>

インポートジョブを開始して、次のようなレスポンスを受け取った場合:

```
An error occurred (ResourceInUseException) when calling the ImportTable operation: Table already exists: target-table
```

このエラーを修正するには、まだ存在しないテーブル名を選択し、インポートを再試行する必要があります。

#### 指定されたバケットは存在しません
<a name="S3DataImport.Validation.Troubleshooting.Bucket"></a>

ソースバケットが存在しない場合、インポートは失敗し、エラーメッセージの詳細が CloudWatch に記録されます。

インポートの説明の例:

```
aws dynamodb —endpoint-url $ENDPOINT describe-import —import-arn "arn:aws:dynamodb:us-east-1:531234567890:table/target-table/import/01658530687105-e6035287"
{
"ImportTableDescription": {
"ImportArn": "arn:aws:dynamodb:us-east-1:ACCOUNT:table/target-table/import/01658530687105-e6035287",
"ImportStatus": "FAILED",
"TableArn": "arn:aws:dynamodb:us-east-1:ACCOUNT:table/target-table",
"TableId": "e1215a82-b8d1-45a8-b2e2-14b9dd8eb99c",
"ClientToken": "3048e16a-069b-47a6-9dfb-9c259fd2fb6f",
"S3BucketSource": {
"S3BucketOwner": "531234567890",
"S3Bucket": "BUCKET_DOES_NOT_EXIST",
"S3KeyPrefix": "import-test"
},
"ErrorCount": 0,
"CloudWatchLogGroupArn": "arn:aws:logs:us-east-1:ACCOUNT:log-group:/aws-dynamodb/imports:*",
"InputFormat": "CSV",
"InputCompressionType": "NONE",
"TableCreationParameters": {
"TableName": "target-table",
"AttributeDefinitions": [
{
"AttributeName": "pk",
"AttributeType": "S"
}
],
"KeySchema": [
{
"AttributeName": "pk",
"KeyType": "HASH"
}
],
"BillingMode": "PAY_PER_REQUEST"
},
"StartTime": 1658530687.105,
"EndTime": 1658530701.873,
"ProcessedSizeBytes": 0,
"ProcessedItemCount": 0,
"ImportedItemCount": 0,
"FailureCode": "S3NoSuchBucket",
"FailureMessage": "The specified bucket does not exist (Service: Amazon S3; Status Code: 404; Error Code: NoSuchBucket; Request ID: Q4W6QYYFDWY6WAKH; S3 Extended Request ID: ObqSlLeIMJpQqHLRX2C5Sy7n+8g6iGPwy7ixg7eEeTuEkg/+chU/JF+RbliWytMlkUlUcuCLTrI=; Proxy: null)"
}
}
```

`FailureCode` は `S3NoSuchBucket` となり、`FailureMessage` には、リクエスト ID や、エラーをスローしたサービスなどの詳細が含まれます。データがテーブルにインポートされる前にエラーがキャッチされたため、新しい DynamoDB テーブルは作成されません。場合によっては、データインポートの開始後にこれらのエラーが発生すると、部分的にインポートされたデータを含むテーブルが保持されることがあります。

このエラーを修正するには、ソース Amazon S3 バケットが存在することを確認してから、インポートプロセスを再開します。