【祝】FargateでログドライバーにSplunkが利用可能になりました!

従来FargateのログドライバーはCloudWatchLogsのみだったのが、ついにSplunkに対応しました!今後さらなるログドライバーの追加が楽しみです。
2019.05.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Fargate、みなさん利用していますか?

ホストインスタンスの管理なしにコンテナワークロードを実行可能な超絶便利なサービスなんですが、そのAWS FargateのログドライバーにSplunkが追加されました!

AWS Fargate PV1.3 now supports the Splunk log driver

従来、FargateではログドライバーにCloudWatchLogsしか指定できなかったのですが、ついに初めてのFargateのログドライバー拡張です。こりゃやってみるしか無いでしょ!というわけで、早速試してみた様子をお届けします。

ログドライバー追加きたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

ログドライバーアップデート内容の詳細

今回のアップデートは、大きく分けて2つの部分から構成されます。

1.ログドライバーAPIの拡張

タスク定義内のコンテナ定義において利用するログドライバーが拡張されました。ログドライバーのAPIドキュメントがこちら。

以下の記述「splunk」が追加されています。

For tasks using the Fargate launch type, the supported log drivers are awslogs and splunk.
引用:LogConfiguration - Amazon Elastic Container Service

2.ログドライバーで機密情報設定のためのマネージドサービス参照可能化

SplunkのHTTPエンドポイントコレクターに接続するためのトークンのような機密情報を扱うために、ログドライバーの設定からAWS Secrets ManagerやAWS Systems Manager Parameter Storeの値を参照できるようになりました。

詳細はこちらに記載されていますが、新しくSecretOptionsという項目が追加されています。

具体的なタスク定義のスニペットは、以下で参照してみてください。

{
	"containerDefinitions": [{
		"logConfiguration": [{
			"logDriver": "splunk",
			"options": {
				"splunk-url": "https://cloud.splunk.com:8080"
			},
			"secretOptions": [{
				"name": "splunk-token",
				"valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
			}]
		}]
	}]
}

もちろん、上記設定はWebコンソールからの登録も可能です。

FargateのログをSplunkに転送してみた

というわけで、実際にFargateのログをSplunkに転送してみます。

Splunk環境の準備

まだSplunk使ったことない人は、先にSplunkを使える状態にしておきます。Splunkは、ホストインストール型もSaaS版も両方ありますが、自分はMarketPlaceからの起動が簡単なホストインストール型を利用しました。

SplunkへのHTTPイベントコレクタの登録

ログドライバーからは、SplunkのHTTPイベントコレクタ経由でログを流し込むので、事前にトークンの発行を含めたHTTPイベントコレクターの動作確認をしていきます。

設定は、公式のこちらを参考に実施してみてください。手順最後の方で、サンプルデータをcurlで投げてみて、無事データが登録されれば、HTTPイベントコレクタの設定は完了です。

curlでの動作確認例です。

$curl -k http://<host>:8088/services/collector -H 'Authorization: Splunk <token>' -d '{"sourcetype": "mysourcetype", "event":"Hello, World!"}'
{"text":"Success","code":0}

パラメータストアに、Splunkのトークンを格納

Fargateログドライバーには、以下の設定が必要になります。

  • SplunkのHTTPイベントコレクタのエンドポイントURL
  • HTTPイベントコレクタに接続するためのトークン(←こちらは機密情報)

Fargateのタスク定義内のコンテナ定義にこれらの値を設定しますが、トークンを平文で格納するのはリスクがあります。そのため、みんな大好きSystemsManagerのパラメータストアに、そのトークンをSecureStringとして登録します。

以下のコマンドで、トークンを登録します。パラメータストアの名前はsplunk-token。この値は、後手順のログドライバーの設定で利用します。

$ aws ssm put-parameter --name "splunk-token" --value "取得したトークンの値" --type "SecureString"
{
    "Version": 1
}

登録内容を確認します。

$ aws ssm describe-parameters --filters "Key=Name,Values=splunk-token"
{
    "Parameters": [
        {
            "Name": "splunk-token",
            "Type": "SecureString",
            "KeyId": "alias/aws/ssm",
            "LastModifiedDate": 1556920691.404,
            "LastModifiedUser": "arn:aws:sts::XXXXYYYYZZZZ:assumed-role/cm-hamada.koji/AAAAAAAAAAAAAAAA",
            "Version": 1
        }
    ]
}

無事にパラメータストアに登録された値のメタデータが表示されればOKです。

Fargateのタスク定義設定

ログドライバー含めたFargateのタスク定義を設定していきます。ここでは、Webコンソールで説明します。とりあえず動作確認のための最小限の設定です。

「新しいタスク定義の作成」→「FARGATE」を選択します。

  • タスク定義名:「fargate-splunk-logdriver-sample」
  • タスクロール:タスク実行中、ログドライバーのところでパラメータストアにアクセスするために、そのためのポリシーを付与しておきます
  • タスク実行ロール:任意
  • タスクCPU:任意
  • タスクメモリ:任意
  • コンテナ定義
    • コンテナ名:「splunk-logtest-container」
    • イメージ:「httpd:latest」(apacheの最新版をdockerhubから利用)

ログ設定部分は、以下の通り。

  • ログドライバー:splunk
  • ログオプション
    • splunk-url:Value:HTTPイベントコレクタのURL(下の注意を参照)
    • splunk-token:ValueFrom:splunk-token(パラメータストアに登録した名前)

Splunk-url設定上の注意点

splunk-urlに指定するURLは、実際のエンドポイントではなく、ドメイン、プロトコル、ポート部分のみ指定します。

  • 正しい例
    • https://10.0.2.217:8088
  • 誤っている例
    • https://10.0.2.217:8088/services/collector

curlなどでエンドポイントの確認をするときは下のURLを使用しますが、ログドライバーに設定するURLは上になるのでご注意ください。

上記設定を完了し、無事にタスク定義が登録できれば、前準備は完了です。

Fargateのタスクを実行し、動作を確認

いよいよ動作確認。上で定義したタスク定義を元にタスク実行します。詳細は省きますが、無事タスクがRUNNING状態になればOk。

タスクの正常起動を確認したら、Splunkのサーチ画面で、ソースにHTTPエンドポイントコレクターの名前を指定して検索してみます。サーチクエリ例は以下の通り。

source="http:fargate-logdriver-collector" (index="history" OR index="main" OR index="summary")

こんな感じで、コンテナ内のログが無事イベント検索できたらOkです。いやっほぅ!!

後は、Splunkの世界の話なので、ログを煮るなり焼くなり好きにすれば良いんじゃないでしょうか。

ログドライバーにおけるSplunkとCloudWatchLogsのコンソール相違点

ログドライバーにCloudWatchLogsを使用していた場合は、タスク画面にLogsタブがあり、そこでもログの簡易的な検索は可能でした。

対して、ログドライバーにSplunkを使用する場合は、タスク画面にそもそもLogsタブがありません。すべてSplunk側で確認する必要がありますので注意しましょう。

今後のFargateログドライバー拡張が期待できるアップデート

ECS(on EC2)では、元々ログドライバーとして、「json-file | syslog | journald | gelf | fluentd | awslogs | splunk」などが用意されています。対して、ECS(on Fargate)では、今までCloudWatchLogs(awslogs)しか対応していませんでした。

慣れたログプラットフォームをFargateでも使いたいという要望は常にあったわけですが、そこに最初にやってきたのが、Splunkというわけです。

今後、fluentdなどの対応も予定されていますので、Fargateのログドライバーの拡張、これからもどんどん広がっていけば、もっと便利にFargateを利用できるシチュエーションが増えそうです。

それでは、今日はこのへんで。濱田(@hamako9999)でした。

関連記事

Splunk馴染みが無い方は、こちらの公式チュートリアルをやってみると、凄さが際立ちます。ステキです。

SplunとAWSとの統合に関しては、こちらを参考にしてみてください。