

# 在 DynamoDB 中请求表导入
<a name="S3DataImport.Requesting"></a>

通过 DynamoDB 导入，您可以将数据从 Amazon S3 存储桶导入新 DynamoDB 表。您可以使用 [DynamoDB 控制台](https://console.aws.amazon.com/)、[CLI](AccessingDynamoDB.md#Tools.CLI)、[CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) 或 [DynamoDB API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html) 请求表导入。

如果要使用 AWS CLI，必须先对其进行配置。有关更多信息，请参阅 [访问 DynamoDB](AccessingDynamoDB.md)。

**注意**  
“导入表”功能与多个不同的 AWS 服务（例如 Amazon S3 和 CloudWatch）交互。在开始导入之前，请确保调用导入 API 的用户或角色有权访问该功能所依赖的所有服务和资源。
 不要在导入过程中修改 Amazon S3 对象，否则可能会导致操作失败或被取消。
有关错误和故障排除的更多信息，请参阅 [导入格式配额和验证](S3DataImport.Validation.md)

**Topics**
+ [设置 IAM 权限](#DataImport.Requesting.Permissions)
+ [请求使用 AWS 管理控制台 导入](#S3DataImport.Requesting.Console)
+ [在 AWS 管理控制台 中获取以前导入的详细信息](#S3DataImport.Requesting.Console.Details)
+ [请求使用 AWS CLI 导入](#S3DataImport.Requesting.CLI)
+ [在 AWS CLI 中获取以前导入的详细信息](#S3DataImport.Requesting.CLI.Details)

## 设置 IAM 权限
<a name="DataImport.Requesting.Permissions"></a>

可以从您具有读取权限的任何 Amazon S3 存储桶导入数据。源存储桶无需与源表位于同一区域或具有同一所有者。您的 AWS Identity and Access Management (IAM) 必须包含对源 Amazon S3 存储桶的相关操作，以及提供调试信息所需的 CloudWatch 权限。下面显示了一个示例策略。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowDynamoDBImportAction",
      "Effect": "Allow",
      "Action": [
        "dynamodb:ImportTable",
        "dynamodb:DescribeImport"
      ],
      "Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/my-table*"
    },
    {
      "Sid": "AllowS3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket/*",
        "arn:aws:s3:::your-bucket"
      ]
    },
    {
      "Sid": "AllowCloudwatchAccess",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams",
        "logs:PutLogEvents",
        "logs:PutRetentionPolicy"
      ],
      "Resource": "arn:aws:logs:us-east-1:111122223333:log-group/aws-dynamodb/*"
    },
    {
      "Sid": "AllowDynamoDBListImports",
      "Effect": "Allow",
      "Action": "dynamodb:ListImports",
      "Resource": "*"
    }
  ]
}
```

------

### Amazon S3 权限
<a name="DataImport.Requesting.Permissions.s3"></a>

在另一个账户拥有的 Amazon S3 存储桶源上开始导入时，请确保该角色或用户有权访问 Amazon S3 对象。您可以通过执行 Amazon S3 `GetObject` 命令并使用凭据进行检查。使用 API 时，Amazon S3 存储桶拥有者参数默认为当前用户的账户 ID。对于跨账户导入，请确保使用存储桶拥有者的账户 ID 正确填充此参数。下面的代码是源账户中的示例 Amazon S3 存储桶策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {"Sid": "ExampleStatement",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

------

### AWS Key Management Service
<a name="DataImport.Requesting.Permissions.kms"></a>

创建用于导入的新表时，如果您选择的静态加密密钥不是由 DynamoDB 拥有，则必须提供相应的 AWS KMS 权限，这些权限是操作使用客户自主管理型密钥加密的 DynamoDB 表所需要的。有关更多信息，请参阅[授权使用 AWS KMS 密钥](encryption.usagenotes.html#dynamodb-kms-authz)。如果 Amazon S3 对象使用服务器端加密 KMS（SSE-KMS）进行加密，请确保启动导入的角色或用户有权使用 AWS KMS 密钥进行解密。此功能不支持使用客户提供的加密密钥（SSE-C）加密的 Amazon S3 对象。

### CloudWatch 权限
<a name="DataImport.Requesting.Permissions.cw"></a>

启动导入的角色或用户针对与导入关联的日志组和日志流，将需要具有创建和管理权限。

## 请求使用 AWS 管理控制台 导入
<a name="S3DataImport.Requesting.Console"></a>

以下示例演示如何使用 DynamoDB 控制台将现有数据导入名为 `MusicCollection` 的新表中。

**请求表导入**

1. 登录 AWS 管理控制台，并打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 在控制台左侧的导航窗格中，选择 **Import from S3**（从 S3 导入）。

1. 在显示的页面上选择 **Import from S3**（从 S3 导入）。

1. 选择 **Import from S3**（从 S3 导入）。

1. 在**源 S3 URL** 中，输入 Amazon S3 源 URL。

   如果您拥有源存储桶，请选择**浏览 S3** 来搜索该存储桶。或者，按以下格式输入存储桶的 URL：`s3://bucket/prefix`。`prefix` 是 Amazon S3 键前缀。它既可以是您要导入的 Amazon S3 对象名称，也可以是由您要导入的所有 Amazon S3 对象共享的键前缀。
**注意**  
您不能使用与 DynamoDB 导出请求相同的前缀。导出功能为所有导出创建文件夹结构和清单文件。如果您使用相同的 Amazon S3 路径，则会导致错误。  
相反，您应将导入指向包含来自该特定导出的数据的文件夹。在这种情况下，正确路径的格式将是 `s3://bucket/prefix/AWSDynamoDB/<XXXXXXXX-XXXXXX>/data/`，其中 `XXXXXXXX-XXXXXX` 是导出 ID。您可以在导出 ARN 中找到导出 ID，该 ARN 的格式如下：`arn:aws:dynamodb:<Region>:<AccountID>:table/<TableName>/export/<XXXXXXXX-XXXXXX>`。例如 `arn:aws:dynamodb:us-east-1:123456789012:table/ProductCatalog/export/01234567890123-a1b2c3d4`。

1. 指定您是否是 **S3 存储桶拥有者**。如果源存储桶由其他账户拥有，请选择**一个不同的 AWS 账户**。然后输入存储桶拥有者的账户 ID。

1. 在**导入文件压缩**下，相应选择**不压缩**、**GZIP** 或 **ZSTD**。

1. 选择适当的导入文件格式。选项有 **DynamoDB JSON**、**Amazon Ion** 或 **CSV**。如果选择 **CSV**，您将有两个额外的选项：**CSV header**（CSV 标头）和 **CSV delimiter character**（CSV 分隔符）。

   对于 **CSV header**（CSV 标头），选择是从文件的第一行获取标头还是进行自定义。如果选择 **Customize your headers**（自定义标头），可以指定导入时要使用的标头值。此方法指定的 CSV 标头区分大小写，并且应包含目标表的键。

   对于 **CSV delimiter character**（CSV 分隔符），您可以设置用于分隔项目的字符。默认选择的是逗号。如果您选择 **Custom delimiter character**（自定义分隔符），则分隔符必须与正则表达式模式匹配：`[,;:|\t ]`。

1. 选择 **Next**（下一步）按钮，然后为将创建用于存储数据的新表选择选项。
**注意**  
主键和排序键必须与文件中的属性匹配，否则导入将失败。属性区分大小写。

1. 选择 **Next**（下一步）再次查看您的导入选项，然后单击 **Import**（导入）开始导入任务。您将首先看到您的新表在“Tables”（表）中列出，状态为“Creating”（正在创建）。此时无法访问该表。

1. 导入完成后，状态将显示为“Active”（活动），此时可以开始使用该表。

## 在 AWS 管理控制台 中获取以前导入的详细信息
<a name="S3DataImport.Requesting.Console.Details"></a>

单击导航侧边栏的 **Import from S3**（从 S3 导入），然后选择 **Imports**（导入）选项卡，查找过去运行的导出任务的信息。导入面板包含过去 90 天创建的所有导入的列表。选择“Imports”（导入）选项卡中列出任务的 ARN 将检索该导入的信息，包括您选择的任何高级配置设置。

## 请求使用 AWS CLI 导入
<a name="S3DataImport.Requesting.CLI"></a>

以下示例将 CSV 格式的数据从名为 bucket 且前缀为 prefix 的 S3 存储桶导入到名为 target-table 的新表中。

```
aws dynamodb import-table --s3-bucket-source S3Bucket=bucket,S3KeyPrefix=prefix \ 
            --input-format CSV --table-creation-parameters '{"TableName":"target-table","KeySchema":  \
            [{"AttributeName":"hk","KeyType":"HASH"}],"AttributeDefinitions":[{"AttributeName":"hk","AttributeType":"S"}],"BillingMode":"PAY_PER_REQUEST"}' \ 
            --input-format-options '{"Csv": {"HeaderList": ["hk", "title", "artist", "year_of_release"], "Delimiter": ";"}}'
```

**注意**  
如果选择使用 AWS Key Management Service (AWS KMS) 保护的密钥对导入进行加密，密钥必须与目标 Amazon S3 存储桶位于同一区域。

## 在 AWS CLI 中获取以前导入的详细信息
<a name="S3DataImport.Requesting.CLI.Details"></a>

您可以使用 `list-imports` 命令，查找以前运行的导入任务信息。此命令返回过去 90 天创建的所有导入的列表。请注意，尽管导入任务元数据会在 90 天后过期，列表中不再显示早于该日期的作业，但 DynamoDB 不会删除 Amazon S3 存储桶中的任何对象或导入期间创建的表。

```
aws dynamodb list-imports
```

要检索有关特定导入任务的详细信息（包括任何高级配置设置），请使用 `describe-import` 命令。

```
aws dynamodb describe-import \
    --import-arn arn:aws:dynamodb:us-east-1:123456789012:table/ProductCatalog/exp
```