AWS CloudTrailで検知できたアクションがAWS Configで検知できない理由

## はじめに
AWS CloudTrailではイベントが出力できているけど、AWS Configは設定変更イベントが検出できておらず困った経験はありませんか。
本記事はCloudTrailとConfigにおける検出アクション関する記事を記載する内容となります。

## 結論
CloudTrailにて検出できるAPIによってはConfigから確認できるリソース情報を保持していないため表示されない場合がある。

## 詳細
例えば「DisassociateRouteTable(サブネットからルートテーブルの関連付け解除)」アクションを実行した場合、
DisassociateRouteTable APIは「AWS::EC2::RouteTable」「AWS::EC2::Subnet」どちらの情報も保持していないため、
Config画面からルートテーブル/サブネットの変更履歴を確認しても設定変更のログは記録されないことになる。

なお、本アクションが所持しているリソース情報については、CloudTrail上の以下項目から確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/a260242a-77e7-2f91-4fa6-a6843ef129ad.png)

## 実際に確認
### 前提：検証アクション
今回は「サブネット」から「ルートテーブル」をデタッチするというアクションにおいて、Configへの出力状況を確認していく。
※本アクションにおけるリソース間の関係性は以下の通りである。

### 1.対象サブネットからルートテーブルをデタッチ
ルートテーブルからサブネットに対してデタッチアクションの実行

①：ルートテーブルにサブネットが関連付けられていることを確認
![2023-09-28_22h34_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/d75140e6-a32b-7fae-7c9e-71a48daaa611.png)
②：ルートテーブルからサブネットの関連付けを解除したことを確認
![2023-09-28_22h36_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/14644ecd-db78-dd35-571d-405f888398a0.png)


### 2.CloudTrailとConfigでの出力内容を確認
①CloudTrailではアクションが記録されていることを確認
![2023-09-29_13h32_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/a792befe-b8cd-ff29-db44-8d5605a5b69f.png)

②同時間においてルートテーブルのAWS Configに設定変更が記録されていないことを確認
※紛らわしいが11:34~11:35のアクションは関連性のないアクション
![2023-09-29_13h33_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/b69b5631-5174-9519-a683-9f4efa875205.png)

## リソース情報を保持していないアクションが実行された場合のConfigから設定確認方法
仮に上記のようなリソース情報を保持していないアクションが実行された場合でも、Configから設定変更を追うことは可能である。
その場合、Configには即時反映されず定期的に行われるベースライン処理を待つ必要がある。


### ベースライン処理について
リソースに対して一定期間ごとに設定変更が発生していないか確認する処理。

AWS側が定期的にリソース情報を収集/比較しており、差分があった場合にのみConfig上で差分として検出される。
その際のConfigに表示されるステータスは「設定変更」となる。
![2023-09-29_21h59_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/6f4ed3fd-6709-5b78-8a60-32958b82c848.png)


なお、AWS側が設定しているベースライン処理の実行タイミングはAWSの内部仕様となっているため、実行間隔などは公表されていません。
※体感では2h~3h程度に1回処理が行われている。

ただ、Configは各リソース設定をスナップショットとして定期的に保管しております。
ConfigにはAWSリソースが作成・変更された際に検査を実行する変更時検査と、設定のスナップショットがS3に保管されるタイミングで検査する定期変更があり、ベースライン処理は「定期変更」に該当すると推測ができます。

## 最後に
CloudTrailとConfigを並べてみることはよくありますが、
「何となくここから確認できる！」といった先入観を持つと確認方法に手間取ることがわかりました。
一つ一つのパラメータを理解しながらサービス間の関連を把握することが大切だと気付きました。

## 余談
Configを調べる中で[リソースに関する直接的な関係と間接的な関係とは何ですか?](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/faq.html#faq-2)という記事を発見した。
本記事を確認するに「サブネット」と「ルートテーブル」などサービス間に関連性があるリソースには**直接的な関係**と**間接的な関係**の2つの関係がある。
サブネットに対して「describe-subnets」コマンドを実行する場合、
レスポンスの中にルートテーブル情報が含まれていないことがわかる。
このことから、サブネットに対する変更アクションとルートテーブルに関連性がないと考えられますが「サブネット」から見て「ルートテーブル」は間接的関係であり間接的関係サービスについてはdescribeのレスポンス対象でなくとも処理に含まれるとわかった。

### サービス間の関係について

#### 直接的な関係
> AWS Config は、設定フィールドからほとんどのリソースタイプの関係を導き出します。これを「直接的な」関係と呼びます。
> Amazon EC2 インスタンスとそのセキュリティグループの関係は直接的です。セキュリティグループは Amazon EC2 インスタンスの Describe API レスポンスに含まれるためです。 

上記記載の通り、2つのリソースが明示的にリンクされた状態が「直接的な関係」となる。
そのため、EC2に「describe-instances 」コマンドを実行すると関連づいているセキュリティグループIDが出力されるためEC2から見てセキュリティグループは直接的な関係といえる。

#### 関節的な関係
>一方、セキュリティグループと Amazon EC2 インスタンスの関係は間接的です。セキュリティグループを記述しても、関連付けられているインスタンスに関する情報は返されないためです。

上記記載の通り、セキュリティグループに「describe-security-groups」コマンドを実行すると関連づいているEC2インスタンス情報が出力されないため、セキュリティグループから見てEC2は関節的な関係といえる。

#### リソース間の関係性
「ルートテーブル」⇒「サブネット」：直接的な関係
「サブネット」⇒「ルートテーブル」：間接的な関係
※関係性については[リソースに関する直接的な関係と間接的な関係とは何ですか?](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/faq.html#faq-2)参照