ログ・シリーズ|EKSコントロールプレーンのログをS3に保存する

参考

*このカテゴリのマガジンはこちら!

結論

CloudWatchログをS3に保存するには、結局以下の2つの方法が主流ぽい。
1.のエクスポートは、何か面倒な理由があったので、基本的に2.のKinesisを使用する方針で行く。

  1. S3へエクスポート

  2. Kinesis使う


構成

EKSからログまで

前準備|EKS

EKSクラスタを構築する時に、ログを有効化しておく。
ログ種類は、以下参照。
CloudWatchLogグループは、/aws/eks/<クラスタ名>/cluster。ロググループ名は、変更出来ない模様。
このロググループの中に、以下ログ種類ごとのログストリームが存在する形。各ログストリーム名は、以下に。

  1. APIサーバー

    1. KubectlコマンドなどでコールされるEKS(Kubernetes)APIのログ。詳細については、Kubernetes ドキュメントの kube-apiserver を参照してください。

    2. ログストリーム:kube-apiserver-<nnn...>

  2. 監査

    1. クラスターに影響を与えた個々のユーザー、管理者、またはシステムコンポーネントについて記録します。詳細については、Kubernetes ドキュメントの Auditing (監査) を参照してください。

    2. ログストリーム:kube-apiserver-audit-<nnn...>

  3. スケジューラ

    1. スケジューラコンポーネントは、クラスターでポッドを実行するタイミングと場所を管理します。詳細については、Kubernetes ドキュメントの kube-scheduler を参照してください。

    2. ログストリーム:kube-scheduler-<nnn...>

  4. Authenticator

    1. 認証ログは、各 Amazon EKS に固有です。これらのログは、Amazon EKS が使用するコントロールプレーンコンポーネントに対応します。各コンポーネントは、Amazon EKS が、Kubernetes の (IAM 認証情報を使用する) ロールベースのアクセスコントロール (RBAC) 認証のために使用しています。

    2. ログストリーム:authenticator-<nnn...>

  5. コントローラマネージャー

    1. コントローラーマネージャーは、Kubernetes に同梱されている主要なコントロールループを管理します。詳細については、Kubernetes ドキュメントの kube-controller-manager を参照してください。

    2. ログストリーム: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グループの失効期間もデフォルトで「失効しない」となっているはずなので、短くしておく。

ライフサイクルルール

  • ルール名: 適当

  • プレフィックス: わかりやすい文字列。最後に必ずスラッシュ。

  • オブジェクトタグ: 使う人は、設定する

  • オブジェクトサイズ: 使う人は、設定する

  • オブジェクトが現行バージョンでなくなってからの日数: 

    • 保存期間を日数で指定する

この記事が気に入ったらサポートをしてみませんか?