RDS拡張モニタリングの値をDatadogで利用する

datadog_icon

こんにちは、虎塚です。

今回は、DatadogでRDSを監視するために拡張RDSインテグレーションを有効にする手順を紹介します。

DatadogでのRDS監視

RDSのパフォーマンスデータをDatadogで利用するには、次の3つの方法があります。

  • 標準RDSインテグレーション
  • 拡張RDSインテグレーション
  • RDS+ネイティブDBインテグレーション

1つ目の標準RDSインテグレーションは、CloudWatchのRDSメトリックス値をDatadogで使います。このインテグレーションは、AWSインテグレーションを実行してRDSを選択することで有効にできます。

AWSインテグレーションの設定手順は、次の記事を参照ください。

2つ目の拡張RDSインテグレーションは、RDSの拡張モニタリングで取得できる値をDatadogで使います。このインテグレーションでは、RDSの拡張モニタリングでCloudWatch Logsにputされる値を、AWS LambdaでDatadogに送信することで有効にできます。

今回は、拡張RDSインテグレーションの設定手順を詳しく紹介します。Datadogの公式ドキュメントやAWSブログでの紹介記事は、次のページをご覧ください。

なお、3つ目のRDS+ネイティブDBインテグレーションについては、また別の機会に触れたいと思います。

設定手順

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

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

1. RDS拡張モニタリングの有効化

監視対象のDBインスタンスで、RDS拡張モニタリングを有効にします。その際、Granularityを15秒に設定します。

手順は、次の記事を参考にしてください。

設定後、CloudWatch LogsのManagement Consoleを開き、ロググループRDSOSMetricsにDBインスタンスのリソースIDと同じログストリームが表示されていることを確認しておきましょう。

2. KMSでカスタマーマスターキーを作成

AWS KMSでカスタマーマスターキーを作成します。

まず、キーのポリシーファイルを作成します。

{
  "Version": "2012-10-17",
  "Id": "key-consolepolicy-2",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow access for Key Administrators",
      "Effect": "Allow",
      "Principal": {"AWS": [
        "arn:aws:iam::123456789012:role/my-iam-role"
      ]},
      "Action": [
        "kms:Create*",
        "kms:Describe*",
        "kms:Enable*",
        "kms:List*",
        "kms:Put*",
        "kms:Update*",
        "kms:Revoke*",
        "kms:Disable*",
        "kms:Get*",
        "kms:Delete*",
        "kms:ScheduleKeyDeletion",
        "kms:CancelKeyDeletion"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {"AWS": [
        "arn:aws:iam::123456789012:role/my-iam-role"
      ]},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {"AWS": [
        "arn:aws:iam::123456789012:role/my-iam-role"
      ]},
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {"Bool": {"kms:GrantIsForAWSResource": "true"}}
    }
  ]
}

キーポリシーで、キーの管理者と利用者を指定しています。キーの利用者として、この手順を実行するユーザのIAMロール (my-iam-role) を含めました。IAMユーザで実行している場合は、user/your-iam-userを指定します。

コマンドを実行して、ポリシー付きのキーを作成します。

aws kms create-key \
  --policy file://lambda-datadog-key-policy.json \
  --description 'for datadog'

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

{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "12345678-abcd-1234-abcd-1234567890ab",
        "Description": "for datadog",
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1477388416.36,
        "Arn": "arn:aws:kms:ap-northeast-1:123456789012:key/12345678-abcd-1234-abcd-1234567890ab",
        "AWSAccountId": "123456789012"
    }
}

最後に、作成したキーのKeyIdを指定して、エイリアス (lambda-datadog-key) を設定します。

aws kms create-alias \
  --alias-name alias/lambda-datadog-key \
  --target-key-id 12345678-abcd-1234-abcd-1234567890ab

3. APIキーとアプリケーションキーの暗号化

ステップ2で作成したキーを使用して、DatadogのAPIキーとAPPキーを暗号化します。

aws kms encrypt --key-id alias/lambda-datadog-key \
  --plaintext '{"api_key":"<datadog_api_key>", "app_key":"<datadog_app_key>"}'

DatadogのAPIキーとAPPキーは、Datadogの左メニューから、[Integrations]→[APIs]を開くと表示されます。各キーがまだ存在しない場合は、新規に作成します。

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

{
    "KeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/12345678-abcd-1234-abcd-1234567890ab",
    "CiphertextBlob": "AQECAHgT...VDpGS7I="
}

ステップ5でCiphertextBlobの値を使うので、控えておきます。

4. Lambda用のIAMロールの作成

ステップ5で作成するAWS Lambdaのために、AWSサービスロール (lambda-datadog-post-execution) を作成します。

まず、IAMロールの信頼ポリシーファイルを作成します。

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

次に、コマンドを実行して、上の信頼ポリシーを付与したIAMロールを作成します。

aws iam create-role \
  --role-name lambda-datadog-post-execution\
  --assume-role-policy-document file://lambda-service-role-policy.json

実行結果の例を示します。

{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "ABCDEFGABCDEFGABCDEFG",
        "CreateDate": "2016-10-25T10:38:14.135Z",
        "RoleName": "lambda-datadog-post-execution",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/lambda-datadog-post-execution"
    }
}

最後に、作成したIAMロールに権限ポリシーを付与します。

ポリシーファイルを作成します。をステップ2で作成したキーのARNで置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "<ENCRYPTION_KEY ARN>"
            ]
        }
    ]
}

コマンドを実行して、IAMロールにインラインポリシーとして上のポリシーつけます。

aws iam put-role-policy \
  --role-name lambda-datadog-post-execution \
  --policy-name lambda-datadog-policy \
  --policy-document file://lambda-datadog-policy.json

5. Lamdaファンクションの作成

Lambdaファンクションを作成します。AWS LambdaのManagement Consoleで、[Create a Lambda function]ボタンをクリックします。

Select blueprint画面で、datadog-process-rds-metricsのブループリントを選択します。

Configure triggers画面で、次のように入力します。

  • Log Group: RDSOSMetrics
  • Filter Name: 任意 (myLambdaTrigger)
  • Enable trigger: オン

[Next]ボタンをクリックします。Configure function画面で、次のように入力します。

  • Name: 任意 (lambda-datadog-post-function)
  • Runtime: Python 2.7

コードエリア内のを、 ステップ3で暗号化コマンドを実行して取得したCiphertextBlobに置き換えます。

  • Handler: lambda_function.lambda_handler
  • Role: Choose an existing role
  • Existing role: ステップ4で作成したIAMロール (lambda-datadog-post-execution)
  • VPC: NoVPC

[Next]ボタンをクリックします。Review画面で設定を確認し、[Create function]ボタンをクリックします。

以上で完了です。

Datadogのダッシュボードで確認

拡張RDSインテグレーションを有効にすると、Datadogで値がどのように見えるかを確認しましょう。

Datadogの左メニューから、[Dashboards]→[Dashboard List]を開き、Integration Dashboard一覧から「AWS RDS (Enhanced Metrics)」 を選択します。

初期状態のダッシュボードは、次のような画面です。

RDS (Enhanced Metrics) のダッシュボード

RDS (Enhanced Metrics) のダッシュボード

ダッシュボードでは、好きなメトリックスを選択して、好きな場所にグラフを表示できます。

おわりに

RDSの拡張モニタリングで取得できる詳細なデータは、そのままだとCloudWatch Logsに溜まっていくだけです。今回のようにDatadogを使って可視化することで、活用の場面を広げることができそうですね。

それでは、また。