使用 亚马逊云科技 Systems Manager 文档在 Amazon RDS 定制版 Oracle 中自动执行任务

Amazon 关系数据库服务 (Amazon RDS) Cu stom 是一项托管数据库服务,适用于需要访问底层操作系统和数据库环境的传统、自定义和打包应用程序。

您可能需要修改 RDS Custom for Oracle 实例的默认配置以满足各种要求,例如启用数据库功能或选项、更改 时区或字符集 等数据库设置 、更改数据库级参数或在操作系统级别进行自定义。您可以通过以下方式进行这些更改:以 root 身份登录到服务器进行操作系统级更改,或者以 sysdba 或 sysdba 身份登录到服务器进行数据库更改。但是,如果您在多个 亚马逊云科技 账户和地区拥有大量 Oracle 数据库,则此解决方案无法扩展,因为您必须在要自定义的每个数据库实例上重复这些任务。要解决这个问题,您可以自动对数据库实例执行自定义。

在这篇文章中,我们将介绍如何使用 亚马逊云科技 Systems Manager 自动化文档在 Amazon RDS Custom for Oracle 中执行数据库实例创建后任务。

解决方案概述

A WS Systems Manager 文档 (SSM 文档)定义了系统管理器对您的托管实例执行的操作。Systems Manager 包含许多预配置的文档,您可以通过在运行时指定参数来使用这些文档,也可以创建自己的文档。SSM 文档可以是命令文档,用于在托管实例上运行命令,也可以是自动化文档,您可以使用它与其他 亚马逊云科技 服务进行交互以执行某些操作。

使用 SSM 文档可以帮助大规模提高运营效率,减少与手动干预相关的错误,并自动执行部署和配置任务。此外,您可以与同一区域内的特定 亚马逊云科技 账户共享 SSM 文档。也可以在运行时对它们进行标记和引用。使用这种方法,您可以优化和扩展跨多个账户的多个 RDS 自定义实例的部署。SSM 文档也可以成为状态管理器中 SSM 关联的一部分。

在这篇文章中,我们演示了两种场景:

  • 创建并运行 SSM 文档,在 RDS Custom for Oracle 数据库实例上进行操作系统级别的更改,并跨账户共享 SSM 文档
  • 创建并运行 SSM 文档,在 RDS 自定义适用于 Oracle 的数据库实例上进行数据库级别的更改

先决条件

要继续阅读这篇文章,您需要两个 RDS Custom for Oracle 数据库实例:一个在 亚马逊云科技 账户 A 中,另一个在账户 B 中。有关说明,请参阅 使用适用于 Oracle 的 RDS 自定义

创建并运行 SSM 文档,以便在 RDS 自定义适用于 Oracle 的数据库实例上进行操作系统级别的更改

为了开始探索我们的第一个用例,我们首先在账户 A 中创建一个 SSM 文档来创建操作系统用户。完成以下步骤:

  1. 在系统管理器控制台上,选择导航窗格 中的 文档
  2. 在 “ 所有文档 ” 选项卡上的 “ 创建文档 ” 菜单上,选择 “ 自动化” 。输入文档的名称(例如,RdsCustom-Add-Os-User)。
  3. 转到编辑器选项卡并输入以下内容以添加名为 testss m 的操作系统用户。

在本文档中,我们通过 API 调用获取实例 ID 和数据库 ID,然后运行 shell 脚本来添加操作系统用户。

description: Create OS User
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
DBInstanceId:
type: String
description: (Required) Identifies the *RDS* instance subject to action
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ''
mainSteps:
- name: GetDBId
action: 'aws:executeAwsApi'
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{DBInstanceId}}'
outputs:
- Name: DbiResourceId
Selector: '$.DBInstances[0].DbiResourceId'
Type: String
- name: GetInstId
action: 'aws:executeAwsApi'
onFailure: Abort
inputs:
Service: ec2
Api: DescribeInstances
Filters:
- Name: 'tag:Name'
Values:
- '{{GetDBId.DbiResourceId}}'
outputs:
- Name: InstanceId
Selector: '$.Reservations[0].Instances[0].InstanceId'
Type: String
- name: AddOSuser
action: 'aws:runCommand'
inputs:
DocumentName: AWS-RunShellScript
InstanceIds:
- '{{GetInstId.InstanceId}}'
Parameters:
commands:
- sudo useradd testssm
- id testssm
- sudo usermod -a -G rdsdb testssm
- id testssm
isEnd: true
  1. 选择 “ 创建自动化” 。

您创建的文档显示在 “ 文档 ” 页面的 “我 所有” 选项卡上。

现在,您可以在 亚马逊云科技 账户 A 中的 RDS 自定义实例上运行 SSM 文档。

  1. 在 “ 文档 ” 页面上,选择要运行的文档,然后选择 “ 执行自动化” 。
  2. 选择 “ 简单执行” 。

如果您想在多个 账户和区域中运行,还可以选择多账户和区域。

  1. 输入参数下 ,输入 dbinStance ID 的值。
  2. 选择 “ 执行” 。

您可以监控运行详细信息以及步骤 ID、编号、开始和结束时间以及状态,如以下屏幕截图所示。

  1. 要进行验证,请登录 RDS 自定义实例的底层 亚马逊弹性计算云 (Amazon EC2) 实例并检查操作系统用户。

现在,我们可以与账户 B 共享 SSM 文档。组织开发自己的文档并跨账户共享的能力非常重要。例如,DevOps 或 SecOps 小组可以开发、创建和验证文档,并在不同账户之间共享这些文档。

  1. 选择文档 Rdscustom-Add-Os-User, 然后在 “ 操作 ” 菜单上选择 “修改权限”。

  1. 在 “ 修改权限” 下 ,选择 “ 私人”, 然后输入要与之共享文档的账号。
  2. 选择 “ 保存”

  1. 在 亚马逊云科技 账户 B 中运行相同的 SSM 文档。
  2. 要进行验证,请切换到账户 B,然后在 Systems Manager 控制台的 文档 页面上,导航到 “与我 共享 ” 选项卡。

您应该在此选项卡上看到与该帐户共享的所有文档。

  1. 按照相同的步骤(从步骤 6 开始)在账户 B 中运行 SSM 文档。

创建并运行 SSM 文档,对适用于 Oracle 的 RDS 自定义数据库实例数据库进行数据库级别的更改

要探索此用例,请完成以下步骤:

  1. 在系统管理器控制台上,选择导航窗格 中的 文档
  2. 在 “ 所有文档 ” 选项卡上的 “ 创建文档 ” 菜单上,选择 “ 自动化” 。
  3. 输入文档的名称(例如, rdsCustom Changedbparam)。
  4. 转到编辑器选项卡并输入以下内容以更改数据库参数并重新启动数据库。

在本文档中,我们使用 API 调用来暂停 RDS 自定义自动化并获取数据库 ID 和实例 ID。然后我们使用 r unComman d 并运行 shell 脚本来更改数据库参数(将名为 job_queue_ processes 的 Oracle 数据库参数设置为 200) 并重新启动数据库。最后,我们使用 API 来恢复自定义数据库自动化。

description: Make DB level changes
description: Stop RDS instance
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
DBInstanceId:
type: String
description: (Required) Identifies the *RDS* instance subject to action
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ''
mainSteps:
- name: PauseAutomation
action: 'aws:executeAwsApi'
inputs:
Service: rds
Api: ModifyDBInstance
DBInstanceIdentifier: '{{DBInstanceId}}'
AutomationMode: all-paused
- name: WaitForAvailableState
action: 'aws:waitForAwsResourceProperty'
maxAttempts: 10
timeoutSeconds: 600
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{DBInstanceId}}'
PropertySelector: '$.DBInstances[0].DBInstanceStatus'
DesiredValues:
- automation-paused
- name: GetDBId
action: 'aws:executeAwsApi'
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{DBInstanceId}}'
outputs:
- Name: DbiResourceId
Selector: '$.DBInstances[0].DbiResourceId'
Type: String
- name: GetInstId
action: 'aws:executeAwsApi'
onFailure: Abort
inputs:
Service: ec2
Api: DescribeInstances
Filters:
- Name: 'tag:Name'
Values:
- '{{GetDBId.DbiResourceId}}'
outputs:
- Name: InstanceId
Selector: '$.Reservations[0].Instances[0].InstanceId'
Type: String
- name: ChangeDBParam
action: 'aws:runCommand'
inputs:
DocumentName: AWS-RunShellScript
InstanceIds:
- '{{GetInstId.InstanceId}}'
Parameters:
commands:
- sudo su - rdsdb -c "sqlplus '/ as sysdba'"<<EOF
- alter system set job_queue_processes=200 scope=both;
- exit
- EOF
- name: RestartDB
action: 'aws:runCommand'
inputs:
DocumentName: AWS-RunShellScript
InstanceIds:
- '{{GetInstId.InstanceId}}'
Parameters:
commands:
- echo shutdown immediate | sudo su - rdsdb -c "sqlplus '/ as sysdba'"
- echo startup | sudo su - rdsdb -c "sqlplus '/ as sysdba'"
- name: ResumeAutomation
action: 'aws:executeAwsApi'
inputs:
Service: rds
Api: ModifyDBInstance
DBInstanceIdentifier: '{{DBInstanceId}}'
AutomationMode: full
isEnd: true
  1. 选择 “ 创建自动化” 。

您创建的文档显示在 “ 文档 ” 页面的 “我 所有” 选项卡上。

让我们先完成两次验证,然后再在账户 A 中的 RDS 自定义实例上运行 SSM 文档。

  1. 检查实例 dbcust2 中数据库参数 job_queue_process 的值。

如以下屏幕截图所示,它当前设置为 50。

  1. 验证 RDS 自定义实例是否启用了自动化。

  1. 选择要运行的文档,然后选择 “ 执行自动化” 。
  2. 选择 “ 简单执行” 。
  3. 输入参数下 ,输入 dbinStance ID 的值。
  4. 选择 “ 执行” 。

您可以监控运行详细信息以及步骤 ID、编号、开始和结束时间以及状态。以下屏幕截图显示暂停自定义自动化的第一步已完成,第 2 步正在进行中。

  1. 验证自定义实例上的自动化已暂停,该实例是通过 SSM 文档触发的。

SSM 文档中的所有步骤现已完成。

  1. 要进行验证,请登录 RDS 自定义实例的底层 EC2 实例并检查 job_queue_p rocess 参数。

跨多个区域和账户运行系统管理器自动化

您可以跨多个 亚马逊云科技 区域和 亚马逊云科技 账户运行系统管理器自动化。在多个区域和账户或组织单位中运行自动化可以减少管理您的 亚马逊云科技 资源所需的时间,同时增强计算环境的安全性。

当您跨多个区域和账户运行自动化时,您可以使用标签或 亚马逊云科技 资源组的名称来定位资源。资源组必须存在于每个目标账户和区域中,并且每个目标账户和区域中的资源组名称必须相同。

有关更多信息,请参阅 在多个 亚马逊云科技 区域和账户 中 运行自动化

摘要

在这篇文章中,我们展示了如何使用 SSM 文档在 RDS Custom for Oracle 数据库实例中自动执行实例后创建任务。SSM 文档可以在 亚马逊云科技 账户之间共享,也可以在运行时标记和引用。将 SSM 文档与 RDS 自定义一起使用有助于优化和扩展跨多个账户的多个 RDS 自定义实例的部署。

要了解有关 Amazon RDS 自定义和使用 SSM 实现自动化的更多信息,请参阅以下资源:

  • 使用适用于 Oracle 的亚马逊 RDS 定制版
  • 亚马逊云科技 系统管理器文档
  • 创建 SSM 文档
  • 共享 SSM 文档

在评论部分分享你的想法。


作者简介

Yamuna Palasamudram 是亚马逊网络服务的高级数据库专家解决方案架构师。她在 亚马逊云科技 RDS 团队工作,专注于像 Oracle 这样的商用数据库引擎。她喜欢与客户合作,帮助设计、部署和优化 亚马逊云科技 上的关系数据库工作负载。

Nitin Saxena 是亚马逊网络服务 RDS 数据库管理商业引擎的高级数据库工程师。他专注于甲骨文 RDS 和 RDS Custom for Oracle 等服务。他喜欢在 RDS、Oracle 和 RDS Custom 上设计和开发新功能以解决客户问题。