AWS S3 上のデータをなるべく簡単に Splunk に取り込んでみる


## はじめに

最近では AWS S3をベースとしたデータレイクを構築してデータをまとめているケースも多くあると思います。そこで今回はS3上のログをSplunkに取り込むまでをやってみたいと思います。いろいろな取り込み方法があるのですが、今回はとにかくシンプルかつ早い設定をテーマにやってみます。

##設定の流れ
大きく分けると AWS上の設定とSplunk上の設定の２つが必要になります。

**AWS上の準備・設定**
1. AWS S3 Bucket の作成
2. S3 上にデータをアップロード
3. IAMユーザー作成 & ポリシー作成しユーザーへの権限付与

**Splunk上の設定**
4. APPの追加 (Add-on for AWS)
5. Configuration (IAM User追加)
6. Input設定

## AWS上の設定

###1. AWS S3 Bucket の作成

まずは通常通り S3 Bucke を作成します。Publicアクセスはすべてブロックで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/10ce2884-67e6-b2f9-359c-7d0bad013ec9.png)

###2.S3上にデータをアップロード
今回は Splunk [tutorial data](http://docs.splunk.com/images/Tutorial/tutorialdata.zip) 内にある access.log をアップロードしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/42f707f6-53b9-04d5-0af1-e0eaeb21f207.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/93fb5cee-3942-4ef5-5cfa-c6f25696ed09.png)
アクセス許可は特に追加する必要はありません。（デフォルトのままでOK) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/210c3200-3384-96b0-0b15-522e716118b1.png)
プロパティも「スタンダード」でアップします。（他のクラスでも多分大丈夫かと）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d4ecaa4a-3577-5bb4-450c-691f4a67de13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/04ae8d4e-419c-2596-aef5-1025f2174007.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1286bb25-3e0c-9291-b34c-b9be20772b4a.png)

###3. IAMユーザー作成

次に 外部からS3にアクセスできるようにユーザーと権限の設定をしていきます。まずはユーザー作成から。
[IAM]サービス -- [ユーザー」 -- [ユーザー追加]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/45bc8d0a-1632-2c7c-6ca1-d8868e879db6.png)
*「プログラムによるアクセス」にチェックを入れるのを忘れずに！！*

次にアクセス許可設定ですが、「既存のポリシーを直接アタッチ」をクリックして、「ポリシーの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/24ef64ad-7d1d-ff6f-533a-2cf9fda6d66c.png)

「ポリシー作成」 - [JSON] 設定画面にて以下のように上書き　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/3126f1c5-579b-ed40-6b89-1a252f8271fc.png)

（下をコピペして使ってください）

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:ListAllMyBuckets",
        "kms:Decrypt"
      ],
      "Resource": "*"
    }
  ]
}
```

適当にポリシー名を作成して完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/cdd84ba6-a808-cb57-9b32-76e481ac6f2b.png)

ポリシー追加画面に戻って、「更新」をしてから、作成したポリシーを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7989b1ed-f72c-87ec-0220-b9e45392b9c2.png)

タグは特に不要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5ee555f8-9e05-5f05-71f3-2fbd01bc3897.png)

ユーザー追加も不要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/218c63ac-e07c-88ec-601b-ab2b825e595d.png)

アクセスキーとシークレットアクセスキーは後で使うので大事に保存しておいてください。(csvをダウンロードしておく) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/9dca4887-39dc-de7d-d32b-ae682a810831.png)

これで、AWS側の設定は終了です。

## Splunk側の設定

### 4. APPの追加 (Add-on for AWS)
Splunk Add-On for AWS をSplunkにインストールします。
https://splunkbase.splunk.com/app/1876/ 

ここではインストール方法については割愛します。

### 5.Configuration (User追加)
Splunk Add-on for AWS アプリを開き、 [Configuration] - [Account] に移動し、追加ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/cdad3afa-ecef-7285-7262-ca3dd7a67ed4.png)

3.で作成した AWS のユーザー (qiita-access)のアクセスキーとシークレットアクセスキーを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/10c89c1d-8fb4-3362-3e22-7c26dc25c4a4.png)

こんな感じでユーザーが追加されれば OK!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1b0ab563-c4d4-d548-48e7-3688407680d8.png)

### 6. Input設定

それではおまたせしました。S3上のデータを取り込みましょう！！ (イエーイ) 

右上の「設定」ー「データ入力」　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/32d9fa44-1823-8a77-54ba-6a7fd19bf617.png)

[AWS S3] という項目があるので、 [add new] で追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/cf43a56a-ff6e-813d-ab32-9b7443728a51.png)

必須記入項目である以下の３つを入力。 (必要に応じて他の項目を入力してください）
・ Name : s3demo
・ AWS Account : qiita-access　(先ほど追加したユーザー)
・ Bucket Name : s3input-demo  (先ほど作成した S3 Bucket Name)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7dbb0330-f524-9ec9-1a47-5bea59fc2fe4.png)

一番下の「more settings」チェックを入れて追加入力項目を編集します。
- Interval : 30 (default) <-- データを取りに行く Polling time
- Set Sourcetype : From list  <-- データのソースタイプに併せて選択してください。今回はTutorial DataでSourcetypeがわかっているため access_combined を指定します。
- Host: aws_s3  <-- データのメタ情報として追加するHost名。今回は適当に入力しておきます。
- Index : aws-s3  <-- 今回S3上のデータをSplunk内のどのIndex に取り込むか。 予め aws-s3 という Indexを作ってあるためそれを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/b1727da1-78ed-b141-1835-dbff6d42af20.png)



Splunk の設定も以上です。

## データの確認

それでは、データが取り込めているか確認してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5982c71d-887f-3e3a-ef77-fbe773037594.png)

ちゃんと、ソースタイプを理解して Field抽出もできております。

もし、データ取り込みがうまくいかない場合は、 Add-Onアプリの「Health Check」 - [S3 Inputs Health Details]からエラーを確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/a2a1d1e4-990b-9c8d-5d9e-ea6ddedf4b17.png)

こんな感じでエラー情報が確認できます。（メッセージ内容は今回の取り込みのものではありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/f8b25a72-0ac7-fae3-4d01-98a76a80ccb8.png)


##その他

ドキュメントに書かれていた利用時の追加情報です。
https://docs.splunk.com/Documentation/AddOns/released/AWS/S3#Configure_a_Generic_S3_input_using_Splunk_Web

### S3内の特定のデータのみ抽出したい場合
S3 Bucket単位で設定可能ですが、同じS3 Bucket内に様々なデータがある場合、全部を取り込むのはコストがかかるのでやりたくないですよね。
そのような場合に、特定のファイルのみ取り込むような設定ができます。

Input設定の箇所で、オプション項目が沢山ありましたが、そこでファイル名の Prefix や 正規表現による White / Black List設定、Time Rangeによる設定などが可能です。詳細はこちらのマニュアルをご覧ください。
https://docs.splunk.com/Documentation/AddOns/released/AWS/S3#Configure_a_Generic_S3_input_using_Splunk_Web

### 圧縮ファイルの対応

データ入力では、以下の圧縮形式をサポートしています。
ZIP、GZIP、TAR、またはTAR.GZ形式の単一ファイル
ZIP、TAR、またはTAR.GZ形式のフォルダを含む、または含まない複数のファイル
https://docs.splunk.com/Documentation/AddOns/released/AWS/S3#Configure_a_Generic_S3_input_using_Splunk_Web

### 大量のデータ取り込みについて

S3 バケットに非常に多くのファイルが含まれている場合、1 つの S3 バケットに対して複数の S3 入力を設定することでパフォーマンスを向上させることができます。その際に同じファイルを重複して取り込まないように、各入力設定で取り込むファイルを分類しながら取り込む必要があります。また、１つの入力設定で１つのソースタイプしか指定できないため、データの種類が複数ある場合は、別の入力設定にした方が良さそうです。

Splunkでは、データ量が多いPull型取得の場合は SQSを使った取り込みを推奨しております。そうすることでQueueにデータを貯める事ができ、Add-On側を増やす事でスケールできるのと、再送してくれるためデータの信頼性が増します。また Kinesis Firehoseや Lamdaを使った Push型のデータ取り込みも推奨しております。

### S3 上の古いデータについて
ベストプラクティスとして、S3バケットのコンテンツを積極的に収集する必要がなくなったらアーカイブしましょう。

AWSでは、入力がバケットをスキャンして新しいファイルや変更されたファイルを探すために使用するリストキーのAPIコールに課金されるため、古いS3キーを別のバケットやストレージタイプにアーカイブすることでコストを削減し、パフォーマンスを向上させることができます。

### 取り込みデータに関する注意点
S3 データ入力は、頻繁に変更されるファイルを読み込むことを目的としていません。ファイルがインデックス化された後に変更された場合、Splunk はそのファイルを再度インデックス化してしまい、データが重複してしまいます。

key/blacklist/whitelist オプションを使用して、後で変更されないことがわかっているファイルのみをインデックス化するよう設定してください。


## 最後に

今回はなるべくシンプルにということで、直接S3へPollingして取り込む方法をご紹介しました。一方で大量のデータを捌くためにはSplunkのInputを増やしても、データを重複せずに取れるようにするために、SQSを用いた構成が推奨されております。こちらの構成については次回チャレンジしたいと思います。



## 参考情報

Splunk Add-On for AWS Documents
https://docs.splunk.com/Documentation/AddOns/released/AWS/Description

取り込みに必要な IAM Policy Permission
https://docs.splunk.com/Documentation/AddOns/released/AWS/ConfigureAWSpermissions#Configure_S3_permissions

Sizing Information
https://docs.splunk.com/Documentation/AddOns/released/AWS/Sizingandcost