

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# kubectl と S3 を使用してマネージドノードのノードログを取得する
<a name="auto-get-logs"></a>

ノードモニタリングエージェントを備えた Amazon EKS マネージドノードのノードログを取得する方法について説明します。

## 前提条件
<a name="_prerequisites"></a>

以下があることを確認します。
+ ノードモニタリングエージェントを備えた既存の Amazon EKS クラスター。詳細については、「[ノードのヘルス問題を検出し、自動ノード修復を有効にする](node-health.md)」を参照してください。
+ クラスターと通信するようにインストールおよび設定された `kubectl` コマンドラインツール。
+ S3 バケットとオブジェクトを作成するのに十分なアクセス許可が付与された状態でインストールおよびログインした AWS CLI。
+ インストール済みの Python 3 最新バージョン
+ インストール済みの AWS SDK for Python 3、Boto 3。

## ステップ 1: S3 バケットの宛先を作成する (任意)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

ログを格納する S3 バケットがまだない場合は、作成します。次の AWS CLI コマンドを使用します。バケットのデフォルトは `private` アクセスコントロールリストです。*bucket-name* はユーザーが選択した一意のバケット名に置き換えます。

```
aws s3api create-bucket --bucket <bucket-name>
```

## ステップ 2: HTTP Put の事前署名された S3 URL を作成する
<a name="_step_2_create_pre_signed_s3_url_for_http_put"></a>

Amazon EKS は、指定した URL に対して HTTP PUT オペレーションを実行してノードログを返します。このチュートリアルでは、事前署名された S3 HTTP PUT URL を生成します。

ログは gzip tarball として `.tar.gz` 拡張子で返されます。

**注記**  
AWS API または SDK を使用して、EKS がログファイルをアップロードするための事前署名された S3 アップロード URL を作成する必要があります。AWS CLI を使用して事前署名された S3 アップロード URL を作成することはできません。

1. ログを格納するバケット内の場所を決定します。例えば、キーとして *2024-11-12/logs1.tar.gz* を使用できます。

1. *presign-upload.py* ファイルに次の Python コードを保存します。*<bucket-name>* と *<key>* を置き換えます。キーは `.tar.gz` で終わる必要があります。

   ```
   import boto3; print(boto3.client('s3').generate_presigned_url(
      ClientMethod='put_object',
      Params={'Bucket': '<bucket-name>', 'Key': '<key>'},
      ExpiresIn=1000
   ))
   ```

1. 次を使用してスクリプトを実行します

   ```
   python presign-upload.py
   ```

1. URL 出力をメモします。この値は、次のステップで *http-put-destination* として使用します。

詳細については、AWS Boto3 SDK for Python ドキュメントの「[Generate a presigned URL to upload a file](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)」を参照してください。

## ステップ 3: NodeDiagnostic リソースを作成する
<a name="_step_3_create_nodediagnostic_resource"></a>

ログを収集するノードの名前を特定します。

リソースの名前としてノードの名前を使用する `NodeDiagnostic` マニフェストを作成し、HTTP PUT URL の宛先を指定します。

```
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
    name: <node-name>
spec:
    logCapture:
        destination: http-put-destination
```

マニフェストをクラスターに適用します。

```
kubectl apply -f nodediagnostic.yaml
```

`NodeDiagnostic` リソースを記述することで、コレクションのステータスを確認できます。
+ ステータスが `Success` または `SuccessWithErrors` の場合は、タスクが完了し、ログが指定された宛先にアップロードされたことを示します (`SuccessWithErrors` は、一部のログが欠落している可能性があることを示します)。
+ ステータスが Failure の場合は、アップロード URL が正しい形式であり、有効期限が切れていないことを確認してください。

```
kubectl describe nodediagnostics.eks.amazonaws.com/<node-name>
```

## ステップ 4: S3 からログをダウンロードする
<a name="_step_4_download_logs_from_s3"></a>

ログをダウンロードする前に約 1 分待ちます。そして、S3 CLI を使用してログをダウンロードします。

```
# Once NodeDiagnostic shows Success status, download the logs
aws s3 cp s3://<bucket-name>/key ./<path-to-node-logs>.tar.gz
```

## ステップ 5: NodeDiagnostic リソースをクリーンアップする
<a name="_step_5_clean_up_nodediagnostic_resource"></a>
+  `NodeDiagnostic` リソースは自動的には削除されません。ログアーティファクトを取得したら、自分でクリーンアップする必要があります。

```
# Delete the NodeDiagnostic resource
kubectl delete nodediagnostics.eks.amazonaws.com/<node-name>
```

## NodeDiagnostic `node` 宛先
<a name="_nodediagnostic_node_destination"></a>

ノードモニタリングエージェントのバージョン `v1.6.0` 以降では、ログ収集の宛先を `node` に設定するオプションがあります。この宛先を使用すると、ログは後で収集できるようにノード上に一時的に保持されます。この機能のほか、ノードモニタリングエージェントの GitHub リポジトリ内にインタラクションとログ収集を容易にする `kubectl` プラグインもあり、インストールして利用できます。詳細については、[`kubectl ekslogs` プラグイン](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/kubectl-ekslogs/README.md)のドキュメントを参照してください。

## 使用例
<a name="_example_usage"></a>

```
# Collect NodeDiagnostic logs from a single node
kubectl ekslogs <node-name>

# Collect NodeDiagnostic logs from multiple nodes
kubectl ekslogs <node-name-1> <node-name-2> <node-name-3>

# Collect NodeDiagnostic logs from all nodes with a specific label
kubectl ekslogs -l <key>=<value>
```