Kinesis FirehoseからSplunkにデータ取り込む際にハマった SSL証明書周りの設定


## はじめに

これまで様々なAWSのログをSplunkに取り込んできましたが、Kinesis Firehoseを使った VPC Flowログの取り込みの際にハマった SSL証明書の取得(ACM)やそれを利用するために必要なサービス設定まで備忘録のためにまとめておきたいと思います。

ちなみに今回証明書はAWSのACMサービスを活用しているため、SplunkもAWS上にある必要があります。オンプレの場合は今回の記事は全く参考になりませんのでご注意を。

## なぜこんなことに

そもそも何故こんな面倒な設定が必要かというと、Kinesis Firehose経由でデータを取りこむためには、SSL通信が必須でして、そのため受信側 (今回はSplunk側)に証明書が必要になります。しかもオラオラ証明書だとエラーになってしまうため、CA署名の証明証が必要になります。ただ普通に購入すると高い！今回は検証なので安く済ませたいのです。

そこでAWSが提供しているフリーの証明書サービス (ACM) を利用したのですが、条件として利用できるサービスが限られております。そのため今回は証明書付与がサポートされているELBを前段に配置しました。また証明書取得の際にDomain登録が必要なのですが、ELBのドメインだとエラーになってしまったため、今回はフリーのドメインを取得することにしました。またDNS管理サービスとしてRoute53が必要になりました。

という経緯でこんな複雑な構成をとるに至りました。（ちょっとした検証をしたかっただけなのに・・・）

## Kinesis Firehose を使った VPC Flowログの Splunkへの取り込み方法

基本的な VPC Flowを Kinesisを使ってSplunkに取り込む設定方法はチュートリアルがしっかり整ってまして、そちらをベースに設定を行えば問題なく出来るかと思います。

チュートリアル
https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/vpc-splunk-tutorial.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/40377bda-76da-a191-55f2-47ddc1ff08a0.png)

また@kikeyama さんがすでにわかりやすい記事を書かれていたので、そちらも参考にさせて頂きました。（ありがとうございました）
https://qiita.com/kikeyama/items/bb609cb90269019962cb

そのためここでは、チュートリアルに記載されている以外の証明書まわりを中心にまとめたいと思います。


## 構成イメージ

Kinesis Firehose までの設定や Splunk側の設定は今回の対象外です。チュートリアルなどを参照ください。それ以外の証明書設定やDNS,ELBといったサービスイメージです。Domain名取得には今回Freenomという外部サービスを使いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/c78887d0-a89a-7ac7-b7c3-552b5b9f1df7.png)

## 設定の流れ

1. DNSサービス設定 (Route53)
2. Free Domain取得 (Freenom)
3. 証明書作成 (ACM)
4. ロードバランサ＋証明書設定 (ELB)

### 1. DNSサービス設定 (Route53)

まずは Route53にてDNSを作成します。
[Route53] - [ホストゾーンの作成] 

1. ドメイン名は後ほど取得予定のドメイン名を記入します。（先にドメイン取得してからでもOK)
2. タイプは「パブリックホストゾーン」

とりあえず以上です。NSタイプにある４つの name server名は後で利用します。


### 2. Free Domain取得 (Freenom)

次にFree Domainを取得します。今回は Freenom というサイトを利用しました。
https://www.freenom.com/ja/index.html

まずは好きなDomain名を入力してみます。 .tkとか .mlなど無料で利用できる海外ドメインが現れますので、利用できるドメイン名を .mlなども含めた形で再度検索してから、チェックアウトをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/766792f5-aa9e-3513-fca2-acbc493773ed.png)

利用期間を選択して、continue します。（最大 12ヶ月まで無料）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e6b810a5-327f-6154-912c-fa60b63624c8.png)

ここで一旦ユーザー登録してログインが必要になります。（海外サイトなので不安な方はお辞めください）

ログインして、[Service]  - [MyDomain] に移動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/fc0d05cd-991d-3ef0-02e9-18baa51d8c30.png)

チェックインしたDomainが表示されます。その欄の右側の「Manage Domain」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/dd8676f3-9eb0-4795-60c2-5113bfad0066.png)


Management Tools から Nameservers をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/688fe50e-b634-19c0-a431-3da24d60cc86.png)

Route53より、Nameserver 名を４つほどコピペします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/44fbb4f4-5038-6b4f-dcf6-096260d0089a.png)

コピペする Route53側のソース元はこちらです。 ns- で始まるものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/03f956c0-ea1a-5009-6f5e-39eabd0d9241.png)

### 3. 証明書取得

次に ACMを使って証明書を取得します。

[ACM]-[証明書リクエスト]-[パブリック証明書リクエスト] 
ちなみにプライベート証明書で試しましたがエラーになります。

先ほど取得したドメイン名を記入します。ちなみにELBのドメインだと後ほどエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/39842df2-3677-49e7-6d56-bb33444b6794.png)

ここで DNS検証を選びます。Eメール検証だと先ほど登録したドメインのアドレスに確認メールが飛ぶため、今回はDNS検証になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/85757f1f-0545-bc47-fbba-4075dde3869c.png)

その後そのまま進んで完了させます。

このように検証保留中になっているかと思います。この後DNS検証を行い正式に発行済という状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ad0c3532-79b4-fe94-787c-e8e5525016e6.png)

それでは、DNS検証に移っていきましょう。
少し下のドメインの箇所を開くと、CNAMEの名前と値が確認できます。こちらをRoute53に登録していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/3ce5ce28-e615-ddb0-9be8-e8c9359bb157.png)

再び Route53に戻り、対象のホストゾーンを選択して、「レコードセットの作成」をクリックします。
先ほどの CNAMEの名前と値を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/c8359f2a-9101-5557-e55b-6e5c287af2b6.png)

Route53側の設定を完了し、これでしばらくすると先ほどの証明書のステータスが発行済に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/99e1929c-da2f-04c0-1516-757d7a0779ed.png)

これで証明書取得は完了です。

### 4. ELB設定

まずは証明書を埋め込むELBを設定します。

[EC2] - [ロードバランサー] - [ロードバランサーの作成] 

1. ロードバランサーの種類は Application Load Balancer を選択します。
2. リスナーは HTTPS で 443 ポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/fb2d197b-fe18-7513-6fcd-b19a63c69dce.png)

3. 証明書は先ほど作った証明書を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/09c8d235-ac0d-0ec3-6a8c-3d41b6847d6a.png)

4. セキュリティグループは 443 のみ許可
5. ターゲットグループの作成。 
HPTTS の 8088を登録します。またヘルスチェックのパスは、 */services/collector/health/1.0*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/4ed4c9fc-7963-16db-dc43-7fff493e2922.png)
6. 最後に、対象となるSplunkサーバインスタンスを登録

ELBの設定は以上です。

ただし忘れてはならないのが、DNSへのELBを登録です。これを忘れるとDNSに問い合わせても対象のサーバを照会してくれません。そのためRoute53に ELBエイリアスを登録しておく必要があります。


[Route53]-対象の[ホストゾーン]を選択して、「レコードセットの作成」をクリックします。
タイプはAを選択し、エイリアスにすると、ELBドメインが選択できるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/32da52ef-87ad-28ae-39dc-4604528ddceb.png)

これでDNS名からELBエイリアスが引けるようになりました。


## 確認

ブラウザーで作成したドメイン名を httpsで検索すると、[404 Not Found]のエラーメッセージが表示されますが、これは裏では 8088にアクセスしているだけなので当然の結果です。

見て欲しいのは、証明書の鍵のマークをチェックすると、証明書が有効になっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/8c866dfe-ba00-e8e3-cc33-d4f50f4242dd.png)

## 最後に

これで kinesis firehose から splunkにログが流れるはずです。

証明書問題が解決していない場合は、kinesisの方から見ると以下のようなエラーメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/b1443a18-b3d3-bdff-e53d-2eddc6d6cf49.png)

ちなみに kinesis firehoseを使って取り込めるサービスとソースタイプはこちらです。
https://docs.splunk.com/Documentation/AddOns/released/Firehose/Sourcetypes

設定は面倒ですが、ドメインも証明書もフリーで利用出来るので検証などには持ってこいだと思いますのでお試しあれ。