Invoke tagging discipline across organization in AWS - 4 (the last post)

<!-- # Invoke tagging discipline across organization in AWS - 4 (the last post) -->

![haniwa-tag4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/4f449c84-b69f-6123-7153-14e438e286c5.png)

[前回](https://qiita.com/o2346/items/e8a1a719ad6d95baebe5) の続きです。

前回、 required-tags の非準拠情報を Slack に通知する機能を実現させました。
今回は Tag policies のほうの同等機能です

## 設計

reqired-tags のときと同様、自作 Lambda Function にすることにしました。
但し2つのアカウントにそれぞれ別個の Lambda function となります。次のようなものです

1. 定時起動 Lambda function "Generator" で専用S3 bucket （以下 Bucket1） に  [report を書き出し](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/resourcegroupstaggingapi.html#ResourceGroupsTaggingAPI.Client.start_report_creation)
  * Organizations Master Account に展開
1. [report の書き出しをトリガーに](https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html) 通知用 Lambda Function "Transmitter" を起動
  * Compliance Account に展開
  * Bucket1 からデータを読み出し整形、 Slack へ配信

これだと2つの別々の Accounts に分散させてしまうことになってしまいますが、せっかく専用の Compliance Account を用意しているわけですから、関連する処理は極力 Compliance Account に寄せたいと考えたところこうなりました

次に各々の Lambda Function です

### Lambda function "Generator"

定時起動して Bucket1 に書き出すだけ
Organizations Master Account に展開

* この命令は Compliace Account ではなく、 Organizations Master Account で実施する必要がある
* Bucket1 は Organizations Master Account ではなく、 Compliance Account 側に作成されることにしている。同作成とポリシーの設定（Organizations Master Accountからの書き込み許可）は次の "Transmitter" で扱う

### Lambda function "Transmitter"

Bucket1 に書き出されたら起動し、情報を整形して Slack に配信する
Compliance Account に展開

Lambda function "Generator" で書き出された Report は [準拠、非準拠全ての情報が書き出されたcsv](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/resourcegroupstaggingapi.html#ResourceGroupsTaggingAPI.Client.start_report_creation) となっています
見たい情報は非準拠だけですので、そもそも前工程の書き出しをさせる時点で非準拠だけというようなオプションを指定したいのですが見当たりません。しょうがないので、当 function 内でフィルタリング機能を内蔵することにします。具体的には非準拠のみ版 csv (ここでは noncompliants.csv とします) を生成、S3 に保存します(Bucket1 とは別、Bucket2 とします)

次にメッセージのコンテンツですが、非準拠数に応じて情報量が巨大となってしまう恐れがあるので、個別のリソースごとにメッセージを投稿するなどは避けることにしました。 [※1](#note) そのかわり、 noncompliants.csv へのアクセス方法を通知します

通知を受け取る想定ユーザは組織のコンプライアンスチームであり、 Compliance Account(の Bucket2 に保存された noncompliants.csv) へのアクセス権を得ているとします。したがって当面、同ユーザらが通知を受け取った際は、自らのアクセス権で noncompliants.csv を任意に取得、運用してもらうこととしました。そこから先の最適化は将来課題とします

## 実装

[こちら](https://github.com/o2346/tagging-discipline/tree/main/tag-policies/tpnt) になります。前回同様 SAM ベースです

そして 各々を `sam deploy` しますとこのような通知になります

![tpnt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/399f5a57-6af1-88ff-ed96-902fc69ebc6b.png)

これが一日一回送られてきます（デフォルトの場合）
Compliace Account の権限で、通知で示されたコマンドを実行すれば非準拠の一覧が取得できます
加えて各 Sattelite accounts(Member accounts) において [Effective tag policy and noncompliants](https://console.aws.amazon.com/resource-groups/tag-policies/?region=ap-northeast-1#) に飛ぶことでも確認可能

## 運用イメージ

この通知受領後のコンプライアンスチームのアクションとしては、非準拠リソースを有する各 account 所管チームにたいして、通知された非準拠情報に基づき修復を促す、というイメージです。

## まとめ

ここまでで、 [当初目指していたこと](https://qiita.com/o2346/items/532571e8b8fcd8dcb53c#%E8%87%AA%E7%B5%84%E7%B9%94%E3%81%AB%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F%E3%81%8B) は実現できたといっていいのではないかと思います。すなわち、強制や遮断、禁止といった強い規制・介入を伴わずに、組織全体に対し、タグ付けのルールを施行し、かつ Slack 通知によってコンプライアンスチームの運用負荷を極力減らす、といった仕組みづくりです

まずはこの仕組みによって、組織のタグ付け文化を [ベストプラクティス（※pdf注意）](https://d1.awsstatic.com/whitepapers/aws-tagging-best-practices.pdf) により近づけていく足がかりとなれば幸いです。継続できていけば、後の厳格化や自動化なども、進めやすいかもしれませんね。

このシリーズは今回で最終回となります
最後までお付き合いいただき、ありがとうございます:smile:

## note

※1 前回のように非準拠リソース数が一定数以下なら個別配信する、という仕様でもいいかもしれませんが見送り