COLUMN

Amazon CloudWatch クロスアカウントオブザーバビリティで監視環境を集約しよう

川原です。普段はクラスメソッド株式会社でソリューションアーキテクトとして活動しています。今回は縁あってこちらのコラムに寄稿することになりました。

AWS上で稼働するシステムを監視するためのツールとして、Amazon CloudWatch は良く使われます。アラームを使って異常に気付ける仕組みを作ったり、ダッシュボードに主要なログやメトリクスを表示して洞察を得るなど、様々な機能が提供されています。

一方で、昨今では AWSアカウントを複数運用する「マルチアカウント管理」が主流になっています。

複数アカウントからなるシステムがあった場合、各アカウントで監視環境を個別に作るのは色々と不便です。たとえば、ダッシュボードを見るために各アカウントに切り替えするのが手間になります。また、複数アカウント跨いでログやメトリクスを確認したいときもあるでしょう。

そういった課題を解決する機能として CloudWatch クロスアカウントオブザーバビリティ(OAM) があります。この機能を使うと、監視に必要な情報を 1つのアカウントに集約できます。

今回は、この CloudWatch OAM について概要やセットアップ、活用方法を紹介していきます。

1. CloudWatch, CloudWatch OAM について

根幹となるサービスである Amazon CloudWatch について簡単に紹介します。その後、CloudWatchの1機能(本ブログのメイン)である クロスアカウントオブザーバビリティ(OAM) について解説します。

1-1. Amazon CloudWatch とは

Amazon CloudWatch は AWSの監視ツール(オブザーバビリティツール)です。システムの状態把握に必要な情報を継続的に取得する方法が提供されています。エラーに気付けるような仕組み(アラーム)も作成できます。

その他にもオブザーバビリティ向上のための様々な機能が揃えられています。以下の Black Belt 資料にもあるように、非常に多機能です。

画像引用: Amazon CloudWatchの概要と基本 - AWS Black Belt Online Seminar

監視を始めるにあたっての主要な情報としては、CloudWatch メトリクス(Metrics) および CloudWatch ログ(Logs) があるでしょう。

CloudWatch Metrics はパフォーマンスや使用状況を表すデータです。特定の値(例: EC2インスタンスのCPU使用率)の統計(例: 5分間の平均)を時系列で把握できます。

CloudWatch Logs ではシステムやアプリケーション、AWSサービスのログを記録します。CloudWatch Logs Insight を使ってログデータの分析も可能です。

画像引用: Amazon CloudWatchの概要と基本 - AWS Black Belt Online Seminar

1-2. CloudWatch OAM とは

この機能の正式名称は Amazon CloudWatch Observability Access Manager(OAM) です。CloudWatch のクロスアカウントオブザーバビリティ 機能と呼ばれています。マルチアカウント環境で「アカウント横断でモニタリングしたい」ときに、非常に役に立ちます。

以下のような「モニタリングで必要になってくるデータ」を1つのAWSアカウントに集約できます。

  • CloudWatch メトリクス
  • CloudWatch Logs ロググループ
  • X-Ray トレース
  • CloudWatch Application Insights アプリケーション
  • CloudWatch Internet Monitor モニタリング

なお、料金については、ログとメトリクスは追加費用はありません。トレースは最初のコピーが無料です。詳細は以下公式ページを参照ください。

1-3. OAMの主要要素を理解する

OAM の仕組みを理解するにあたって、シンク(Sink) と リンク(Link)は抑えておきたいので、簡単に説明します。シンクとリンクの関係図は以下のとおりです。

シンク(Sink)

集約先の1アカウントにて シンク(sink) を作成します。この「集約先の1アカウント」は モニタリングアカウント と呼ばれます。

シンクに対して他のアカウントがリンク(link)することで メトリクスやログを集約できます。なおシンクは「アカウント×リージョン」ごとに1つのみ作成できます。

リンク(Link)

共有元のアカウント側では リンク(link) を作成します。この「共有元のアカウント」は ソースアカウント と呼ばれます。

リンク上で「どの監視リソースタイプを送信するか」や「どのメトリクス(やログ)を送信するか」を指定できます。アカウント内に最大 5個のリンクを作成できます。

2. CloudWatch OAMのセットアップ手順

CloudWatch OAMのセットアップについて説明します。今回はモニタリングアカウント( 999999999999 )へ「ソースアカウント( 111111111111 ) の監視データ」を集約するような構成を目指します。

2-1. シンクを作成する at モニタリングアカウント

モニタリングアカウント側にシンクを作成します。

[CloudWatch > 設定 > モニタリングアカウント設定] にて設定を進めます。

[データを選択] では受け入れを許可するデータを選択します。今回は全てにチェックを入れました。(実際に送信するデータはリンク側にて設定します)

[ソースアカウントを一覧表示] では共有可能なソースアカウントの範囲を指定します。指定できる項目は以下のとおりです。

  • AWSアカウントID (例: 111111111111 )
  • AWS Organizations を利用している場合

    • 組織単位パス (例: o-aaaaaa/r-example/ou-bbbb-cccccc )
    • 組織ID (例: o-aaaaaa )

今回はソースアカウントのアカウントID ( 111111111111 )を指定しました。

[ソースアカウントを識別するのに役立つラベルを定義する] ではソースアカウントを識別するためのラベルを選択します。ラベルは以下の4種類から1つ選びます。

  • アカウント名
  • グローバルに一意のEメール
  • ドメインなしのEメール
  • カスタムラベル

今回は「アカウント名」としました。

ここまでの内容で問題なければ [設定] を選択します。以下のような表示が出てきたらOKです。

2-2. リンクを作成する at ソースアカウント

ソースアカウント側にリンクを作成します。各ソースアカウントに同じような設定を展開するため、CloudFormationテンプレートを使うことを推奨します。

CloudFormationテンプレートはモニタリングアカウントからダウンロードできます。 [モニタリングアカウント設定 > アカウントをリンクするためのリソース] を選択するとテンプレートダウンロード画面に移ります。

今回は 先ほどのソースアカウント ( 111111111111 ) 上に展開したいので、「任意のアカウント」を選択してダウンロードします。

ダウンロードしたテンプレートは以下のような yaml ファイルです。

AWSTemplateFormatVersion: 2010-09-09

Conditions:
  SkipMonitoringAccount: !Not
    - !Equals
      - !Ref AWS::AccountId
      - "999999999999" # → モニタリングアカウントのアカウントID

Resources:
  Link:
    Type: AWS::Oam::Link
    Condition: SkipMonitoringAccount
    Properties:
      LabelTemplate: "$AccountName"
      ResourceTypes:
        - "AWS::CloudWatch::Metric"
        - "AWS::Logs::LogGroup"
        - "AWS::XRay::Trace"
        - "AWS::ApplicationInsights::Application"
        - "AWS::InternetMonitor::Monitor"
      SinkIdentifier: "arn:aws:oam:ap-northeast-1:999999999999:sink/6065example"
        # → モニタリングアカウントのシンクARN

※ Conditions が記載されているのはモニタリングアカウント上にリンクを作成しないようにするためです。

今回はそのまま展開しますが、送信したいリソースタイプを絞りたい場合は、 ResourceTypes プロパティを編集してください。また LinkConfiguration プロパティを追加することで、特定のロググループもしくはメトリクスにフィルターすることも可能です。

以降は ソースアカウント上の操作となります。CloudFormationにて先程のテンプレートを展開します。リンクを作成できれば、セットアップは完了です。

※ 今回はCloudFormationスタックにて作成しました。複数アカウントに同時に展開したい場合は CloudFormationスタックセットの活用を検討ください。

3. ログやメトリクスを確認する

モニタリングアカウント側でソースアカウントのログやメトリクスを確認してみます。

3-1. ログを確認する

モニタリングアカウントにてCloudWatchロググループを確認します。以下のようにソースアカウントのロググループ一覧を見れます。

ログイベントもモニタリングアカウント側で確認できます。Logs Insight も問題なく使えました。

3-2. メトリクスを確認する

次にCloudWatch メトリクスです。こちらも問題なく、ソースアカウントのメトリクスを検索、確認できました。

もちろんCloudWatchアラームもモニタリングアカウント側で作成できます。注意点として、アラームで参照するメトリクスは、メトリクス数式を使って取ってくる必要があります。

例として 「ソースアカウントのNATゲートウェイ」の "ErrorPortAllocation メトリクスを監視するアラーム" について、設定情報の一部を記載します。

# aws cloudwatch describe-alarms --alarm-names example-xa \
#   --query "MetricAlarms[0].{Metrics:Metrics}"
Metrics:
- AccountId: '111111111111' # ← ソースアカウントID
  Id: m1
  MetricStat:
    Metric:
      Dimensions:
      - Name: NatGatewayId
        Value: nat-example
      MetricName: PacketsDropCount
      Namespace: AWS/NATGateway
    Period: 300
    Stat: Sum
  ReturnData: true

参考までに、もし「同一アカウント内のメトリクス」だった場合の、アラーム設定(一部)を記載します。この場合は Metrics パラメータは必要ありません。

Dimensions:
- Name: NatGatewayId
  Value: nat-example
MetricName: PacketsDropCount
Namespace: AWS/NATGateway
Period: 300
Statistic: Sum

4.まとめ

本記事ではマルチアカウント環境の監視で役立つ CloudWatch クロスアカウントオブザーバビリティ(OAM) について説明しました。監視ツールとしてCloudWatchを採用しているようなマルチアカウント環境では、積極的に使っていきたいですね。

クラスメソッドの川原がお届けしました。

著者

クラスメソッド株式会社

AWS事業本部 コンサルティング部

川原 征大

https://dev.classmethod.jp/author/kawahara-masahiro/

クラスメソッド株式会社はアマゾン ウェブ サービスをはじめ、データ分析、モバイル、IoT、AI/機械学習等の分野で企業向け技術支援を行っています。2023年にはアジア最優秀SIパートナーとして「SI Partner of the Year – APJ」を受賞。現在までの技術支援実績は3,000社以上、AWS環境については25,000アカウント以上となりました。社員による技術情報発信にも注力し、オウンドメディア「DevelopersIO」では4万本以上の記事を公開中です。

クラスメソッド株式会社

https://classmethod.jp/

技術ブログ「DevelopersIO」

ページ上部へ戻る

相談無料!プロが中立的にアドバイスいたします

クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。