Splunkを立ち上げるのは、ちょっとめんどくさい
Splunk中級者ともなれば、「Splunk立ち上げるのって、やり方は分るんだけどめんどくさい」と感じることが多いかなと思います。
私もそうで、Splunkを検証用途で立ち上げたいだけなのに、わざわざLinuxのCLIに入ってコマンド叩くのがめんどくさいと感じます。
そんなあなたに朗報。CLIに入らなくてもSplunkは立ち上げられますよ!!
EC2ユーザーデータを利用する
コマンドを全く使わないというわけではなく、EC2インスタンスの起動時にコマンドを自動実行させるというのが正しい表現になります。
EC2の起動画面の下部にある「高度な詳細」のトグルを開くと、一番下にユーザーデータの入力欄が出てきます。

この欄に以下のシェルスクリプトを記入した上でインスタンスを起動することで、Splunk Enterprise 10.0.2が自動で立ち上がります。なお、今回の設定では、EC2のデフォルトの起動ユーザーである「ec2-user」によってSplunkが自動起動されるようになっています。
Amazon Linux 2023、Red Hat Enterprise Linux 9.5では動作確認済みです。
#!/bin/bash -v
cd /opt
sudo yum install -y wget
#Splunk Enterpriseのパッケージを取得
wget -O splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz "https://download.splunk.com/products/splunk/releases/10.0.2/linux/splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz"
tar xzvf splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz
chown -R ec2-user:ec2-user /opt/splunk
#EC2ユーザーでSplunkを起動
sudo -u ec2-user /opt/splunk/bin/splunk start --accept-license --answer-yes --no-prompt --seed-passwd password
sudo -u ec2-user /opt/splunk/bin/splunk stop
#EC2ユーザーで自動起動するよう設定
sudo /opt/splunk/bin/splunk enable boot-start -user ec2-user
#Splunkを再度起動
sudo -u ec2-user /opt/splunk/bin/splunk start
(Opt.) CloudFormationでEC2ユーザーデータを利用する
AWSを用いたSplunk環境のデプロイを自動化するには、CloudFormationをはじめとするIaCが大変便利です。
また、別記事『Splunkエンジニア向け SQS-Based S3に必要なAWS環境をCloudFormationで簡単にデプロイする』で紹介しているように、AWSのS3・SNS・SQSを用いたログ連携はSplunkのスタンダードでもあります。
SQS-Based S3を利用したSplunk検証環境の構築をしたいという要件を満たすため、以下にCloudFormationのテンプレートを記載します。ご自身の環境に合わせて設定値を書き換えて使ってみてください。
本テンプレートでは、以下のリソース・設定をデプロイします。
- Amazon Linux 2023のEC2インスタンス(Splunk構築のユーザーデータ記入済み、東京リージョン)
- SQS-Based S3のログ連携に必要なS3・SQSへのアクセスポリシー
- Session Managerを利用するためのkms:Decryptポリシー、AWSマネージドポリシー(AmazonSSMManagedInstanceCore)
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Deploy EC2 (Splunk-Test-Server) with IAM Role (InstanceRoleForSplunk), tags, and permissions for Session Manager, S3, and SQS/DLQ. Use existing Security Groups.",
"Parameters": {
"VpcId": {
"Type": "AWS::EC2::VPC::Id",
"Description": "VPC where the EC2 instance will be launched.",
"Default": "vpc-"
},
"SubnetId": {
"Type": "AWS::EC2::Subnet::Id",
"Description": "Subnet for the EC2 instance.",
"Default": "subnet-"
},
"KeyName": {
"Type": "AWS::EC2::KeyPair::KeyName",
"Description": "EC2 KeyPair name for SSH (optional, leave blank if not needed).",
"Default": "key-pair"
},
"ExistingSecurityGroupId": {
"Type": "AWS::EC2::SecurityGroup::Id",
"Description": "Existing Security Group ID to attach to the instance (required).",
"Default": "sg-"
}
},
"Mappings": {
"AmiMap": {
"ap-northeast-1": {
"AMI": "起動したいAMIのID"
}
}
},
"Conditions": {
"HasKeyPair": {
"Fn::Not": [
{
"Fn::Equals": [
{
"Ref": "KeyName"
},
""
]
}
]
}
},
"Resources": {
"InstanceRoleForSplunk": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "InstanceRoleForSplunk",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
},
"ManagedPolicyArns": [
"arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
],
"Policies": [
{
"PolicyName": "S3ReadAccessForSpecificBucket",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::ログ連携に利用するS3バケットの名前"
},
{
"Sid": "GetObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectTagging",
"s3:GetObjectVersionTagging"
],
"Resource": "arn:aws:s3:::ログ連携に利用するS3バケットの名前/*"
}
]
}
},
{
"PolicyName": "SqsReceiveDeleteForQueues",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReceiveDeleteMainQueue",
"Effect": "Allow",
"Action": [
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:DeleteMessageBatch",
"sqs:ChangeMessageVisibility",
"sqs:ChangeMessageVisibilityBatch",
"sqs:GetQueueAttributes"
],
"Resource": [
{
"Fn::Sub": "arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:*"
}
]
}
]
}
},
{
"PolicyName": "KMSPolicy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "KMSPolicyForSessionManager",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": "*"
}
]
}
}
]
}
},
"InstanceProfileForSplunk": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"InstanceProfileName": "InstanceRoleForSplunk",
"Roles": [
{
"Ref": "InstanceRoleForSplunk"
}
]
}
},
"SplunkTestEC2": {
"Type": "AWS::EC2::Instance",
"Properties": {
"LaunchTemplate": {
"LaunchTemplateId": {
"Ref": "SplunkTestEC2Template"
},
"Version": "1"
},
"SubnetId": {
"Ref": "SubnetId"
},
"SecurityGroupIds": [
{
"Ref": "ExistingSecurityGroupId"
}
],
"Tags": [
{
"Key": "Name",
"Value": "Splunk-Test-Server"
},
{
"Key": "Owner",
"Value": "splunk-user"
}
]
}
},
"SplunkTestEC2Template": {
"Type": "AWS::EC2::LaunchTemplate",
"Properties": {
"LaunchTemplateData": {
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"VolumeSize": 35,
"VolumeType": "gp2",
"DeleteOnTermination": true,
"Encrypted": true
}
}
],
"IamInstanceProfile": {
"Arn": {
"Fn::GetAtt": [
"InstanceProfileForSplunk",
"Arn"
]
}
},
"ImageId": {
"Fn::FindInMap": [
"AmiMap",
{
"Ref": "AWS::Region"
},
"AMI"
]
},
"InstanceType": "t3.large",
"KeyName": {
"Fn::If": [
"HasKeyPair",
{
"Ref": "KeyName"
},
{
"Ref": "AWS::NoValue"
}
]
},
"TagSpecifications": [
{
"ResourceType": "volume",
"Tags": [
{
"Key": "Name",
"Value": "Splunk-Test-Server"
},
{
"Key": "Owner",
"Value": "splunk-user"
}
]
}
],
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash -v\n",
"cd /opt\n",
"sudo yum install -y wget\n",
"wget -O splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz \"https://download.splunk.com/products/splunk/releases/10.0.2/linux/splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz\"\n",
"tar xzvf splunk-10.0.2-e2d18b4767e9-linux-amd64.tgz\n",
"chown -R ec2-user:ec2-user /opt/splunk\n",
"sudo -u ec2-user /opt/splunk/bin/splunk start --accept-license --answer-yes --no-prompt --seed-passwd password\n",
"sudo -u ec2-user /opt/splunk/bin/splunk stop\n",
"sudo /opt/splunk/bin/splunk enable boot-start -user ec2-user\n",
"sudo -u ec2-user /opt/splunk/bin/splunk start"
]
]
}
}
}
}
}
},
"Outputs": {
"InstanceId": {
"Description": "EC2 Instance ID",
"Value": {
"Ref": "SplunkTestEC2"
}
},
"InstanceRoleArn": {
"Description": "IAM Role ARN attached to the instance",
"Value": {
"Fn::GetAtt": [
"InstanceRoleForSplunk",
"Arn"
]
}
},
"InstanceProfileName": {
"Description": "Instance profile name",
"Value": {
"Ref": "InstanceProfileForSplunk"
}
}
}
}