Amazon CloudWatch Agent を使用して別アカウントにログを送信する

記事タイトルとURLをコピーする

こんにちは。技術4課の河野です。

本格的に寒くなってきて、そろそろコタツを出すか悩みながらブログ書いてます。

概要

Amazon CloudWatch Agent を使用して EC2 から任意のログを別アカウントの CLoudWatch Logs に転送するまでの手順を紹介します。

環境

  • EC2
    • プラットフォーム: Windows
    • AMI: Windows_Server-2019-English-Full-Base-2020.10.14

手順

CloudWatch Agent のインストールから起動まで(同アカウントに転送する)

  1. [マネジメントコンソール] IAM Role の設定
  2. [EC2] インストーラーのダウンロード
  3. [EC2] インストール
  4. [EC2] CloudWatch Agent の設定ファイルの作成及び配置
  5. [EC2] エージェント起動

別アカウントに転送する

  1. [マネジメントコンソール] 受信側の IAM Role の設定
  2. [マネジメントコンソール] 送信側の IAM Role の設定
  3. [EC2] CloudWatch Agent の設定ファイルの変更
  4. [EC2] CloudWatch Agent の再起動

CloudWatch Agent のインストールから起動まで(同アカウントに転送する)

EC2 に CloudWatch Agent を インストールして、同アカウントの CloudWatch Logs にログを送信します。

本設定については、以下公式ドキュメントをもとに設定しています。 docs.aws.amazon.com

1. [マネジメントコンソール] IAM Role の設定

マネジメントコンソールから、Managed Policy CloudWatchAgentServerPolicy を付与した EC2 用の IAM Role を作成します。

次に、EC2 に作成した IAM Role をアタッチします。

起動中の EC2 にアタッチする場合は、アタッチするインスタンスID にチェックを入れて、アクション > セキュリティー > IAM Role を変更 からアタッチできます。

f:id:swx-go-kawano:20201105103552p:plain

2. [EC2] インストーラーのダウンロード

EC2 にRDP 接続し、Power Shell から以下のコマンドを実行します。

wget -uri https://s3.amazonaws.com/amazoncloudwatch-agent/windows/amd64/latest/amazon-cloudwatch-agent.msi -outfile .\amazon-cloudwatch-agent.msi

3. [EC2] インストール

Powershell から、以下コマンドを実行します。

msiexec /i amazon-cloudwatch-agent.msi

4. [EC2] CloudWatch Agent の設定ファイルの作成及び配置

以下 config.json を作成し、 C:\Program Files\Amazon\AmazonCloudWatchAgent\ に配置します。

{
  "agent": {
    "metrics_collection_interval": 60,
    "logfile": "c:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log"
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "c:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\test.log",
            "log_group_name": "test.log",
            "timezone": "Local"
          }
        ]
      }
    },
    "log_stream_name": "example_log_stream_name"
  }
}

設定ファイルについては、公式ドキュメントのサンプルを参考にしています。

上記では、test.log にはかれたログを CloudWatch Logs に転送するように設定をしています。

5. [EC2] エージェント起動

Powershell から、以下コマンドを実行します。

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json" -s

以下コマンドを実行して、実際に CloudWatch Logs に転送されていることを確認します。

echo "testlog" >> C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\test.log

f:id:swx-go-kawano:20201105103613p:plain

別アカウントに転送する

先ほど設定した EC2 から、別アカウントのCloudWatch Logs に転送します。

本設定については、以下公式ドキュメントをもとに設定しています。 docs.aws.amazon.com

1. [マネジメントコンソール] 受信側の IAM Role の設定

受信側(別アカウント)のマネジメントコンソールから、以下ポリシーを付与した IAM Role を作成します。

  • Managed Policy: CloudWatchAgentServerPolicy

信頼関係に以下を追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "{ 送信側のEC2にアタッチしている Role ARN }"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2. [マネジメントコンソール] 送信側の IAM Role の設定

CloudWatch Agent をインストールしている EC2 にアタッチしている IAM Role に以下 インラインポリシーを追加します。

Resource には、受信側で作成した Role の ARN を記載します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "{ 受信側(別アカウント)で作成した Role ARN }"
            ]
        }
    ]
}

3. [EC2] CloudWatch Agent の設定ファイルの変更

C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json のlogsセクションに以下を追記します。

role_arn には、受信側で作成した Role の ARN を記載します。

"credentials": {
        "role_arn": "{ 受信側で作成した Role ARN }"
      }

4. [EC2] CloudWatch Agent の再起動

既に実行している場合は、下記コマンドを実行して、エージェントを再起動します。

& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json" -s

先ほどと同様に、以下コマンドを実行して、実際に CloudWatch Logs に転送されていることを確認することができます。

echo "testlog" >> C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\test.log

うまく行かない場合は、以下コマンドを実行して、CloudWatch Agent のログを確認してみましょう。

Get-Content -Path C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\amazon-cloudwatch-agent.log -Wait -Tail 5

さいごに

別アカウントに送信するためには、受信側と送信側でそれぞれ設定する必要があり、少しややこしかったため手順を整理しました。

今回紹介した手順は、環境ごとにアカウントが用意されていて、一つのアカウントにログを収集したいといったユースケースに対して有効です。

また、取集するログに対して、ロググループ名やストリーム名も指定することができます。

例えば、開発環境、検証環境、本番環境のログを収集する際に、それぞれの環境のロググループを指定することで、一つのアカウントで収集した際も各環境のログを見分けることが可能です。