Amazon EFS 集成 - Amazon Relational Database Service

Amazon EFS 集成

Amazon Elastic File System(Amazon EFS)提供无服务器的完全弹性文件存储,因此,您无需预调配或管理存储容量和性能,即可共享文件数据。使用 Amazon EFS,您可以创建文件系统,然后通过 NFS 版本 4.0 和 4.1(NFSv4)协议将其安装在您的 VPC 中。然后,您可以像任何其他兼容 POSIX 的文件系统一样使用 EFS 文件系统。有关一般信息,请参阅什么是 Amazon Elastic File System?和 AWS 博客将 Amazon RDS for Oracle 与 Amazon EFS 集成

Amazon EFS 集成概述

使用 Amazon EFS,您可以在 RDS for Oracle 数据库实例和 EFS 文件系统之间传输文件。例如,您可以使用 EFS 来支持以下使用案例:

  • 在应用程序和多个数据库服务器之间共享文件系统。

  • 为与迁移相关的文件(包括可传输的表空间数据文件)创建共享目录。有关更多信息,请参阅使用 Oracle 可传输表空间进行迁移

  • 存储和共享存档的重做日志文件,无需在服务器上分配额外的存储空间。

  • 使用 Oracle 数据库实用程序(例如 UTL_FILE)读取和写入文件。

Amazon EFS 集成的优势

当您选择 EFS 文件系统而不是替代的数据传输解决方案时,您将获得以下优势:

  • 您可以在 Amazon EFS 和 RDS for Oracle 数据库实例之间传输 Oracle Data Pump 文件。您无需在本地复制这些文件,因为 Data Pump 直接从 EFS 文件系统导入。有关更多信息,请参阅将数据导入到 Amazon RDS 上的 Oracle

  • 数据迁移比使用数据库链接更快。

  • 避免在 RDS for Oracle 数据库实例上分配存储空间来存放文件。

  • EFS 文件系统可以自动扩展存储,无需您进行预调配。

  • Amazon EFS 集成没有最低费用或设置成本。您仅需按实际用量付费。

Amazon EFS 集成的要求

确保您满足以下要求:

  • 您的数据库运行数据库版本 19.0.0.0.ru-2022-07.rur-2022-07.r1 或更高版本。

  • 数据库实例和 EFS 文件系统位于同一个 AWS 区域和同一个 VPC 中。

  • 您的 VPC 已启用 enableDnsSupport 属性。有关更多信息,请参阅《Amazon Virtual Private Cloud 用户指南》中的 VPC 中的 DNS 属性

  • EFS 文件系统使用 Standard 或 Standard-IA 存储类。

  • 要能够在 mount 命令中使用 DNS 名称,必须满足以下条件:

    • 连接的数据库实例在 VPC 内,并且配置为使用 Amazon 提供的 DNS 服务器。不支持自定义 DNS 服务器。

    • 连接的实例的 VPC 必须同时启用了 DNS 解析DNS 主机名

    • 连接的实例必须位于与 EFS 文件系统相同的 VPC 内。

  • 您可以使用非 RDS 解决方案来备份 EFS 文件系统。RDS for Oracle 不支持 EFS 文件系统的自动备份或手动数据库快照。有关更多信息,请参阅备份您的 Amazon EFS 文件系统

为 RDS for Oracle 与 Amazon EFS 集成配置网络权限

要让 RDS for Oracle 与 Amazon EFS 集成,请确保您的数据库实例具有网络访问权限,可访问 EFS 文件系统。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的 控制 NFS 客户端对 Amazon EFS 文件系统的网络访问权限

使用安全组控制网络访问权限

您可以使用 VPC 安全组等网络层安全机制控制数据库实例对 EFS 文件系统的访问权限。要允许访问数据库实例的 EFS 文件系统,请确保您的 EFS 文件系统满足以下要求:

  • EFS 挂载目标存在于 RDS for Oracle 数据库实例使用的每个可用区中。

    EFS 挂载目标提供您可以在其中挂载 EFS 文件系统的 NFSv4 端点的 IP 地址。您使用其 DNS 名称挂载文件系统,该名称将解析为数据库实例的可用区使用的 EFS 挂载目标的 IP 地址。

    您可以将不同可用区中的数据库实例配置为使用相同的 EFS 文件系统。对于多可用区,部署中的每个可用区都需要一个挂载点。您可能需要将数据库实例移到其他可用区。出于这些原因,我们建议您在 VPC 的每个可用区中创建一个 EFS 挂载点。默认情况下,当您使用控制台创建新的 EFS 文件系统时,RDS 会为所有可用区创建挂载目标。

  • 安全组已连接到挂载目标。

  • 安全组有一条入站规则,允许在 TCP/2049(类型 NFS)上使用 RDS for Oracle 数据库实例的网络子网或安全组。

有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的创建 Amazon EFS 文件系统创建和管理 EFS 挂载目标和安全组

使用文件系统策略控制网络访问权限

Amazon EFS 与 RDS for Oracle 的集成使用默认(空)EFS 文件系统策略。默认策略不使用 IAM 进行身份验证。相反,它向可以使用挂载目标连接到文件系统的任何匿名客户端授予完全访问权限。当用户配置的文件系统策略不生效时(包括在创建文件系统时),默认策略将生效。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的默认 EFS 文件系统策略

要增强所有客户端(包括 RDS for Oracle)的 EFS 文件系统的访问权限,您可以配置 IAM 权限。使用这种方法,您可以创建文件系统策略。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的创建文件系统策略

为 RDS for Oracle 与 Amazon EFS 集成配置 IAM 权限

默认情况下,Amazon EFS 集成功能不使用 IAM 角色:USE_IAM_ROLE 选项设置为 FALSE。要将 RDS for Oracle 与 Amazon EFS 和 IAM 角色集成,您的数据库实例必须具有可以访问 Amazon EFS 文件系统的 IAM 权限。

步骤 1:为您的数据库实例创建 IAM 角色并附加策略

在此步骤中,您将为 RDS for Oracle 数据库实例创建一个角色,以允许 Amazon RDS 访问您的 EFS 文件系统。

创建 IAM 角色以允许 Amazon RDS 访问 EFS 文件系统
  1. 打开 IAM 管理控制台

  2. 在导航窗格中,选择角色

  3. 选择 Create role(创建角色)。

  4. 对于 AWS service (亚马逊云科技服务),选择 RDS

  5. 对于 Select your use case (选择您的用例),选择 RDS – Add Role to Database (RDS - 将角色添加到数据库)

  6. 选择下一步

  7. 不要添加任何权限策略。选择下一步

  8. Role name (角色名称) 设置为您的 IAM 角色的名称,例如,rds-efs-integration-role。您也可以添加可选的描述值。

  9. 选择 Create role(创建角色)。

要限制服务对特定资源的权限,我们建议在基于资源的信任关系中使用 aws:SourceArnaws:SourceAccount 全局条件上下文键。这是防范混淆代理问题最有效的方法。

您可以使用这两个全局条件上下文键并让 aws:SourceArn 值包含账户 ID。在这种情况下,当 aws:SourceAccount 值和 aws:SourceArn 值中的账户使用相同策略语句时,确保二者使用相同的账户 ID。

  • 如果您想对单个资源进行跨服务访问,请使用 aws:SourceArn

  • 如果您想允许该账户中的任何资源与跨服务使用操作相关联,请使用 aws:SourceAccount

在信任关系中,请务必使用 aws:SourceArn 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。

以下 AWS CLI 命令会创建名为 rds-efs-integration-role 的角色来实现此目的。

对于 Linux、macOS 或 Unix:

aws iam create-role \ --role-name rds-efs-integration-role \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": my_account_ID, "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname" } } } ] }'

对于 Windows:

aws iam create-role ^ --role-name rds-efs-integration-role ^ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": my_account_ID, "aws:SourceArn": "arn:aws:rds:Region:my_account_ID:db:dbname" } } } ] }'

有关更多信息,请参阅《IAM 用户指南》中的创建向 IAM 用户委派权限的角色

步骤 2:为您的 Amazon EFS 文件系统创建文件系统策略

在此步骤中,您将为 EFS 文件系统创建文件系统策略。

创建或编辑 EFS 文件系统策略
  1. 打开 EFS 管理控制台

  2. 选择 File Systems (文件系统)

  3. File systems(文件系统)页面上,选择要为其编辑或创建文件系统策略的文件系统。将显示该文件系统的详细信息页面。

  4. 选择 File system policy(文件系统策略)选项卡。

    如果策略为空,则使用默认 EFS 文件系统策略。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的默认 EFS 文件系统策略

  5. 选择编辑。此时将显示 File system policy (文件系统策略) 页面。

  6. Policy editor(策略编辑器)中,输入如下所示的策略,然后选择 Save(保存)。

    { "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "ExampleStatement01", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/rds-efs-integration-role" }, "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientWrite", "elasticfilesystem:ClientRootAccess" ], "Resource": "arn:aws:elasticfilesystem:us-east-1:123456789012:file-system/fs-1234567890abcdef0" } ] }

步骤 3:将您的 IAM 角色与 RDS for Oracle 数据库实例关联

在此步骤中,您将您的 IAM 角色与数据库实例关联。请注意以下要求:

  • 您必须具有访问 IAM 角色的权限,并向此角色附加所需的 Amazon EFS 权限策略。

  • 您一次只能将一个 IAM 角色与 RDS for Oracle 数据库实例关联。

  • 实例的状态必须为 Available(可用)。

有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的 Amazon EFS 的身份和访问权限管理

将您的 IAM 角色与 RDS for Oracle 数据库实例关联
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 选择数据库

  3. 如果数据库实例不可用,请选择 Actions (操作),然后选择 Start (启动)。当实例状态显示 Started (已启动) 时,请转至下一步。

  4. 选择 Oracle 数据库实例名称以显示其详细信息。

  5. Connectivity & security(连接性和安全性)选项卡上,向下滚动到页面底部的 Manage IAM roles(管理 IAM 角色)部分。

  6. 选择要添加到 Add IAM roles to this instance(将 IAM 角色添加到此实例)部分的角色。

  7. 对于 Feature(特征),选择 EFS_INTEGRATION

  8. 选择 Add role (添加角色)

以下 AWS CLI 命令将角色添加到名为 mydbinstance 的 Oracle 数据库实例。

对于 Linux、macOS 或 Unix:

aws rds add-role-to-db-instance \ --db-instance-identifier mydbinstance \ --feature-name EFS_INTEGRATION \ --role-arn your-role-arn

对于 Windows:

aws rds add-role-to-db-instance ^ --db-instance-identifier mydbinstance ^ --feature-name EFS_INTEGRATION ^ --role-arn your-role-arn

your-role-arn 替换为您在上一步中记下的角色 ARN。必须为 EFS_INTEGRATION 选项指定 --feature-name

添加 EFS_INTEGRATION 选项

要将 Amazon RDS for Oracle 与 Amazon EFS 集成,您的数据库实例必须与包括 EFS_INTEGRATION 选项的选项组关联。

属于同一选项组的多个 Oracle 数据库实例共享相同的 EFS 文件系统。不同的数据库实例可以访问相同的数据,但可以通过使用不同的 Oracle 目录来划分访问权限。有关更多信息,请参阅在 RDS for Oracle 和 Amazon EFS 文件系统之间传输文件

为 Amazon EFS 集成配置选项组
  1. 创建新选项组或识别现有选项组,然后您可以将 EFS_INTEGRATION 选项添加到其中。

    有关创建选项组的信息,请参阅 创建选项组

  2. EFS_INTEGRATION 选项添加到该选项组。您需要指定 EFS_ID 文件系统 ID 并设置 USE_IAM_ROLE 标志。

    有关更多信息,请参阅将选项添加到选项组

  3. 通过以下任一方式将选项组与数据库实例关联:

为 EFS 集成配置选项组
  1. 创建新选项组或识别现有选项组,然后您可以将 EFS_INTEGRATION 选项添加到其中。

    有关创建选项组的信息,请参阅 创建选项组

  2. EFS_INTEGRATION 选项添加到该选项组。

    例如,以下 AWS CLI 命令将 EFS_INTEGRATION 选项添加到名为 myoptiongroup 的选项组。

    对于 Linux、macOS 或 Unix:

    aws rds add-option-to-option-group \ --option-group-name myoptiongroup \ --options "OptionName=EFS_INTEGRATION,OptionSettings=\ [{Name=EFS_ID,Value=fs-1234567890abcdef0},{Name=USE_IAM_ROLE,Value=TRUE}]"

    对于 Windows:

    aws rds add-option-to-option-group ^ --option-group-name myoptiongroup ^ --options "OptionName=EFS_INTEGRATION,OptionSettings=^ [{Name=EFS_ID,Value=fs-1234567890abcdef0},{Name=USE_IAM_ROLE,Value=TRUE}]"
  3. 通过以下任一方式将选项组与数据库实例关联:

配置 Amazon EFS 文件系统权限

默认情况下,对于新创建的 EFS 文件系统,只有根用户(UID 0)具有读取、写入和执行权限。为了让其他用户也能修改文件系统,根用户必须明确授予他们访问权限。RDS for Oracle 数据库实例的用户属于 others 类别。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的在网络文件系统(NFS)级别处理用户、组和权限

要允许您的 RDS for Oracle 数据库实例在 EFS 文件系统上读取和写入文件,请执行以下操作:

  • 在您的 Amazon EC2 或本地实例上本地挂载 EFS 文件系统。

  • 配置精细权限。

例如,要授予 other 用户写入 EFS 文件系统根目录的权限,请在此目录上运行 chmod 777。有关更多信息,请参阅《Amazon Elastic File System 用户指南》中的示例 Amazon EFS 文件系统使用案例和权限

在 RDS for Oracle 和 Amazon EFS 文件系统之间传输文件

要在 RDS for Oracle 实例和 Amazon EFS 文件系统之间传输文件,请至少创建一个 Oracle 目录并配置 EFS 文件系统权限以控制数据库实例访问权限。

创建 Oracle 目录

要创建 Oracle 目录,请使用过程 rdsadmin.rdsadmin_util.create_directory_efs。 过程具有以下参数。

参数名称 数据类型 默认值 必需 描述

p_directory_name

VARCHAR2

Oracle 目录的名称。

p_path_on_efs

VARCHAR2

EFS 文件系统上的路径。路径名的前缀使用模式 /rdsefs-fsid/,其中 fsid 是 EFS 文件系统 ID 的占位符。

例如,如果您的 EFS 文件系统名为 fs-1234567890abcdef0,并且您在此文件系统上创建了一个名为 mydir 的子目录,则可以指定以下值:

/rdsefs-fs-1234567890abcdef0/mydir

假设您在 EFS 文件系统 fs-1234567890abcdef0 上创建了一个名为 /datapump1 的子目录。以下示例创建一个 Oracle 目录 DATA_PUMP_DIR_EFS,该目录指向 EFS 文件系统上的 /datapump1 目录。p_path_on_efs 参数的文件系统路径值以字符串 /rdsefs- 为前缀。

BEGIN rdsadmin.rdsadmin_util.create_directory_efs( p_directory_name => 'DATA_PUMP_DIR_EFS', p_path_on_efs => '/rdsefs-fs-1234567890abcdef0/datapump1'); END; /

向 EFS 文件系统传输数据和从其中传输数据:示例

以下示例使用 Oracle Data Pump 将名为 MY_TABLE 的表导出到文件 datapump.dmp。此文件位于 EFS 文件系统上。

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'TABLE', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'datapump.dmp', directory => 'DATA_PUMP_DIR_EFS', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'datapump-exp.log', directory => 'DATA_PUMP_DIR_EFS', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN (''MY_TABLE'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

以下示例使用 Oracle Data Pump 从文件 datapump.dmp 中导出名为 MY_TABLE 的表。此文件位于 EFS 文件系统上。

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'TABLE', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'datapump.dmp', directory => 'DATA_PUMP_DIR_EFS', filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'datapump-imp.log', directory => 'DATA_PUMP_DIR_EFS', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'NAME_EXPR','IN (''MY_TABLE'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

有关更多信息,请参阅将数据导入到 Amazon RDS 上的 Oracle

删除 EFS_INTEGRATION 选项

要从 RDS for Oracle 数据库实例中删除 EFS_INTEGRATION 选项,请执行下列操作之一:

  • 要从多个数据库实例中删除 EFS_INTEGRATION 选项,请从数据库实例所属的选项组中删除 EFS_INTEGRATION 选项。此更改会影响使用该选项组的所有数据库实例。有关更多信息,请参阅从选项组中删除选项

  • 要从单个数据库实例中删除 EFS_INTEGRATION 选项,请修改该实例,并指定不包含 EFS_INTEGRATION 选项的另一个选项组。您可以指定默认(空)选项组,或指定其他自定义选项组。有关更多信息,请参阅修改 Amazon RDS 数据库实例

Amazon EFS 集成问题排查

您的 RDS for Oracle 数据库实例监控与 Amazon EFS 文件系统的连接。当监控检测到问题时,它可能会尝试更正问题并在 RDS 控制台中发布事件。有关更多信息,请参阅查看 Amazon RDS 事件

使用本部分中的信息帮助您诊断和修复在使用 Amazon EFS 集成时的常见问题。

Notification 描述 操作

The EFS for RDS Oracle instance instance_name isn't available on the primary host. NFS port 2049 of your EFS isn't reachable.

数据库实例无法与 EFS 文件系统通信。

请确保满足以下条件:

  • EFS 文件系统存在。

  • 连接到 EFS 挂载目标的安全组具有入站规则,以允许在 TCP/2049(类型 NFS)上使用 RDS for Oracle 数据库实例的安全组或网络子网。

The EFS isn't reachable.

安装 EFS_INTEGRATION 选项时出错。

请确保满足以下条件:

  • EFS 文件系统存在。

  • 连接到 EFS 挂载目标的安全组具有入站规则,以允许在 TCP/2049(类型 NFS)上使用 RDS for Oracle 数据库实例的安全组或网络子网。

  • 对您的 VPC 开启 enableDnsSupport 属性。

  • 您正在您的 VPC 中使用 Amazon 提供的 DNS 服务器。Amazon EFS 集成不适用于自定义 DHCP DNS。

The associated role with your DB instance wasn't found.

安装 EFS_INTEGRATION 选项时出错。

确保您已将 IAM 角色与 RDS for Oracle 数据库实例关联。

The associated role with your DB instance wasn't found.

安装 EFS_INTEGRATION 选项时出错。RDS for Oracle 已从数据库快照中还原,USE_IAM_ROLE 选项设置为 TRUE

确保您已将 IAM 角色与 RDS for Oracle 数据库实例关联。

The associated role with your DB instance wasn't found.

安装 EFS_INTEGRATION 选项时出错。RDS for Oracle 是根据一个多合一的 CloudFormation 模板创建的,其 USE_IAM_ROLE 选项设置为 TRUE

作为解决方法,请完成以下步骤:

  1. 使用 IAM 角色和默认选项组创建数据库实例。

  2. 在后续的堆栈更新中,请添加带有 EFS_INTEGRATION 选项的自定义选项组。

PLS-00302: component 'CREATE_DIRECTORY_EFS' must be declared

当您使用不支持 Amazon EFS 的 RDS for Oracle 版本时,可能会发生此错误。

确保您使用的是 RDS for Oracle 数据库实例版本 19.0.0.0.ru-2022-07.rur-2022-07.r1 或更高版本。

Read access of your EFS is denied. Check your file system policy.

您的数据库实例无法读取 EFS 文件系统。

确保您的 EFS 文件系统允许通过 IAM 角色或在 EFS 文件系统级别进行读取访问。

不适用

您的数据库实例无法写入 EFS 文件系统。

执行以下步骤:

  1. 确保您的 EFS 文件系统挂载在 Amazon EC2 实例上。

  2. 向您的 RDS 用户授予 others 组写入权限。最简单的方法是在 EFS 文件系统的顶部目录上运行 chmod 777 命令。

host -s 命令将返回 hostname not found: 3(NXDOMAIN)

您正在使用自定义 DNS 服务器。

要能够在 mount 命令中使用 DNS 名称,必须满足以下条件:

  • 连接的数据库实例在 VPC 内,并且配置为使用 Amazon 提供的 DNS 服务器。不支持自定义 DNS 服务器。

  • 连接的实例的 VPC 必须同时启用了 DNS 解析DNS 主机名

  • 连接的实例必须位于与 EFS 文件系统相同的 VPC 内。