ログ・シリーズ|EKSコントロールプレーンのログをS3に保存する
参考
*このカテゴリのマガジンはこちら!
結論
CloudWatchログをS3に保存するには、結局以下の2つの方法が主流ぽい。
1.のエクスポートは、何か面倒な理由があったので、基本的に2.のKinesisを使用する方針で行く。
S3へエクスポート
Kinesis使う
構成
前準備|EKS
EKSクラスタを構築する時に、ログを有効化しておく。
ログ種類は、以下参照。
CloudWatchLogグループは、/aws/eks/<クラスタ名>/cluster。ロググループ名は、変更出来ない模様。
このロググループの中に、以下ログ種類ごとのログストリームが存在する形。各ログストリーム名は、以下に。
APIサーバー
KubectlコマンドなどでコールされるEKS(Kubernetes)APIのログ。詳細については、Kubernetes ドキュメントの kube-apiserver を参照してください。
ログストリーム:kube-apiserver-<nnn...>
監査
クラスターに影響を与えた個々のユーザー、管理者、またはシステムコンポーネントについて記録します。詳細については、Kubernetes ドキュメントの Auditing (監査) を参照してください。
ログストリーム:kube-apiserver-audit-<nnn...>
スケジューラ
スケジューラコンポーネントは、クラスターでポッドを実行するタイミングと場所を管理します。詳細については、Kubernetes ドキュメントの kube-scheduler を参照してください。
ログストリーム:kube-scheduler-<nnn...>
Authenticator
認証ログは、各 Amazon EKS に固有です。これらのログは、Amazon EKS が使用するコントロールプレーンコンポーネントに対応します。各コンポーネントは、Amazon EKS が、Kubernetes の (IAM 認証情報を使用する) ロールベースのアクセスコントロール (RBAC) 認証のために使用しています。
ログストリーム:authenticator-<nnn...>
コントローラマネージャー
コントローラーマネージャーは、Kubernetes に同梱されている主要なコントロールループを管理します。詳細については、Kubernetes ドキュメントの kube-controller-manager を参照してください。
ログストリーム:kube-controller-manager-<nnn...>
ログの転送先となるS3 バケットを準備する
S3バケットを準備する。
EKSのログのみではないはずなので、S3バケットの中に各種のログを分けるためにPrefixまで考えておく。
S3バケットは、本番、ステージング、開発・・・のような環境で分けておくことが個人的には、多い。
Prefixは、EKS-ControlPlane-Logs/のなど。注意点としてPrefixの最後に/(スラッシュ)を入れておくこと。入れないと、2022などの年がEKS-ControlPlane-Logs2022などのようになってします。
Kinesis Data Firehose 用のロールを作成する
KinesisがS3への書き込みなどが出来るためのロールを作る。
ロールには信頼ポリシーと、機能ポリシーの2つ。
信頼ポリシーとCLIコマンド
[TrustPolicyForFirehose.json]
{
"Statement": {
"Effect": "Allow",
"Principal": { "Service": "firehose.amazonaws.com" },
"Action": "sts:AssumeRole"
}
}
aws iam create-role \
--role-name <ロール名> \
--assume-role-policy-document file://~/TrustPolicyForFirehose.jso
機能ポリシーとCLIコマンド
[PermissionsForFirehose.json]
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:PutObject" ],
"Resource": [
"arn:aws:s3:::<my-bucket>",
"arn:aws:s3:::<my-bucket/*>" ]
}
]
}
aws iam put-role-policy \
--role-name <ロール名> \
--policy-name Permissions-Policy-For-Firehose \
--policy-document file://~/PermissionsForFirehose.json
上記内の<ロール名>は、どちらも同じロール名。
Kinesis Data Firehoseの作成
CloudWatchLogsから受け取ったデータをS3に転送するKinesis Data Firehoseを作成します。
Kinesis Data Firehose で、Create Delivery Streamを選択。
Source::Direct Put
Destination Setting => S3 bucket:作成済みのS3バケットを選択
Delivery stream name:適当な名前に
Data transformation: Disabled
Record format conversion: Disabled
Dynamic partitioning: Disabled
S3 bucket prefix - optional: Prefix(ディレクトリ感覚)
注意: Prefix文字の最後に/(スラッシュ)を付ける
S3 bucket error output prefix - optional:
上記のPrefx文字に”-error/”と付けたもの
Buffer size:5MB(デフォルト)
Buffer interval:300秒(デフォルト)
Compression for data records: Disabled
CloudWatch Logs から Kinesis Data Firehose に送信されたデータは、すでに gzip(レベル6)で圧縮されているため、Kinesis Data Firehose 送信ストリーム内で圧縮する必要はありません。Encryption for data records: Disabled
Server-side encryption: Disabled
Amazon CloudWatch error logging: Enabled
Permissions>Choose existing IAM Roleで、作ったIAMロールを指定
CloudWatch Logs 用のロールを作成する
Kinesis Data Firehose にデータを書くための権限を CloudWatch Logs に付与する。
*「IAM コンソールを使用してポリシーを作成しないでください」と公式ページに記載あり
*jsonの<リージョン>と<アカウント>部分は、それぞれ書き換える
信頼ポリシーとCLIコマンド
[TrustPolicyForCWL-Kinesis.json]
{
"Statement": {
"Effect": "Allow",
"Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": { "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AWSアカウント>:*" }
}
}
}
aws iam create-role --role-name <CWLtoKinesisRole> \
--assume-role-policy-document file://~/TrustPolicyForCWL-Kinesis.json
権限ポリシーとCLIコマンド
続けて、作ったIAMロールに権限を付与します
[PermissionsForCWL-Kinesis.json]
{
"Statement":[
{
"Effect":"Allow",
"Action":["firehose:*"],
"Resource":["arn:aws:firehose:ap-northeast-1:<AWSアカウント>:*"]
}
]
}
aws iam put-role-policy --role-name <CWLtoKinesisRole> \
--policy-name Permissions-Policy-For-CWL \
--policy-document file://~/PermissionsForCWL-Kinesis.json
CWLにサブスクリプションフィルターを設定する
対象のロググループにサブスクリプションフィルターを設定します。
ロググループから「サブスクリプションフィルター」を選択し、
「作成」→「Create Kinesis Firehose subscription filter」
Destination account: 現在のアカウント
Kinesis Firehose delivery stream: 先程作成したものを選択
既存のロールを選択:先程CWL向けに作ったロールを選択
ログの形式: その他
サブスクリプションフィルターのパターン: ー
サブスクリプションフィルター名: わかりやすい名前
確認
ログの転送先となるS3 に、ログファイルが転送されていることを確認。
ファイル名に拡張子は付いていないが、gz圧縮されている。
S3のライフサイクルルールの設定
S3に保存されているこを確認したら、そのPrefixに対してライフサイクルルールを設定する。
合わせてCloudWatchLogsグループの失効期間もデフォルトで「失効しない」となっているはずなので、短くしておく。
ライフサイクルルール
ルール名: 適当
プレフィックス: わかりやすい文字列。最後に必ずスラッシュ。
オブジェクトタグ: 使う人は、設定する
オブジェクトサイズ: 使う人は、設定する
オブジェクトが現行バージョンでなくなってからの日数:
保存期間を日数で指定する
この記事が気に入ったらサポートをしてみませんか?