Splunk Cloud でログ集約してみたい

一つのコンソールでログを管理したいので Splunk でログ集約を試してみます。
2019.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井です。

先日 Fargate のログドライバーに Splunk が対応しました。
Splunk は弊社ハマコーの記事にある通りパワフルなツールです。

【祝】FargateでログドライバーにSplunkが利用可能になりました!

統合ログ分析ソリューションSplunkの凄さを公式チュートリアルで体感する

Fargate のログ出力を Splunk に検討されるとして
運用を考えると一つのコンソールで全てのログ参照が出来ることがベストだと思います。
今回は Splunk でログ集約を試してみます。

Splunk Cloud

今回は Splunk Cloud を試します。
何が利点かと言えば、やはり 管理が不要 になることです。
仮想マシン、OS、パッチ、バージョンアップなど生産的ではないタスクから開放されることは
システム担当者からすると幸せな気持ちなるはずです。

収集可能なログ

執筆日時点で収集可能なログ、イベント、メトリクスは以下の通りです。

  • Config
  • Config Rules
  • Description
  • Inspector
  • CloudTrail
  • CloudWatch Logs
  • CloudWatch
  • Billing
  • S3
  • Kinesis
  • SQS

最新情報はこちらを参照ください。
Source types for the Splunk Add-on for AWS

AWS サービスから直接収集するものと SQS-based S3 で収集するものが存在します。
今回は前者から Cloud Watch Logs、後者から CloudTrail を試します。

IAM 準備

まずは Splunk Cloud に必要な IAM ユーザー、ロール、ポリシーを作ります。

ロール用 IAM ポリシー

IAM ポリシーを作ります。
名前は任意ですがここでは splunk-role-policy とします。
ポリシーは 公式ドキュメント に従って以下の通りします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:GetQueueAttributes",
                "sqs:ListQueues",
                "sqs:ReceiveMessage",
                "sqs:GetQueueUrl",
                "sqs:SendMessage",
                "sqs:DeleteMessage",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets",
                "s3:GetBucketTagging",
                "s3:GetAccelerateConfiguration",
                "s3:GetBucketLogging",
                "s3:GetLifecycleConfiguration",
                "s3:GetBucketCORS",
                "config:DeliverConfigSnapshot",
                "config:DescribeConfigRules",
                "config:DescribeConfigRuleEvaluationStatus",
                "config:GetComplianceDetailsByConfigRule",
                "config:GetComplianceSummaryByConfigRule",
                "iam:GetUser",
                "iam:ListUsers",
                "iam:GetAccountPasswordPolicy",
                "iam:ListAccessKeys",
                "iam:GetAccessKeyLastUsed",
                "autoscaling:Describe*",
                "cloudwatch:Describe*",
                "cloudwatch:Get*",
                "cloudwatch:List*",
                "sns:Get*",
                "sns:List*",
                "sns:Publish",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents",
                "ec2:DescribeInstances",
                "ec2:DescribeReservedInstances",
                "ec2:DescribeSnapshots",
                "ec2:DescribeRegions",
                "ec2:DescribeKeyPairs",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVpcs",
                "ec2:DescribeImages",
                "ec2:DescribeAddresses",
                "lambda:ListFunctions",
                "rds:DescribeDBInstances",
                "cloudfront:ListDistributions",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeInstanceHealth",
                "elasticloadbalancing:DescribeTags",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeTargetHealth",
                "elasticloadbalancing:DescribeListeners",
                "inspector:Describe*",
                "inspector:List*",
                "kinesis:Get*",
                "kinesis:DescribeStream",
                "kinesis:ListStreams",
                "kms:Decrypt",
                "sts:AssumeRole"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

ユーザー用 IAM ポリシー

次にユーザー用 IAM ポリシーです。
名前は任意ですが splunk-user-policy にしました。
ポリシーは以下です。
「your-account-id」の箇所はご自身の AWS アカウントに置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::your-account-id:role/splunk-role"
        }
    ]
}

IAM ロール作成

IAM ロールを作ります。
名前は任意でここでは splunk-role にしています。
前の手順で作成した splunk-role-policy をアタッチしてください。

ロールをしたら、信頼関係タブから 信頼関係の編集 をクリックし以下のように編集します。
「your-account-id」の箇所はご自身の AWS アカウントに置き換えてください。
「splunk-user」 は次の手順で作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::your-account-id:user/splunk-user"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

IAM ユーザー作成

IAM ユーザーを作ります。
名前は任意でここでは splunk-user としています。
ユーザーを作成する際には プログラムによるアクセス を選択してください。
※クレデンシャルが記述された csv ファイルを忘れずにダウンロードしておきます。

このユーザーには splunk-user-policyCloudWatchLogsReadOnlyAccess の2つのポリシーをアタッチします。

Splunk Add-on for AWS のインストール

Splunk Cloud へログインします。
画面の左上に歯車のアイコンがあるのでクリックします。

Browse more apps をクリックしたのちに
Splunk Add-on for Amazon Web Services を探してインストールします。

Splunk Cloud セットアップ

画面左側に Splunk Add-on for AWS が表示されているのでクリックします。

Configuration タブ → AccountAdd をクリックします。
前の手順で作成した splunk-user の Key ID と Secret Key を入力し任意の名前を付けて保存します。

続いて IAM Role タブ → Add をクリックします。
splunk-role の ARN と任意の名前を付けて保存します。

CloudWatch Logs の取込み

Splunk Add-on for AWS 画面のまま Inputs をクリックします。
Inputs 画面で Create New InputCustom Data TypeCloudWatch Logs をクリックします。

情報を入力して保存します。

項目
Name 任意の名前
AWS Accont 前の手順で設定したアカウントを選択
AWS Region 取り込みたい CloudWatch Logs のリージョンを選択
Log Group 取り込みたいロググループを選択、カンマ区切りで複数指定可能
Stream Matching Regex .*
Only After 1970-01-01T00:00:00
Source Type aws:cloudwatchlogs
Index default

Log Group で指定したログが取り込まれていきます。
数分待ちます。

Splunk Add-on for AWS 画面上部の Search ボタンをクリックします。
検索画面に遷移します。
検索欄に以下を入力して検索しログを取り込まれていることを確認します。

sourcetype="aws:cloudwatchlogs"

CloudTrail の取込み

CloudTrail は SQS-Based S3 という方式で取り込みます。
Splunk が推奨している方式で、他には S3 Access Log、CloudFront Access Log、ELB Access Log など様々なログがこの方式です。

CloudTrail の場合は、CloudTrail → SNS → SQS → Splunk になります。
なるほどパワフルでスケーラブルですね。
Splunk に限らずログを外部に送るときは、どこかでキューイングしておくと
予期せぬトラブルが減って助かります。

CloudTrail の設定

CloudTrail で SNS への発行を有効にします。
AWS マネジメントコンソールでは以下のようにします。
CloudTrail の画面で SNS トピックを作ってしまうと楽です。
ここでは splunk-cloudtrail-topic と名前にしています。

SQS の設定

キューを2つ作成します。
スタンダードキューと DeadLetter 用の2つです。
ここでは splunk-cloudtrail-queue と splunk-cloudtrail-dlqueue にしています。

スタンダードキューはアクセス許可を以下の設定し、CloudTrail で指定した SNS トピックを許可します。

また、デフォルトの可視性タイムアウト5分 にします。(Splunk の推奨)

SNS の設定

CloudTrail で指定した SNS トピック画面を開きます。
CloudTrail 設定手順で splunk-cloudtrail-topic したトピックです。

サブスクリプションの作成 で前の手順で作成した SQS を設定します。
splunk-cloudtrail-queue としたキューです。

以下のようにステータスが 確認済み になれば OK です。

Splunk Cloud の設定

Splunk に戻ります。
Splunk Add-on for AWS 画面の Inputs をクリックします。
Inputs 画面で Create New InputCloudTrailSQS-Based S3 をクリックします。

情報を入力して保存します。

項目
Name 任意の名前
AWS Accont 前の手順で設定したアカウントを選択
Assume Role 前の手順で設定したロールを選択
AWS Region CloudTrail の出力先リージョンを選択
SQS Queue Name 前の手順で作成したスタンダードキュー
SQS Batch Size 10
S3 File Decoder CloudTrail
Source Type aws:cloudtrail
Index default

Splunk Add-on for AWS 画面上部の Search ボタンをクリックします。
検索画面に遷移します。
検索欄に以下を入力して検索しログを取り込まれていることを確認します。

sourcetype="aws:cloudtrail"

さいごに

Splunk Cloud でログ収集を試してみました。
今回は CloudWatch Logs と CloudTrail を試してみましたが、
他のログも同様の手順で収集可能です。
※ VPC Flow Log を Firehose 経由で収集したかったのですが、Splunk Cloud はまだ対応してないようです。

参考

Splunk Add-on for AWS
Install an add-on in Splunk Cloud
【祝】FargateでログドライバーにSplunkが利用可能になりました!
SplunkのAWS統合サービス「Splunk App for AWS」を試してみた
統合ログ分析ソリューションSplunkの凄さを公式チュートリアルで体感する