VPC フローログの配信先に Kinesis Data Firehose を指定してみた

2023.01.03

アノテーション、テクニカルサポートチームの村上です。好きな AWS サービスは、Kinesis Data Firehose です!
Kinesis Data Firehose を好きな理由は、とりあえず S3 に突っ込んでおけという豪快な使い方もできれば、Lambda を使ったデータ変換や動的パーテーションに対応する柔軟性を併せ持つからです。
そんな Kinesis Data Firehose が、2022 年 9 月から VPC フローログの配信先に指定可能となったので、実際に設定してみることにしました。

試してみた構成

VPC フローログの配信先を Kinesis Data Firehose として、Kinesis Data Firehose の送信先は AWS マネージドサービスでログの解析に利用できる OpenSearch としてみました。
Kinesis Data Firehose からサードパーティー製ログ分析ツールへのログ配信については、下記 AWS ブログで紹介されています。
Introducing Amazon VPC Flow Logs to Kinesis Data Firehose

Kinesis Data Firehose から Datadog へのログ転送については、下記ブログで取り上げられていたので設定の際の参考にしていただければと思います。

本ブログでやること

  • Kinesis Data Firehose の送信先に OpenSearch を指定
  • VPC フローログの配信先に Kinesis Data Firehose を指定

やらないこと

  • Kinesis Data Firehose においての Lambda を利用したデータ変換
  • OpenSearch Dashboard 内の設定

設定時ハマりポイント

  1. 2023 年 01 月 02 日現在、Kinesis Data Firehose の送信先に OpenSearch バージョン 2.3(最新バージョン)を指定できません。OpenSearch バージョン 2.3 を Kinesis Data Firehose の送信先に指定して、ストリームを作成しようとしたところ、OpenSearch バージョンが対応していないとのエラーが発生しました。バージョン 1.3 で OpenSearch を再作成したところ、ストリームの作成に成功しました。

  2. パブリックアクセスを可能とした OpenSearch へブラウザからアクセスする際に、ドメインレベルのアクセスポリシーを編集して、利用中の IP アドレスを許可する必要があります。以下の AWS ナレッジを参考にして対応しました。
    Amazon OpenSearch Service クラスターにアクセスしようとすると、「ユーザー: 匿名は認証されていません」というエラーが表示されます

下準備

VPC を作成

VPC フローログを取得する為の VPC を、VPC-Flow-Logs-vpc という名前で作成しました。
インターネットからインターネットゲートウェイを経由して、パブリックサブネットへアクセスが可能な構成にしています。

EC2 を作成

VPC 内に、ネットワークインターフェース(ENI)を持ったアクティブなリソースが無い状態だとフローログが作成されない為、VPC 内に EC2 を作成してフローログを取得できるようにします。

EC2 設定

名前:Flow-Logs-Test
インスタンスタイプ:t2.micro
ストレージ:8 GiB (gp2)
パブリック IP アドレスの自動割り当て:有効
セキュリグループのインバウンドルール:自分の IP からの SSH トラフィックを許可

※ EC2 への遠隔操作が可能なように自分の IP からの SSH トラフィックを許可していますが、インバウンドルールを全て削除して全ての通信を遮断する設定でも問題ありません。

S3 を作成

Kinesis Data Firehose でエラーが発生した際に、ソースレコードをバックアップする為の S3 を作成します。
バケット名は、 kinesis-data-firehose-error-20230102 としました。

OpenSearch を作成

Kinesis Data Firehose の送信先である OpenSearch を作成します。
マネジメントコンソール上の検索窓に「opensearch」と入力して、Amazon OpenSearch Service を選択します。

Amazon OpenSearch Service ダッシュボード右上にある「Create domain」ボタンを押下して、ドメインを作成します。

次画面

検証環境においての一時的な利用の為、OpenSearch の設定は以下のようにしました。

ドメイン名:vpc-flow-logs
デプロイタイプ:開発およびテスト
バージョン:1.3
アベイラビリティゾーン:1-AZ
データノード:t3.medium.search
ノード数:1
ネットワーク:パブリックアクセス
きめ細かなアクセスコントロール:設定オフ

他設定は、全てデフォルト設定のままとなります。
なお、テクニカルサポートとして本番環境の Amazon OpenSearch Service では、上記設定は全く推奨致しません
本番環境で Amazon OpenSearch Service を利用される際は、Amazon OpenSearch Service のベストプラクティスを参考にした構成をご検討ください。
Amazon OpenSearch Service の運用上のベストプラクティス

やってみた

Kinesis Data Firehose を作成

Kinesis Data Firehose ダッシュボード右上にある「配信ストリームを作成」ボタンを押下して、配信ストリームを作成します。

ソースに「Direct PUT」をプルダウンメニューから選択、送信先には「Amazon OpenSearch Service」を選択します。

「送信先の設定」項目まで、画面を下にスクロールして「Browse」ボタンを押下します。
インデックス名はとりあえず「index01」としました。

先程作成した OpenSearch 「vpc-flow-logs」が表示されるので、チェックボックスにチェックを入れた後に「Choose」ボタンを押下します。

「バックアップの設定」項目まで画面を下にスクロールして「Browse」ボタンを押下します。
表示される S3 の中から先程作成した kinesis-data-firehose-error-20230102 を選択した後に「Choose」ボタンを押下します。この設定をすることで、Kinesis Data Firehose から OpenSearch へのレコード送信が失敗した場合に、ソースレコードが指定されている S3 へ保存されます。

画面を一番下までスクロールして、「配信ストリームを作成」ボタンを押下し、配信ストリームを作成します。

OpenSearch を送信先とする Kinesis Data Firehose の作成に成功しました!

VPC フローログを作成

VPC ダッシュボードにおいて予め作成しておいた VPC-Flow-Logs-vpc を選択した後、画面右下にある「フローログを作成」ボタンを押下します。

フローログの設定画面において、送信先に「同じアカウントの Kinesis Firehose に送信」を選択して、配信ストリーム名に先ほど作成した PUT-OPS-A0Nrd を選びます。
Kinesis Data Firehose の作成時に、配信ストリーム名をデフォルトのままとしてしまったので、PUT-OPS-A0Nrd という分かりにくい配信ストリーム名となってしまいました。

配信先タイプに Kinesis Data Firehose を指定した VPC フローログ test-flow-logs を作成することができました!

VPC フローログが送信されているか確認してみた

実際に VPC フローログが Kinesis Data Firehose を経由して、OpenSearch に送信されているか確認をしてみます。
Amazon OpenSearch Service ダッシュボード上で、ドメイン vpc-flow-logs を指定して、OpenSearch Dashboard の URL へアクセスします。

アレ? なぜか認証でエラーとなり OpenSearch Dashboard へアクセスができませんでした。


パブリックアクセスを許可していたので、ブラウザに URL を張り付ければ OpenSearch Dashboard へ接続できるかと思っていたのですが、何かしら追加の設定が必要なようです。
エラー内容を検索してみたところ、下記の AWS ナレッジに解決策がありました。

Amazon OpenSearch Service クラスターにアクセスしようとすると、「ユーザー: 匿名は認証されていません」というエラーが表示されます

リクエスト署名をサポートしていないクライアント (ブラウザなど) を使用している場合は、以下の点を考慮してください。
・IP ベースのアクセスポリシーを使用します。IP ベースのポリシーは、OpenSearch Service ドメインへの署名なしのリクエストを許可します。

IP ベースのアクセスポリシーを設定することで、署名なしのリクエストも許可できるとのことなので、OpenSearch の設定を変更してみます。

ドメイン vpc-flow-logs を選択した状態で、セキュリティ設定タブを選択し、編集ボタンを押下します。

ドメインレベルのアクセスポリシーを以下のように編集して、利用中の IP アドレスを許可するようにしました。

IP ベースのポリシー

上記の設定を追加したところ、OpenSearch Dashboard へのアクセスが可能となり、VPC フローログが Kinesis Data Firehose を経由して、OpenSearch へ送信されていることを確認できました!

赤枠で囲まれている eni-0589e393cbb81f539 は EC2(Flow-Logs-Test)のネットワークインターフェースであり、10.0.13.111 も EC2(Flow-Logs-Test)のプライベート IP アドレスであることから、VPC(VPC-Flow-Logs-vpc)のフローログであることが分かります。
インターネット上から EC2(Flow-Logs-Test)へ様々なアクセスがあり、いずれも REJECT(拒否)となったことが確認できます。

まとめ

ログの視認性を良くする為に、Kinesis Data Firehose の Lambda によるデータ変換を利用して、UnixTime を UTC や JST に変換してみるのもいいかもしれませんね。
この記事がどなたかのお役に立てば幸いです。

参考資料