AWS
kubernetes

EKSコントロールプレーンのログをAmazon Elasticsearch Serviceに取り込む


はじめに

以前、自前で構築したKubernetesクラスターの監査ログを出力する設定を試しましたが、マネージドサービスではどうするのだろうと思い、EKSで試してみました。ついでにElasticSearchも使ってみました。


コントロールプレーンログの種類


  • Kubernetes API サーバーコンポーネントログ

  • 監査 (audit

  • 認証 (authenticator)

  • コントローラーマネージャー (controllerManager)

  • スケジューラ (scheduler)

詳細はドキュメントを参照してください。


環境


  • macOS Mojave 10.14.4

  • aws-cli 1.16.150

  • eksctl 0.1.32


クラスター作成


command

eksctl create cluster --name es-demo --region ap-northeast-1 \

--nodes 2 --nodes-min 1 --nodes-max 2 --node-type t2.medium \
--version=1.11 --tags environment=staging


コントロールプレーンログの有効化

ログを有効化します。


command

aws eks --region ap-northeast-1 update-cluster-config --name es-demo \

--logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'


output

{

"update": {
"id": "efa07ef9-c033-4eb6-8b04-2e72973dfa2a",
"status": "InProgress",
"type": "LoggingUpdate",
"params": [
{
"type": "ClusterLogging",
"value": "{\"clusterLogging\":[{\"types\":[\"api\",\"audit\",\"authenticator\",\"controllerManager\",\"scheduler\"],\"enabled\":true}]}"
}
],
"createdAt": 1557893574.467,
"errors": []
}
}

update.statusがSuccessfulとなったことを確認します。


command

aws eks --region ap-northeast-1 describe-update --name es-demo --update-id efa07ef9-c033-4eb6-8b04-2e72973dfa2a



output

{

"update": {
"id": "efa07ef9-c033-4eb6-8b04-2e72973dfa2a",
"status": "Successful",
"type": "LoggingUpdate",
"params": [
{
"type": "ClusterLogging",
"value": "{\"clusterLogging\":[{\"types\":[\"api\",\"audit\",\"authenticator\",\"controllerManager\",\"scheduler\"],\"enabled\":true}]}"
}
],
"createdAt": 1557893574.467,
"errors": []
}
}


CloudWatch Logsの確認

/aws/eks/es-demo/clusterロググループにログが出力されていることを確認します。

cw_log_groups.png

cw_logs.png


Elasticsearchドメイン作成

マネジメントコンソールからドメインを作成します。ここではドメイン名をes-demoとします。


IAMポリシー作成

LambdaからElasticsearchを利用するためのポリシーを作成します。ポリシー名はLambdaForElasticsearchとしておきます。

{

"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "es:*",
"Resource": "*"
}
]
}


IAMロール作成

LambdaからElasticsearchを利用するためのロールを作成します。アタッチするポリシーは以下の2つです。


  • AWSLambdaVPCAccessExecutionRole

  • LambdaForElasticsearch(前の手順で作成)


CloudWatchからElasticseachへのストリーミング開始

CloudWatchでロググループを選択して「Amazon Elasticsearch Serviceへのストリーミングの開始」をします。ここまでに作成したESドメインやIAMロールを利用します。ログ形式はどう指定すべきか悩んでいます。

streaming.png

サブスクリプションの設定ができればOKのはずですが、力尽きました。


まとめ

EKSコントロールプレーンのログをCloudWatchに出力するのは簡単にできました。自前クラスターより簡単で、さすがマネージドサービスといった感じです。Elasticsearch連携はまだまだ理解が足りず、適当になってしまいました。


参考