複数の AWS アカウントを、CloudWatch で一元管理するクロスアカウントオブザーバビリティを触ってみた

# はじめに

Amazon CloudWatch で、複数の AWS アカウントのモニタリングを一元管理するクロスアカウントオブザーバビリティが追加されました。複数の AWS アカウントで、メトリクスやログ、トレースを一元管理が出来ます。[AWS Blog](https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-cross-account-observability/) で詳細が取り上げられています。

[クロスアカウントオブザーバビリティが追加する以前にもクロスアカウントに関する機能](https://dev.classmethod.jp/articles/shared-cloudwatch-to-other-account/)はありました。ただ、AWS アカウントごとに用意された画面で見る必要があったり、ログはクロスアカウントが出来なかったりと、多少制限がありました。このあたりが使いやすくなったので、どういった使い方が出来るか確認してみましょう。



# クロスアカウントの設定について

CloudWatch の Settings の画面を開くと、クロスアカウントに関する設定が大きくわけて 2 種類あります。以下の画像の黄色くハイライトしている部分です。上側の部分が新たに追加されました。下側の部分は、今まであった設定です。

今回は、この上側の設定を触っていきます。

![image-20221211110709835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3c8f810c-c7fa-a63a-9c4c-869aea0ba610.png)



# アカウントの呼び名について

モニタリングを一元管理する側は、「モニタリングアカウント」と呼びます。モニタリングをされる側は「ソースアカウント」と呼びます。

![image-20221211162407114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/824855e2-3fc4-3df9-3bf2-32e56a89a004.png)



# モニタリング側の設定

クロスアカウントオブザーバビリティの設定をしていきます。今回の環境は、Organizations を使っているため、モニタリングアカウント側の設定だけで設定ができます。Organizations とは関係ない AWS アカウントも管理することが出来ますが、今回は取り上げません。

![image-20221211110953449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b60e164b-fd65-b207-61bf-81b36d8c09f0.png)



なお、この記事の環境では、Organizations OU は以下の構成になっています。Root 直下の Production OU に所属する AWS アカウントを一元管理の対象にします。

![image-20221211112446345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7fb06ebd-3467-70e4-fe14-fc799ee7293f.png)



指定した OU に所属している AWS アカウントを一元管理します。注意点が一点あります。OU に所属している子供の OU が有る場合、それを全部指定する必要があります。もし、OU のネストをしている場合は、全て指定することを忘れずに行います。

![image-20221211112528839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7bb57af0-103b-f0b5-1d68-05bb490e5490.png)



表示名をどうするか指定します。基本的には Account name になるんじゃないかと思います。

![image-20221211112320364.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/25553318-a883-b441-7425-6dab0a3a7b90.png)



Resource to link accounts を押します。

![image-20221211113057806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/91da6e7b-9af7-8bb8-bf0e-2db829d6fd58.png)



AWS Organizations を選び、Download を押して、CloudFormation の Template をダウンロードします。

![image-20221211113128958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/11738a98-4ca7-dce9-e33d-41f592ec1770.png)



こんな YAML ファイルでした。

```yaml
AWSTemplateFormatVersion: 2010-09-09

Conditions:
  SkipMonitoringAccount: !Not
    - !Equals
      - !Ref AWS::AccountId
      - "xxxxxxxxxxxx"

Resources:
  Link:
    Type: AWS::Oam::Link
    Condition: SkipMonitoringAccount
    Properties:
      LabelTemplate: "$AccountName"
      ResourceTypes: 
        - "AWS::CloudWatch::Metric"
        - "AWS::Logs::LogGroup"
        - "AWS::XRay::Trace"
      SinkIdentifier: "arn:aws:oam:ap-northeast-1:xxxxxxxxxxxx:sink/e3ac4586-2dcd-4eb3-8862-86319d9ba439"
```



この YAML ファイルを、モニタリングアカウント側で実行することで、Organizations 配下の AWS アカウント群へ連携設定ができます。CloudFormation の画面で、Create StackSet を選びます。

![image-20221211113848744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d93f9813-1871-c18d-2ff5-cda11e2071d7.png)



Upload a template file で Choose file を選択し、先ほどダウンロードした yaml ファイルを選択します。

![image-20221211114026538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a09a9b1a-2b7c-f9f6-5414-58624442a53b.png)



Next を押します。

![image-20221211114121952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b2d9b2e3-5fc4-933f-53cf-9e29885eb9e4.png)



適当に名前を指定して、Next を押します。

![image-20221211114257683.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cfc88320-f224-8958-a625-6253db76cd58.png)



Next を押します。

![image-20221211114353483.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d0aee6a7-c524-0ad4-81e7-4d867baff128.png)



Organizations の中で、どの OU をデプロイ対象にするか選びます。ここで指定した OU 配下に子供の OU がいる場合、それも含まれます。CloudWatch 側の設定とはちょっと違う部分ですね。

![image-20221211114525565.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a8b1236d-d434-a123-2417-2ca61c064c40.png)



将来的に、該当の OU に新たに AWS アカウントが追加された時、自動的に CloudFormations を実行するように、Automatic deployment を有効化します。

また、リージョンも指定します。

![image-20221211114604913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/37f16b58-06ad-1e22-2416-8e34eb65f7ec.png)



Next を押します

![image-20221211114706769.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7b09dbea-9384-23b2-50c1-bca2fdcf1877.png)



Submit を押します

![image-20221211114729942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/13593390-d516-3bf6-d49d-981fb68982a1.png)



StackSets が作成されました。OU 配下のすべての AWS アカウントに、実行されることがわかります。

![image-20221211114853459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9e89ce38-b995-ce29-9c34-610a6cacb554.png)



子供の AWS アカウントでは、CloudFormation の Stack が作成されています。

![image-20221211115422112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d1988ff0-961b-bc65-8820-d7aad24514f7.png)



一定時間後 COMPLETE になります。無事にリンクされたか確認するために、Manage source accounts を押します。

![image-20221211122420996.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9fc1fc83-809e-e4a5-9a8b-c5d7c4717550.png)



無事にリンクされたものが一覧化されています。これで準備完了です。

![image-20221211122456796.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/55385ea2-db7a-e636-4eb4-8112be398edb.png)



# CloudWatch でどう見えるのか

これで設定が完了しました。メトリクスとログとトレースが一元管理されています。この環境では、メトリクスとログをみていきます。



# Metrics

EBS や EC2 の個所を見てみましょう。

![image-20221211151706259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/481fe31d-31c1-5b8e-02d2-c58dab58b9e1.png)



## EC2

メトリクスの画面に、新たに Account label と Accont id が追加されています。

![image-20221211151835135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/322dde46-d830-1dc9-36c3-a7410d499549.png)



監視しているソースアカウント側の EC2 Stance ID を使ってフィルターを掛けてみると、異なる AWS アカウント上のリソースが見えてます。今までは、操作している AWS アカウントしかメトリクスを取得できませんでしたが、そのままの使い勝手でソースアカウント側のリソースが取得できています。

![image-20221211151959333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b60f40de-20ae-c776-6878-ab6ea97cabc7.png)



ソースアカウント側のメトリクスは、リンク設定する以前のメトリクスデータも、普通に見えます。

![image-20221211152245650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0bf21e0c-f0aa-00cc-3bc3-c4d8dad2c4dc.png)





異なる AWS アカウントに所属するメトリクスを、同時に可視化することも、もちろん可能です。

![image-20221211153118035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7bc6f09c-e512-010b-de5d-cee67742897c.png)







## EBS

これも、EC2 と同様に複数の AWS アカウントのメトリクスが見えるようになっています。

![image-20221211152540986.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e8b6fd6b-a367-c98f-c2db-36ecac1bccdd.png)



# Logs

CloudWatch Logs も複数の AWS アカウントが管理できるようになっています。Log groups の画面を見ると、モニタリングアカウント・ソースアカウントが並べて表示されています。

![image-20221211153526807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/16d26645-730b-4181-3fbb-896d56e54868.png)



異なる AWS アカウントのログが見えます。

![image-20221211153603706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/26f1edef-e63b-4281-e199-a9285e546436.png)



また、Logs Insights で検索するときも、複数の AWS アカウントを対象に、横ぐし検索が可能です。Logs Insights の検索する画面で、検索対象のロググループを複数選べます。

![image-20221211153832299.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c8aa7135-f68e-d610-67b0-3c2a188f6fbf.png)



異なる AWS アカウントの中から、適当に二つを選びます。

![image-20221211153933076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7c33ed53-67b9-8841-7f29-543402ad2926.png)



2 つの AWS アカウントにまたがった検索が可能です。

![image-20221211154100860.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/27887920-2e32-ba22-f0ce-c9af5825cdb8.png)



# Alarm

Alarm 自体は、ソースアカウントで設定されたアラームを、モニタリングアカウントで見えるわけではありません。

ただ、モニタリングアカウント側でメトリクスが収集されているので、アラームの設定をモニタリングアカウント側に再設定することで、一元管理が可能となります。



Create alarm を押してみます。

![image-20221211154911466.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dd2603b1-2470-bc4e-22a5-3898c87af814.png)



異なる AWS アカウントのメトリクスが選べるため、必要なものを入れていくことで、アラームの一元管理が出来ます。

![image-20221211155046474.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/94d8b22a-776d-159e-bea4-975aa3a524b9.png)



# Tips : OU の追加

CloudWatch の Settings の中で、連携する対象の OU を選択する画面があります。これは一度設定すると、policy 画面で設定変更する方法に変わります。

Edit を押して、

![image-20221211121520393.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1cef9ea3-a9ae-bdf3-c3f8-c62c7e55a5b4.png)



このように追加して Save を押すと OU の追加が可能です。

```
                    "aws:PrincipalOrgPaths": [
                        "o-04bmzctzjw/r-z78w/ou-z78w-u86mdep6/",
                        "o-04bmzctzjw/r-z78w/ou-z78w-u86mdep6/ou-z78w-ojifguwy/"
                    ]
```

![image-20221211121833311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/69350d52-9d50-8c8f-9087-d7661f334091.png)



# 検証でわかったこと

- モニタリングアカウントから、複数のソースアカウントをリンクさせて集約することで、AWS アカウントをまたいだメトリクスの収集などが可能
- 異なる AWS アカウントのメトリクスやログやトレースのデータが集約される。例えば、1 個のダッシュボード内に複数の AWS アカウントのデータをまとめて表示することも可能。
- 1 個のモニタリングアカウントに、最大 100,000 個のソースアカウントを紐づけできる
  - https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html
- 1 個のソースアカウントに、最大 5 個のモニタリングアカウントを紐づけできる
- リンクさせるときには、Organizations 全体や OU 単位で自動的にリンクさせることも出来るし、Organizations 外の AWS アカウントを個別にリンクさせることも可能
- Organizations の全体や組織単位でリンクする場合、CloudFormation Template を利用する。URL リンクは、Organizations 外の AWS アカウントの場合に利用できる。
  - https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account-Setup.html#Unified-Cross-Account-Setup-TemplateOrURL
- ソースアカウントで既に設定している Alarm を、モニタリングアカウントで見えるわけではない
- ソースアカウントとして連携する前のデータも、モニタリングアカウント側で見えるようになる
- Container Insights で提供されるダッシュボードは、クロスアカウントオブザーバビリティの対象ではない。ただ、メトリクス自体はモニタリングアカウント側で収集されているので、独自のダッシュボードを作成することは出来そう。



# 参考 URL

Document : クロスアカウント
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html

New – Amazon CloudWatch のクロスアカウントオブザーバビリティ
https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-cross-account-observability/

[アップデート] Amazon CloudWatchが複数のAWSアカウントにわたるクロスアカウントのオブザーバビリティを開始しました
https://dev.classmethod.jp/articles/amazon-cloudwatch-now-allows-centralized-cross-account-monitoring/

[アップデート] CloudWatch でクロスアカウントアラームが使用可能に！
https://dev.classmethod.jp/articles/cloudwatch-cross-account-alarms/

CloudWatchを別アカウントに共有して1アカウントでまとめてモニタリングしたい
https://dev.classmethod.jp/articles/shared-cloudwatch-to-other-account/