AWS上にHTTPSアクセス可能なSplunk環境を作成する


AWS上でブラウザ->LBまでがHTTPS、LBからEC2インスタンスがHTTPの構成となるような環境を作っていく。

前提条件

  • Splunk Enterpriseのバージョン: 8.1.2
  • Nginxのバージョン: 1.21
  • EC2インスタンスのOS: RHEL 7.7
  • SELinuxを無効化すること
  • AWSマネージドコンソールの言語: English(US)

AWS S3の準備

  • AWSのマネージドコンソールにログインし、Amazon S3ダッシュボードを開きます。
  • Create bucketボタンをクリックします。
  • Bucket nameに任意のバケット名を入力します。
  • AWS RegionをEC2インスタンスを作成するリージョンと同じにします。
  • Default encryptionEnableにします。
  • Encryption key typeAWS Key Management Service key (SSE-KMS)にします。
    • APIのコールがSSE-KMSの上限を超える可能性がある場合はAmazon S3 key (SSE-S3)を利用します。
  • AWS KMS keyAWS managed key (aws/s3)にします。
  • Create bucketをクリックします。

IAMポリシーの準備

  • Identity and Access Management (IAM)ダッシュボードを開きます。
  • 左ペインのメニューからPoliciesを選択します。
  • Create Policyをクリックします。
  • JSONタブを開きます。
  • 以下の内容をテキストエリアに書き込みます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "kms:*",
            "Resource": "arn:aws:kms:{Region}:{AccountID}:key/{KMS ID}"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::{BucketName}/*"
        }
    ]
}
  • Next: Tagsをクリックします。(タグが必要な場合は設定します。)
  • Next: Reviewをクリックします。
  • Nameにポリシー名を入力します。これは必須項目です。
  • Create Policyをクリックします。

IAMロールの準備

  • Identity and Access Management (IAM)ダッシュボードを開きます。
  • 左ペインのメニューからRolesを選択します。
  • Create roleをクリックします。
  • Choose a use caseからEC2を選択します。
  • Next: Permissionsをクリックします。
  • Atatach permissions policiesで上記の手順で作成したIAMポリシーをアタッチします。
  • Next: Tagsをクリックします。
  • Next: Reviewをクリックします。
  • Role nameを入力します。
  • Create roleをクリックします。

EC2インスタンスの準備

詳細な手順は割愛しますが、上記の手順で作成したロールをアタッチしてください。
今回の構成としては、1つのVPCにpublicなサブネットとprivateなサブネットを用意しており、このEC2インスタンスはprivateなサブネットに構築します。
後ほどロードバランサーをpublicなサブネットに紐づけて作成し、リクエストをこのインスタンスに流すように設定します。
また、自身の作業環境からSSHアクセスできるようにセキュリティグループを設定してください。

Splunk Enterpriseのインストールと設定

今回は/app/splunkにSplunk Enterpriseをインストールします。

  • 公式のインストール手順に従って、Splunk Enterpriseをインストールし、Splunkが起動することを確かめます。
  • 以下のようなディレクトリとファイルを用意します。コンフィグをアプリとして管理することで運用管理しやすくなります。
$ cd /app/splunk/etc/apps/
$ mkdir -p standalone_config/local
$ mkdir -p standalone_config/metadata
$ touch standalone_config/local/app.conf
$ touch standalone_config/local/indexes.conf
$ touch standalone_config/metadata/default.meta
  • standalone_config/local/app.confを以下のように編集します。
[install]
state = enabled

[package]
check_for_updates = false

[ui]
is_visible = false
is_manageable = false
  • standalone_config/local/indexes.confを以下のように編集します。
[default]
remotePath = volume:remote_store/$_index_name

[volume:remote_store]
storageType = remote

path = s3://{s3BucketName}

remote.s3.encryption = sse-kms
remote.s3.kms.key_id = {kmsId}
  • standalone_config/metadata/default.metaを以下のように編集します。
[]
access = read : [ * ], write : [ admin ]
export = system
  • Splunkを再起動します。/app/splunk/bin/splunk restart
  • Splunkのモニターコンソール等で正常にSmartStore機能が働いているか確認します。

Nginxのインストールと設定

  • こちらの手順を参考にNginxをyumでインストールします。
  • /etc/nginx/conf.d/default.confを以下のように編集します。
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name {dnsName};
        # plunkのファイルアップロードによる取り込み対応
        client_max_body_size 1024M;

        # SplunkのリダイレクトURLのプロトコルがhttpになることへの対応
        if ($http_x_forwarded_proto != https) {
                return 301 https://$host$request_uri;
        }

        location / {
                proxy_pass http://127.0.0.1:8000;
        }

}
  • Nginxを起動します。 $ sudo systemctl start nginx

今回の構成はブラウザからLBまでがHTTPS、LBからEC2へのアクセスがHTTPとなる構成をとっています。
SplunkがHTTPモードで動作しているため、ログイン後のリダイレクトURLがHTTPになってしまいます。
常にHTTPSでアクセスさせたいため、LBからHTTPによるアクセスが来たら強制的にHTTPSでアクセスさせるように対応しています。

ACMの準備

  • Certificate Managerダッシュボードを開きます。
  • Request a certificateをクリックします。
  • Request a public certificateが選択されていることを確認し、Request a certificateをクリックします。
  • Domain nameを入力します。ここでは*.example.comを例とします。
  • Nextをクリックします。
  • Route53でドメイン取得したことを前提としているので、DNS validationが選択されていることを確認し、Nextをクリックします。
  • Reviewをクリックします。
  • Confirm and requestをクリックします。
  • Domainの情報を開いてCreate record in Route53をクリックします。
  • Createをクリックします。
  • Continueをクリックします。

AWS CLBの準備

  • EC2ダッシュボードを開きます。
  • 左ペインのメニューからLoad Balancersを選択します。
  • Create Load Balancerを選択します。
  • Classic Load BalancerCreateをクリックします。
  • Load Balancer nameを入力します。
  • Create LB InsideをEC2が存在するVPCにします。
  • Listener Configurationで80番ポートと443番ポートをEC2インスタンスに流すように設定します。
    • Load Balancer Protocol:80, Load Balancer Port:80, Instance Protocol:HTTP, Instance Port:80
    • Load Balancer Protocol:443, Load Balancer Port:443, Instance Protocol:HTTP, Instance Port:443
  • Select Subnetsで上記で選択したVPCのパブリックなサブネットを選択します。
  • Next Assign Security Groupをクリックします。
  • インターネットからのアクセスおよび、作成したEC2インスタンスへのアクセス(HTTP/HTTPS)が許可されたセキュリティグループを選択します。
  • Next: Configure Security Settingsをクリックします。
  • Certificate typeChoose a certificate from ACM (recommended)にします。
  • CertificateをACMの手順で作成した証明書を選択します。
  • Next: Configure Health Checkをクリックします。
  • Ping ProtocolTCPにします。
  • Ping Port80にします。
  • Next: Add EC2 Instanceをクリックします。
  • 対象のEC2インスタンスをチェックします。
  • Next: Add Tagsを選択します。
  • Review and Createをクリックします。
  • Createをクリックします。

Route53

既に必要なドメインが取得されている前提です。

  • Route53ダッシュボードを開きます。
  • 左ペインのメニューからHosted zonesを選択します。
  • 対象のドメインを一覧から選択します。
  • Create recordをクリックします。
  • Simple routingを選択します。
  • Nextをクリックします。
  • Define simple recordをクリックします。
  • Record nameを入力します。
  • Value/Route traffic toAlias to Application and Classic Load Balancerとし、リージョンをEC2インスタンスが存在しているリージョンにします。
  • Choose load balancerを作成したロードバランサーに設定します。
  • Define simple recordをクリックします。
  • Create recordsをクリックします。