Amazon Elastic File System (Amazon EFS) をマウントした Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのリストを確認したいと考えています。どうすればよいですか?
簡単な説明
各 Amazon EFS マウントターゲットの Elastic Network Interface 上のトラフィックは、VPC フローログを使用して追跡します。フローログは Amazon CloudWatch Logs にプッシュできます。CloudWatch Logs Insights を使用すると、マウントターゲットの Elastic Network Interface 上のトラフィックフローがフィルタリングされ、特定のタイムスタンプで Amazon EFS をマウントした Amazon EC2 インスタンスのリストが提供されます。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
次の手順を 1 回実行します。これらの手順を完了した後、Amazon EFS をマウントしているクライアントの IP アドレスをリストするたびに、クエリを実行して現在のリストを作成します。
ロググループを作成する
- CloudWatch コンソールを開きます。
- 左側のナビゲーションペインで、[ログ] を選択してから、[ロググループ] を選択します。
- [ロググループの作成] を選択します。
- [ロググループ名]、[保持期間] の設定、およびオプションの KMS キー ARN に入力します。ここにタグを追加することもできます。
- [Create] (作成) を選択します。
CloudWatch Logs にフローログを発行する許可を持つ Identity and Access Management (IAM) ロールを作成する
- IAM コンソールを開きます。
- ナビゲーションペインの [アクセス管理] で、[ロール] を選択します。
- [ロールを作成] を選択し、新しい IAM ロールを作成します。
- IAM ロールにアタッチされている IAM ポリシーには、VPC フローログを CloudWatch に発行するアクセス権限を含める必要があります。同様に、フローログサービスがロールを引き受けることができる信頼関係が必要です。
Amazon EFS のマウントターゲットで使用する Elastic Network Interface のリストを取得する
注意: Amazon EFS には、アベイラビリティーゾーンごとに異なるマウントターゲットがあります。
- Amazon EFS コンソールを開きます。
- [**ファイルシステム] で、**特定の Amazon EFS を選択し、[詳細の表示] を選択します。
- [Network] をクリックし、各マウントターゲットのネットワークインターフェイス ID を書き留めます。
フローログを作成する
- Amazon EC2 コンソールを開きます。
- [ネットワークとセキュリティ] を選択し、 [ネットワークインターフェイス] を選択します。
- マウントターゲットが使用しているすべての Elastic Network Interface を選択します。
- [アクション] メニューから [フローログを作成] を選択します。フローログを作成するときは、次の値を使用します。
- 名前: 任意
- フィルター: [All] (すべて) を選択
- **最大集計間隔:**デフォルトの 10 分または 1 分から選択します。
- 送信先: [Send to CloudWatch Logs] (CloudWatch Logs に送信) を選択
- 接続先ロググループ: 作成したロググループを選択します。
- **IAM ロール:**作成した IAM ロールを選択します。
- ログレコード形式:****AWS のデフォルト形式またはカスタム形式から選択します。
- タグ:オプション
- [Create] (作成) を選択します。
- フローログを作成した特定の Elastic Network Interface を選択して、フローログのステータスをモニタリングします。画面の下部にある [Flow logs] を選択します。[Status] (ステータス) が [Active] (アクティブ) であることを確認します。
- 最初のフローログは、約 10 分後に CloudWatch Logs にプッシュされます。
フローログが CloudWatch Logs にあることを確認する
- CloudWatch コンソールを開き、[ログ] を選択します。
- ステップ 1 で作成したロググループを選択します。
- 作成したログストリームがすべて表示されることを確認します。各 Elastic Network Interface には異なるログストリームがあります。
クエリを実行する
CloudWatch Logs Insights でクエリを実行するには、次の手順に従います。
- CloudWatch コンソールで、 [ログ] を選択してから、[Logs Insights] を選択します。
- 作成したロググループをドロップダウンメニューから選択します。
- フローログを確認する期間 (**5 分、30 分、1 時間、3 時間、12 時間、**カスタム) を選択します。
- 以下のクエリを入力します。
fields @timestamp, @message | filter dstPort="2049" | stats count(*) as FlowLogEntries by srcAddr | sort FlowLogEntries desc
**注意:**このクエリは、すべてのマウントターゲットに対して生成されたすべてのフローログを確認します。宛先ポートが Port=2049 (Amazon EFS クライアントが NFS ポート 2049 のマウントターゲットに接続する) に設定されているログをフィルタリングします。一意のソース IP (Amazon EFS クライアント IP) をすべて取得し、最もアクティブなクライアント接続でソートします。アクティビティは、フローログのエントリの数によって決まります。
- [クエリの実行] を選択します。出力には、Amazon EFS をマウントしたすべての Amazon EC2 インスタンスのプライベート IP のリストが含まれます。
以下は、クエリ出力の例です。
# srcAddr FlowLogEntries
1 111.22.33.44 78
2 111.55.66.77 36
3 111.88.99.000 33
AWS CLI を使用してクエリを実行する <br>
AWS CLI からクエリを実行するには、次の手順に従います。
- VPC フローログをセットアップしたら、AWS CLI コマンドを使用してクエリを実行できます。
- 以下のように、AWS CLI が最新バージョンに更新されていることを確認します。
$ pip install --upgrade awscli
- 以下のように、jq がインストールされていることを確認します。
yum install -y jq
- これらのクエリパラメータを使用して、次の AWS CLI クエリを使用します。
- log-group-name: 作成したロググループ名を入力します。
- start-time/end-time: これらの値は Unix/Epoch 時間です。エポックコンバーターを使用して、人間が読めるタイムスタンプを Unix/Epoch タイムに変換します。
- test.json: オプションで、このコマンドを実行するたびに json ファイル名を変更できます。名前を変更すると、以前の出力が新しい出力とマージされないようになります。
- sleep: この値 (秒単位) は、CloudWatch Logs Insights クエリの実行中の遅延として使用されます。入力する値は、フローログを確認する期間によって異なります。数週間など、より長い期間ログを確認する場合は、スリープ時間を長くします。
aws logs start-query --log-group-name EFS-ENI-Flowlogs --start-time 1643127618 --end-time 1643128901 --query-string 'filter dstPort="2049" | stats count(*) as FlowLogEntries by srcAddr | sort FlowLogEntries desc' > test.json && sleep 10 && jq .queryId test.json | xargs aws logs get-query-results --query-id