将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成
您可以在运行 Amazon RDS for SQL Server 的数据库实例和 Amazon S3 存储桶之间传输文件。通过执行此操作,您可以结合使用 Amazon S3 和 SQL Server 功能,例如批量插入。例如,您可以将 .csv、.xml、.txt 和其他文件从 Amazon S3 下载到数据库实例主机,并将数据从 D:\S3\
导入到数据库中。所有文件都存储在数据库实例上的 D:\S3\
中。
适用以下限制:
-
在多可用区实例上进行故障转移后,将在备用副本上删除
D:\S3
文件夹中的文件。有关更多信息,请参阅“S3 集成的多可用区限制”。 -
数据库实例和 S3 存储桶必须位于同一 AWS 区域。
-
如果您一次运行多个 S3 集成任务,则这些任务将按顺序运行,而不是并行运行。
注意
S3 集成任务与本机备份和还原任务共享相同的队列。在此队列中,任何时候最多只能有两个正在进行的任务。因此,两个正在运行的本机备份和还原任务将阻止所有 S3 集成任务。
-
您必须在已还原的实例上重新启用 S3 集成功能。S3 集成不会从源实例传播到已还原的实例。
D:\S3
中的文件在还原的实例上被删除。 -
下载到数据库实例的文件数不能超过 100 个。换句话说,
D:\S3\
中的文件数不能超过 100 个。 仅支持下载无文件扩展名或具有以下文件扩展名的文件:.abf、.asdatabase、.bcp、configsettings、.csv、.dat、.deploymentoptions、.deploymenttargets、.fmt、.info、.ispac、.lst、.tbl、.txt、.xml 和 .xmla。
-
S3 存储桶必须与相关 AWS Identity and Access Management (IAM) 角色具有同一所有者。因此,不支持跨账户 S3 集成。
-
S3 存储桶不能向公众开放。
-
从 RDS 上传到 S3 的文件大小限制为每个文件 50 GB。
-
从 S3 下载到 RDS 的文件大小限制为 S3 支持的最大文件大小。
主题
有关使用 Amazon S3 中的文件的更多信息,请参阅 Amazon Simple Storage Service 入门。
将 RDS for SQL Server 与 S3 集成的先决条件
在开始之前,请找到或创建要使用的 S3 存储桶。另外,添加权限,以便 RDS 数据库实例可以访问 S3 存储桶。要配置此访问权限,请同时创建 IAM 策略和 IAM 角色。
创建用于访问 Amazon S3 的 IAM 策略
-
在 IAM 管理控制台
中,选择导航窗格中的策略。 -
创建新策略,并使用 Visual editor (可视化编辑器) 选项卡执行以下步骤。
-
对于 Service (服务),输入
S3
,然后选择 S3 服务。 -
对于操作,选择以下各项以授予数据库实例所需的访问权限:
-
ListAllMyBuckets
– 必需 -
ListBucket
– 必需 -
GetBucketACL
– 必需 -
GetBucketLocation
– 必需 -
GetObject
– 将文件从 S3 下载到 所必需D:\S3\
-
PutObject
– 将文件从D:\S3\
上传到 S3 所必需 -
ListMultipartUploadParts
– 将文件从D:\S3\
上传到 S3 所必需 -
AbortMultipartUpload
– 将文件从D:\S3\
上传到 S3 所必需
-
-
对于 Resources (资源),显示的选项取决于您在上一步中选择的操作。您可能会看到针对 bucket (存储桶) 和/或 object (对象) 的选项。对于其中的每一个,添加适当的 Amazon Resource Name (ARN)。
对于 bucket (存储桶),为要使用的存储桶添加 ARN。例如,如果您的存储桶名为
example-bucket
,请将 ARN 设置为arn:aws:s3:::example-bucket
。对于 object (对象),为存储桶输入 ARN,然后选择以下各项之一:
-
要授予对指定存储桶中所有文件的访问权限,请为 Bucket name (存储桶名称) 和 Object name (对象名称) 选择 Any (任何)。
-
要授予对存储桶中特定文件或文件夹的访问权限,请提供您希望 SQL Server 访问的特定存储桶和对象的 ARN。
-
-
按照控制台中的说明进行操作,直到您完成策略创建。
前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明,请参阅 IAM 用户指南中的 创建 IAM 策略。
创建使用上一过程中的 IAM 策略的 IAM 角色
要授予 Amazon RDS 对 Amazon S3 存储桶的访问权限,请使用以下过程:
-
创建向 Amazon RDS 授予对 S3 存储桶的访问权限的 IAM 策略。
-
创建一个让 Amazon RDS 可代表您访问 S3 存储桶的 IAM 角色。
有关更多信息,请参阅 IAM 用户指南中的创建向 IAM 用户委派权限的角色。
-
将您创建的 IAM 策略附加到您创建的 IAM 角色。
创建 IAM policy
包括适当的操作以授予数据库实例所需的访问权限:
-
ListAllMyBuckets
– 必需 -
ListBucket
– 必需 -
GetBucketACL
– 必需 -
GetBucketLocation
– 必需 -
GetObject
– 将文件从 S3 下载到 所必需D:\S3\
-
PutObject
– 将文件从D:\S3\
上传到 S3 所必需 -
ListMultipartUploadParts
– 将文件从D:\S3\
上传到 S3 所必需 -
AbortMultipartUpload
– 将文件从D:\S3\
上传到 S3 所必需
-
以下 AWS CLI 命令使用这些选项创建一个名为
rds-s3-integration-policy
的 IAM 策略。它授予访问名为bucket_name
的存储桶的权限。对于 Linux、macOS 或 Unix:
aws iam create-policy \ --policy-name
rds-s3-integration-policy
\ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketACL", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::bucket_name
" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::bucket_name
/key_prefix
/*" } ] }'对于 Windows:
确保将行尾更改为您的界面支持的行尾(
^
而不是\
)。另外,在 Windows 中,您必须使用\
来转义所有双引号。为了避免需要转义 JSON 中的引号,您可以将其保存到文件中并将该文件作为参数传入。首先,创建包含以下权限策略的
policy.json
文件:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketACL", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::
bucket_name
" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::bucket_name
/key_prefix
/*" } ] }然后使用以下命令创建策略:
aws iam create-policy ^ --policy-name
rds-s3-integration-policy
^ --policy-document file://file_path
/assume_role_policy.json -
创建策略之后,请记下策略的 Amazon Resource Name (ARN)。后续步骤需要该 ARN。
创建 IAM 角色
-
以下 AWS CLI 命令创建
rds-s3-integration-role
IAM 角色来实现此目的。对于 Linux、macOS 或 Unix:
aws iam create-role \ --role-name
rds-s3-integration-role
\ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'对于 Windows:
确保将行尾更改为您的界面支持的行尾(
^
而不是\
)。另外,在 Windows 中,您必须使用\
来转义所有双引号。为了避免需要转义 JSON 中的引号,您可以将其保存到文件中并将该文件作为参数传入。首先,创建包含以下策略的
assume_role_policy.json
文件:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "rds.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
然后使用以下命令创建 IAM 角色:
aws iam create-role ^ --role-name
rds-s3-integration-role
^ --assume-role-policy-document file://file_path
/assume_role_policy.json例 使用全局条件上下文键创建 IAM 角色
我们建议在基于资源的策略中使用
aws:SourceArn
和aws:SourceAccount
全局条件上下文键,以此限制服务对特定资源的权限。这是防范混淆代理问题最有效的方法。您可以使用这两个全局条件上下文键并让
aws:SourceArn
值包含账户 ID。在这种情况下,当aws:SourceAccount
值和aws:SourceArn
值中的账户使用相同策略语句时,确保二者使用相同的账户 ID。-
如果您想对单个资源进行跨服务访问,请使用
aws:SourceArn
。 -
如果您想允许该账户中的任何资源与跨服务使用操作相关联,请使用
aws:SourceAccount
。
在此策略中,请务必使用
aws:SourceArn
全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 S3 集成,请确保包含数据库实例 ARN,如以下示例所示。对于 Linux、macOS 或 Unix:
aws iam create-role \ --role-name
rds-s3-integration-role
\ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceArn":"arn:aws:rds:Region
:my_account_ID
:db:db_instance_identifier
" } } } ] }'对于 Windows:
将全局条件上下文键添加至
assume_role_policy.json
。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "rds.amazonaws.com" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceArn":"arn:aws:rds:
Region
:my_account_ID
:db:db_instance_identifier
" } } } ] } -
将 IAM 策略附加到 IAM 角色
-
以下 AWS CLI 命令将策略附加到名为
rds-s3-integration-role
的角色。将
替换为您在上一步中记下的策略 ARN。your-policy-arn
对于 Linux、macOS 或 Unix:
aws iam attach-role-policy \ --policy-arn
your-policy-arn
\ --role-namerds-s3-integration-role
对于 Windows:
aws iam attach-role-policy ^ --policy-arn
your-policy-arn
^ --role-namerds-s3-integration-role
启用 RDS for SQL Server 与 S3 的集成
在以下部分中,您可以找到如何启用 Amazon S3 与 Amazon RDS for SQL Server 的集成。要使用 S3 集成,您的数据库实例必须与您先前创建的 IAM 角色相关联,然后才能使用 S3_INTEGRATION
feature-name 参数。
注意
要将 IAM 角色添加到数据库实例,数据库实例的状态必须为 available。
将您的 IAM 角色与数据库实例关联
登录AWS Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
选择 RDS for SQL Server 数据库实例名称以显示其详细信息。
-
在 Connectivity & security (连接性和安全性) 选项卡上的 Manage IAM roles (管理 IAM 角色) 部分中,为 Add IAM roles to this instance (向此实例添加 IAM 角色) 选择要添加的 IAM 角色。
-
对于 Feature (功能),选择 S3_INTEGRATION。
-
选择 Add role (添加角色)。
将 IAM 角色添加到 RDS for SQL Server 数据库实例
-
以下 AWS CLI 命令将您的 IAM 角色添加到名为
的 RDS for SQL Server 数据库实例中。mydbinstance
例
对于 Linux、macOS 或 Unix:
aws rds add-role-to-db-instance \ --db-instance-identifier
mydbinstance
\ --feature-name S3_INTEGRATION \ --role-arnyour-role-arn
对于 Windows:
aws rds add-role-to-db-instance ^ --db-instance-identifier
mydbinstance
^ --feature-name S3_INTEGRATION ^ --role-arnyour-role-arn
将
替换为您在上一步中记下的角色 ARN。必须为your-role-arn
S3_INTEGRATION
选项指定--feature-name
。
在 RDS for SQL Server 和 Amazon S3 之间传输文件
您可以使用 Amazon RDS 存储过程在 Amazon S3 和 RDS 数据库实例之间下载和上传文件。您还可以使用 Amazon RDS 存储过程来列出和删除 RDS 实例上的文件。
您从 S3 下载和上传到 S3 的文件存储在 D:\S3
文件夹中。这是可用于访问文件的唯一文件夹。您可以将文件组织到子文件夹中,这些子文件夹是您在下载过程中包含目标文件夹时为您创建的。
某些存储过程要求您向 &S3 存储桶和文件提供 Amazon Resource Name (ARN)。您的 ARN 的格式为 arn:aws:s3:::bucket_name/file_name
。Amazon S3 不需要在 ARN 中使用账号或AWS区域。
S3 集成任务按顺序运行,并且与本机备份和还原任务共用同一队列。在此队列中,任何时候最多只能有两个正在进行的任务。任务可能需要长达五分钟时间才能开始处理。
将文件从 Amazon S3 存储桶下载到 SQL Server 数据库实例
要将文件从 S3 存储桶下载到 RDS for SQL Server 数据库实例,请使用具有以下参数的 Amazon RDS 存储过程 msdb.dbo.rds_download_from_s3
。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
NVARCHAR |
– |
必需 |
要下载的文件的 S3 ARN,例如: |
|
NVARCHAR |
– |
可选 |
RDS 实例的文件路径。如果未指定,则文件路径为 |
|
INT |
0 |
可选 |
覆盖现有文件: 0 = 不覆盖 1 = 覆盖 |
您可以下载不带文件扩展名的文件和具有以下文件扩展名的文件:.bcp、.csv、.dat、.fmt、.info、.lst、.tbl、.txt 和 .xml。
注意
启用 SQL Server Integration Services 时,支持下载具有 .ispac 文件扩展名的文件。有关启用 SSIS 的更多信息,请参阅SQL Server Integration Services。
启用 SQL Server Analysis Services 时,支持下载具有以下文件扩展名的文件:.abf、.asdatabase、.configsettings、.deploymentoptions、.deploymenttargets 和 .xmla。有关启用 SSAS 的更多信息,请参阅SQL Server Analysis Services。
以下示例显示了从 S3 下载文件的存储过程。
exec msdb.dbo.rds_download_from_s3 @s3_arn_of_file='arn:aws:s3:::
bucket_name/bulk_data.csv
', @rds_file_path='D:\S3\seed_data\data.csv
', @overwrite_file=1
;
示例 rds_download_from_s3
操作在 seed_data
中创建一个名为 D:\S3\
的文件夹(如果该文件夹尚不存在)。然后,该示例将源文件 bulk_data.csv
从 S3 下载到数据库实例上名为 data.csv
的新文件。如果以前存在此文件,则会覆盖它,因为 @overwrite_file
参数设置为 1
。
将文件从 SQL Server 数据库实例上传到 Amazon S3 存储桶
要将文件从 RDS for SQL Server 数据库实例上传到 S3 存储桶,请使用具有以下参数的 Amazon RDS 存储过程 msdb.dbo.rds_upload_to_s3
。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
NVARCHAR |
– |
必需 |
要在 S3 中创建的文件的 S3 ARN,例如: |
|
NVARCHAR |
– |
必需 |
要上传到 S3 的文件的文件路径。支持绝对路径和相对路径。 |
|
INT |
– |
可选 |
覆盖现有文件: 0 = 不覆盖 1 = 覆盖 |
以下示例将名为 data.csv
的文件从 D:\S3\seed_data\
中的指定位置上传到 ARN 指定的 S3 存储桶中的 new_data.csv
文件。
exec msdb.dbo.rds_upload_to_s3 @rds_file_path='D:\S3\
seed_data\data.csv
', @s3_arn_of_file='arn:aws:s3:::bucket_name/new_data.csv
', @overwrite_file=1
;
如果 S3 中以前存在此文件,则会覆盖它,因为 @overwrite_file 参数设置为 1
。
列出 RDS 数据库实例上的文件
要列出数据库实例上可用的文件,请同时使用存储过程和函数。首先,运行以下存储过程来从 D:\S3\
中的文件收集文件详细信息。
exec msdb.dbo.rds_gather_file_details;
此存储过程返回任务的 ID。像其他任务一样,此存储过程异步运行。一旦任务的状态为 SUCCESS
,您就可以在 rds_fn_list_file_details
函数中使用任务 ID 来列出 D:\S3\ 中的现有文件和目录,如下所示。
SELECT * FROM msdb.dbo.rds_fn_list_file_details(
TASK_ID
);
rds_fn_list_file_details
函数将返回具有以下列的表格。
输出参数 | 描述 |
---|---|
filepath |
文件的绝对路径(例如,D:\S3\mydata.csv ) |
size_in_bytes |
文件大小(以字节为单位) |
last_modified_utc |
上次修改日期和时间(采用 UTC 格式) |
is_directory |
指示项目是否为目录的选项 (true /false ) |
删除 RDS 数据库实例上的文件
要删除数据库实例上可用的文件,请使用具有以下参数的 Amazon RDS 存储过程 msdb.dbo.rds_delete_from_filesystem
。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
NVARCHAR |
– |
必需 |
要删除的文件的文件路径。支持绝对路径和相对路径。 |
|
INT |
0 |
可选 |
要删除目录,必须包含此标志并将其设置为
如果要删除文件,则忽略此参数。 |
要删除目录,@rds_file_path
必须以反斜杠 (\
) 结尾,并且 @force_delete
必须设置为 1
。
以下示例将删除 D:\S3\delete_me.txt
文件。
exec msdb.dbo.rds_delete_from_filesystem @rds_file_path='D:\S3\
delete_me.txt
';
以下示例将删除 D:\S3\example_folder\
目录。
exec msdb.dbo.rds_delete_from_filesystem @rds_file_path='D:\S3\
example_folder
\', @force_delete=1;
监控文件传输任务的状态
要跟踪 S3 集成任务的状态,请调用 rds_fn_task_status
函数。它获取两个参数。第一个参数应该始终为 NULL
,因为它不适用于 S3 集成。第二个参数接受任务 ID。
要查看所有任务的列表,请将第一个参数设置为 NULL
,将第二个参数设置为 0
,如以下示例所示。
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,
0
);
要获取特定任务,请将第一个参数设置为 NULL
,将第二个参数设置为任务 ID,如以下示例所示。
SELECT * FROM msdb.dbo.rds_fn_task_status(NULL,
42
);
rds_fn_task_status
函数将返回以下信息。
输出参数 |
描述 |
---|---|
|
任务的 ID。 |
|
对于 S3 集成,任务可以具有以下任务类型:
|
|
不适用于 S3 集成任务。 |
|
用百分比表示的任务进度。 |
|
在任务上花费的时间 (以分钟为单位)。 |
|
任务的状态。有以下可能状态:
|
|
有关任务的其他信息。如果在处理过程中发生错误,则此列包含有关错误的信息。 |
|
上次更新任务状态的日期和时间。 |
|
任务的创建日期和时间。 |
|
从中下载或上传到其中的 S3 对象的 ARN。 |
|
不适用于 S3 集成任务。 |
|
不适用于 S3 集成任务。 |
|
RDS 数据库实例上的文件路径。 |
|
指示是否覆盖现有文件的选项。 |
|
不适用于 S3 集成任务。 |
取消任务
要取消 S3 集成任务,请使用带有 msdb.dbo.rds_cancel_task
参数的 task_id
存储过程。无法取消正在进行的删除和列出任务。以下示例显示了取消任务的请求。
exec msdb.dbo.rds_cancel_task @task_id = 1234;
要获取所有任务及其任务 ID 的概述,请使用rds_fn_task_status
中介绍的 监控文件传输任务的状态 函数。
S3 集成的多可用区限制
在多可用区实例上,故障转移之后将删除备用副本上 D:\S3
文件夹中的文件。故障转移可以是预先计划的,例如在数据库实例修改(如更改实例类或升级引擎版本)期间。或者,故障转移可能是未计划的,在主实例停机时进行。
注意
我们不建议将 D:\S3
文件夹用于文件存储。最佳做法是将创建的文件上传到 Amazon S3 以使其持久,并在需要导入数据时下载文件。
要确定上次故障转移时间,您可以使用 msdb.dbo.rds_failover_time
存储过程。有关更多信息,请参阅“确定上次故障转移时间”。
例 最近无故障转移示例
此示例显示错误日志中最近没有故障转移的输出。自 2020-04-29 23:59:00.01 以来,没有发生故障转移。
因此,在该时间之后下载的所有文件,如未使用 rds_delete_from_filesystem
存储过程删除,则仍可在当前主机上访问。在该时间之前下载的文件可能也可用。
errorlog_available_from | recent_failover_time |
---|---|
2020-04-29 23:59:00.0100000 |
null |
例 最近故障转移示例
此示例显示错误日志中最近有故障转移的输出。最近一次故障转移的时间是在 2020-05-05 18:57:51.89。
在该时间之后下载的所有文件,如未使用 rds_delete_from_filesystem
存储过程删除,则仍可在当前主机上访问。
errorlog_available_from | recent_failover_time |
---|---|
2020-04-29 23:59:00.0100000 |
2020-05-05 18:57:51.8900000 |
禁用 RDS for SQL Server 与 S3 的集成
在下面,您可以找到如何禁用 Amazon S3 与 Amazon RDS for SQL Server 的集成。禁用 S3 集成时,不会删除 D:\S3\
中的文件。
注意
要从数据库实例中删除 IAM 角色,数据库实例的状态必须为 available
。
从数据库实例中取消关联您的 IAM 角色
-
登录AWS Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
选择 RDS for SQL Server 数据库实例名称以显示其详细信息。
-
在 Connectivity & security (连接性和安全性) 选项卡上的 Manage IAM roles (管理 IAM 角色) 部分中,选择要删除的 IAM 角色。
-
选择 Delete (删除)。
从 RDS for SQL Server 数据库实例中删除 IAM 角色
-
以下 AWS CLI 命令从名为
的 RDS for SQL Server 数据库实例中删除 IAM 角色。mydbinstance
对于 Linux、macOS 或 Unix:
aws rds remove-role-from-db-instance \ --db-instance-identifier
mydbinstance
\ --feature-name S3_INTEGRATION \ --role-arnyour-role-arn
对于 Windows:
aws rds remove-role-from-db-instance ^ --db-instance-identifier
mydbinstance
^ --feature-name S3_INTEGRATION ^ --role-arnyour-role-arn
使用
选项的适当 IAM 角色 ARN 替换your-role-arn
--feature-name
。