RDS拡張モニタリングをデフォルト以外のIAMロールで有効化する

2016.10.24

こんにちは、虎塚です。

RDSの拡張モニタリングを有効にすると、DBインスタンスの詳細なOS情報をCloudWatch Logsに集約できます。

デフォルトの設定を使うなら、拡張モニタリングはAWS Management Console上でボタンをクリックするだけで有効化できます。今回は、デフォルトと異なる状況で設定する際の手順を紹介します。

RDS拡張モニタリングの登場人物

RDS拡張モニタリングの図

RDS拡張モニタリングの主な登場人物は、DBインスタンスIAMロールCloudWatch Logsです。

このIAMロールは、拡張モニタリングを使用するためのAWSサービスロールです。AWSサービスであるmonitoring.rds.amazonaws.comが、このIAMロールを使用してDBインスタンスのデータをCloudWatch Logsに送ります。そのため、このIAMロールは次の2つの設定を必要とします。

  • monitoring.rds.amazonaws.comからロールを引き受ける設定
  • CloudWatch Logsにデータをputする権限の設定

AWS Management Consoleを使ってデフォルト設定で拡張モニタリングを有効化すると、このIAMロール (rds-monitoring-role) が自動的に作成されます。

この記事で紹介する手順は、デフォルトで作成されるIAMロールを使用せずに拡張モニタリングを有効化したい場合や、コマンドラインで設定作業をする場合に利用してください。

設定手順

この手順では、AWS CLIを使用します。次のバージョンで動作確認しました。

  • aws-cli/1.10.64 Python/2.7.10 Darwin/14.5.0 botocore/1.4.54

1. IAMロールの作成

まず、IAMロール (rds-enhanced-monitoring) を作成します。

先に信頼関係のポリシードキュメントを作成します。ポリシーの内容を次に示します。

TrustedPolicy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "monitoring.rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

上のポリシーは、AWS Management ConsoleからRDS拡張モニタリングを有効化した時にデフォルトで作成されるIAMロールに設定される信頼関係と同じ内容です。IAMロールを作成する際に、このファイルを指定します。

aws iam create-role \
  --role-name rds-enhanced-monitoring \
  --assume-role-policy-document file://TrustedPolicy.json

実行結果を次に示します。

{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": "monitoring.rds.amazonaws.com"
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "XXXXXXXXXXXXXXXXXXXXX",
        "CreateDate": "2016-10-22T04:52:32.978Z",
        "RoleName": "rds-enhanced-monitoring",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/rds-enhanced-monitoring"
    }
}

2. ポリシーの適用

次に、ステップ1で作成したIAMロールに、マネージドポリシー (AWSが提供するポリシー) の1つであるAmazonRDSEnhancedMonitoringRoleを適用します。これは、CloudWatch Logsにロググループを生成したり、ログストリームを作成することを許可するポリシーです。

参考までに、AmazonRDSEnhancedMonitoringRoleの内容を次に示します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogGroups",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:RDS*"
            ]
        },
        {
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogStreams",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:RDS*:log-stream:*"
            ]
        }
    ]
}

このポリシーのPolicy ARNは「arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole」です。次のコマンドを実行することで、IAMロールに適用できます。

aws iam attach-role-policy \
  --role-name rds-enhanced-monitoring \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole

3. DBインスタンスの設定変更

最後に、DBインスタンスの設定を変更します。

RDS拡張モニタリングの設定は、インスタンスを作成する時、レプリカを作成する時、DBインスタンスの設定を修正する時の3つのタイミングで変更できます。今回はすでにDBが稼働している状況を想定し、DBインスタンスの設定を修正するタイミングで設定を適用するものとします。

次のコマンドを実行します。この変更でDBインスタンスの再起動はおこなわれません。

aws rds modify-db-instance \
  --db-instance-identifier <db-instance-name> \
  --monitoring-interval 15 \
  --monitoring-role-arn arn:aws:iam::123456789012:role/rds-enhanced-monitoring  \
  --apply-immediately
  • monitoring-interval: データをputする間隔 (秒) を指定します
  • monitoring-role-arn: ステップ1で作成したIAMロールのARNを指定します

しばらく待つと、RDSに設定が適用されます。

4. 変更結果の確認

DBインスタンスの設定が変更されたことを確認します。

aws rds describe-db-instances \
  --db-instance-identifier <db-instance-name> \
| jq '.DBInstances[] | .MonitoringInterval, .MonitoringRoleArn, .EnhancedMonitoringResourceArn'

実行結果を次に示します。

60
"arn:aws:iam::123456789012:role/rds-enhanced-monitoring"
"arn:aws:logs:ap-northeast-1:123456789012:log-group:RDSOSMetrics:log-stream:db-XXXXXXXXXXXXXXXXXXXXXXXXXX"

実行結果の3行目に表示されているEnhancedMonitoringResourceArnの値は、CloudWatch LogsのログストリームのARNです。DBインスタンスのOS情報は、このログストリームに対してputされます。

留意点: 拡張モニタリングで使用されるCloudWatch Logsのログストリーム

拡張モニタリングのデータがputされるCloudWatch Logsのログストリームは、RDSのリソースIDごとに作成されます。ログストリームの名前は、DBインスタンスのリソースIDと同じです。

$ aws rds describe-db-instances --db-instance-identifier <db-instance-id> \
  | jq '.DBInstances[] | .DbiResourceId, .EnhancedMonitoringResourceArn'
"db-XXXXXXXXXXXXXXXXXXXXXXXXXX"
"arn:aws:logs:ap-northeast-1:123456789012:log-group:RDSOSMetrics:log-stream:db-XXXXXXXXXXXXXXXXXXXXXXXXXX"

この制約は変更できません。ログストリーム名をユーザが手動で設定することもできません。DBインスタンスで拡張モニタリングを有効にした後、一度無効にして、改めて有効にした場合、以前と同じログストリームの続きにデータがputされます。

新しいログストリームにデータをputしたいときは、DBインスタンスのバックアップを取得した上で一度削除して、DBインスタンスを作り直すとよいでしょう。そうすれば、たとえ以前と同じDBインスタンスIDを使ったとしてもリソースIDが新しくなるため、拡張モニタリングを有効にしたタイミングで新しいログストリームが作成されます。

おわりに

デフォルト設定を使わずに、コマンドラインからRDS拡張モニタリングを有効化する手順を説明しました。

拡張モニタリングを使うと、パフォーマンス監視に使える詳細な情報が取れて便利です。必要に応じて利用しましょう。

それでは、また。