跨国云服务总有隐藏差异,中国区Web功能与国际版不同步,配置出错导致导入失败是常见痛点。
S3导入前的权限自查
跨账户导入时最容易卡在权限配置上。源存储桶如果属于另一个AWS账户,你的IAM角色必须包含对S3对象的读取权限,同时还要具备CloudWatch日志的创建和管理能力。2025年有用户因为漏掉存储桶拥有者账户ID参数,导致跨区导入任务卡住三天。建议先用AWS CLI执行aws s3 ls命令测试访问权限,确认能列出对象后再发起导入请求。权限策略要同时覆盖源存储桶和目标表,KMS解密权限也不能少,特别是当S3对象使用SSE-KMS加密时。
{ "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": "*" } ] }
源文件路径的精确填写
{ "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/*" } ] }
导入路径格式必须严格遵循s3://bucket/prefix/object规范,但要注意避开陷阱。如果你之前在该路径运行过导出任务,文件夹下会残留清单文件和元数据,直接指向相同前缀会引发冲突。正确做法是找到导出ID,路径要深入到/AWSDynamoDB/export-ID/data/层级。2024年有电商团队因为路径多了一级文件夹,导致20GB数据导入失败,排查了两天才发现是路径指向了导出任务的根目录而非数据文件夹。
控制台导入的配置细节
在导航窗格点击“从S3导入”后,重点检查三个配置项。文件压缩格式必须与实际匹配,GZIP或ZSTD选错会导致解析错误。CSV标头有两种处理方式:如果文件第一行就是列名,选择“从文件获取”;如果文件无标头,必须自定义标头且区分大小写,名称要与目标表的主键、排序键完全一致。分隔符要符合正则表达式[^,nr]+,逗号是最常用选择。2023年有用户自定义标头时将“UserId”写成“userid”,结果导入任务直接失败。
新表创建与加密配置
选择新表时,主键和排序键必须与导入文件中的数据属性一一对应。如果文件中有三列,表结构只能在这三列中定义键,多一列或少一列都会报错。加密方面,如果你选用了客户自主管理型KMS密钥,必须给IAM角色附加KMS解密权限,否则任务会在“正在创建”状态停留24小时后超时。注意SSE-C加密的对象完全不支持导入,这是AWS官方的硬性限制。
CLI导入的命令实战
使用AWS CLI发起导入比控制台更高效,但参数要精准。一个标准的导入命令会包含--s3-bucket-source指定桶名和前缀,--table-name定义新表,--input-format设为DYNAMODB_JSON或CSV。如果是KMS加密,记得添加--s3-bucket-source S3Bucket=my-bucket,S3KeyPrefix=prefix,S3SseKmsKeyId=key-id参数。2025年有开发者用脚本批量导入200张表,因为漏了KMS密钥ID参数,结果全部导入表处于不可用状态,最后只能删除重跑。
历史导入任务的追溯
不管是控制台还是CLI,都能查看90天内的导入记录。控制台的“导入”选项卡里,点击任务ARN可以展开全部配置信息,包括当时设置的分隔符、标头选项。CLI用aws dynamodb list-imports获取任务列表,再用describe-import查看特定任务详情。但要注意,元数据过期不代表数据丢失,S3桶中的文件和DynamoDB表都会保留。2024年有审计需求要查半年前的导入源,虽然CLI已查不到记录,但通过S3访问日志反推出了当时的文件路径。
你在跨账户导入时遇到过最诡异的权限报错是什么?欢迎在评论区分享避坑经验,点赞收藏本文让更多同事看到这些实操细节。
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": ";"}}'

