AWS Systems Manager on EC2 を使用して CloudWatch エージェントをセットアップする方法
2023-05-29
azblob://2023/05/29/eyecatch/2023-05-29-cloudwatch-agent-setup-ssm-000.png

こんにちは、株式会社FIXERの村上です。

AWS Systems Manager を使用して、CloudWatch エージェントのパッケージDLからサービス起動まで試してみました。

本ブログでは、Windows Server を使用していますが、他の OS でもほぼ同様の手順となります(一部、エージェント設定を除く)。

■ 事前の検証環境

以下の検証環境をご用意ください。

下記のTechBlogで事前環境の構築手順を紹介しています。
https://tech-blog.cloud-config.jp/2023-05-23-aws-cli-systems-manager-on-ec2

■ CloudWatch エージェントの制約(一部抜粋)

プライベートサブネット上にEC2インスタンスを配置されたことを前提として、下記 4点の制約を必要とします。

  1. EC2インスタンス はCloudWatch エージェントのパッケージをダウンロードするため、インターネットへの接続が必要である。
  2. EC2インスタンス と Systems Manager の専用のプライベートネットワークを構成するため、VPCエンドポイントが必要である。
  3. EC2インスタンス から Systems Manager API にアウトバウンドアクセスを通信するため、セキュリティグループの設定が必要である。
  4. EC2インスタンス と CloudWatchのサービスにRBACを行うため、インスタンスプロファイルにCloudWatch エージェントを実行する許可ポリシーの追加が必要である。

※ 「事前の検証環境」を用意された皆様は、[2. ]と[3. ]の手順が不要になります。そのため、本ブログでは、[1. ]と[4. ]の設定手順を紹介します。

1. IAM ロールに許可ポリシーを追加する

EC2インスタンスにアタッチされたIAMロールにCloudWatchの実行権限(CloudWatchAgentServerPolicy)を付与します。

【注意点】
既にアタッチ済みのIAMロールに許可ポリシーを追加した場合、すぐには適用されません(AWSの仕様っぽい)。
すぐに反映したい場合は、EC2インスタンスを再起動してください。もし再起動できない場合は、気長に待ってください。

2. NATゲートウェイ経由でインターネットアクセスを敷設する

CloudWatch エージェントのパッケージはインターネット経由でEC2にダウンロードされます。そのため、パブリックサブネットを作成して、NATゲートウェイを配置してインターネット通信経路を敷設します。

【ステップ1】パブリックサブネットを作成する

  1. VPC コンソール > [サブネット] を選択して、[サブネットを作成] でパブリックサブネット(public-subnet)を作成します。 
    ※ 本ブログでは、10.0.1.0/24 でパブリックサブネットを作成しました。 (プライベートサブネット(private-subnet)は 10.0.0.0/24 で作成済みです)
【設定項目】【設定値】
[必須] VPC ID[EC2インタンスがデプロイされたVPC ID] を選択
[オプション] サブネット名public-subnet(お好きな名前をつけてください)
[オプション] アベイラビリティーゾーン[指定なし]
[必須] IPv4 CIDR ブロック10.0.1.0/24

【ステップ2】ルートテーブルを作成してサブネットを関連付ける

プライベートサブネットを関連づけたルートテーブルとは、別のルートテーブルを作成します。
基本的には、サブネット単位でルートテーブルを用意することを推奨します。

  1. VPC コンソール > [ルートテーブル] を選択して、[ルートテーブルを作成] でパブリックサブネット用のルートテーブルを作成します。

    【設定項目】【設定値】
    [オプション] 名前public-rtb(お好きな名前をつけてください)
    [必須] VPC[EC2インタンスがデプロイされたVPC] を選択
  2. 作成後、このルートテーブル(public-rtb)にパブリックサブネットを明示的に関連付けてください。
  3. また同様に、プライベートサブネット用のルートテーブル(private-rtb)にはプライベートサブネットを明示的に関連付けてください。

【ステップ3】インターネットゲートウェイを作成する

  1. VPC コンソール > [インターネットゲートウェイ]を選択して、[インターネットゲートウェイの作成]でインターネットゲートウェイを作成します。

    【設定項目】【設定値】
    [必須] 名前igw(お好きな名前をつけてください)
  2. 作成後の画面右上、[アクション]を選択して、[VPCのアタッチ] にて「EC2インタンスがデプロイされたVPC」を割り当てます。

【ステップ4】NATゲートウェイを作成する

  1. VPC コンソール > [NATゲートウェイ]を選択して、[NATゲートウェイを作成]でパブリックNATゲートウェイを作成します。
【設定項目】【設定値】
[オプション] 名前public-ngw(お好きな名前をつけてください)
[必須] サブネット[パブリックサブネット ID] を選択
[必須] 接続タイプ[パブリック] を選択
[必須] Elastic IP 割り当て ID[Elastic IP を割り当て]ボタンを押下して、割り当てる

【ステップ5】ルートテーブルのルーティングを設定する

パブリックサブネット用のルートテーブル

  1. VPC コンソール > [ルートテーブル] を選択して、パブリックサブネット(public-subnet)にアタッチされたルートテーブル(public-ngw)を選択します。
  2. 右上の [アクション] を選択して、[ルートの編集] にて インターネットゲートウェイ(igw)を新規追加します。

プライベートサブネット用のルートテーブル

  1. VPC コンソール > [ルートテーブル] を選択して、プライベートサブネット(private-subnet)にアタッチされたルートテーブル(private-rtb)を選択します。
  2. 右上の [アクション] を選択して、[ルートの編集] にて NATゲートウェイ(public-ngw)を新規追加します。
【設定項目】【設定値】
[必須] 送信先0.0.0.0/0
[必須] ターゲット[先ほど作成したNATゲートウェイ ID] を選択

3. CloudWatch エージェントのパッケージをEC2にダウンロードする

Run Command を使用して、EC2インスタンスにCloudWatch エージェントのパッケージをダウンロードします。

  1. AWS Systems Manager コンソール > [Run Command] を選択して、[AWS-ConfigureAWSPackage] のコマンドドキュメントを指定します。
  2. コマンドのパラメータにはこちらの設定を行います。
【設定項目】【設定値】
[必須] ActionsInstall
[オプション] Installation TypeUninstall and reinstall
[必須] NameAmazonCloudWatchAgent
[オプション] Versionlatest
[オプション] Additional Arguments{}
  1. [ターゲット] では、対象のインスタンスを選択します。
  2. (任意)[出力オプション]では、[S3 バケットへの書き込みを有効化する]のチェックボックスを外します。
  3. 実行後、C:\Program Files\Amazon の直下に 統合CloudWatchエージェントのパッケージがダウンロードされました。

4. CloudWatch エージェントの設定をEC2に適用しサービスを起動する

【ステップ1】CloudWatchエージェント設定 を Parameter Store に定義する

  1. AWS Systems Manager コンソール > [パラメータストア] を選択して、[パラメータの作成]で設定ファイルの定義を行います。
  2. パラメータの詳細にはこちらの設定を行います。
【設定項目】【設定値】
[必須] 名前AmazonCloudWatch-sample-config ※ 必ず「AmazonCloudWatch-」から名付けてください!
[オプション] 説明<任意>
[必須] 利用枠本ブログは[標準]を選択
[必須] タイプ[文字列]を選択
[必須] データ型[text]を選択

「値」には、エージェントの設定値を記載します。下記にサンプルを紹介します。


{
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log",
						"log_group_name": "CloudWatchAgent",
						"log_stream_name": "{instance_id}"
					}
				]
			},
			"windows_events": {
				"collect_list": [
					{
						"event_format": "xml",
						"event_levels": [
							"WARNING",
							"ERROR",
							"INFORMATION"
						],
						"log_group_name": "System",
						"log_stream_name": "{instance_id}",
						"event_name": "System"
					}
				]
			}
		}
	}
}

【ステップ2】Parameter Store の設定値をEC2インスタンスに適用する+サービス起動する

  1. AWS Systems Manager コンソール > [Run Command] を選択して、[AmazonCloudWatch-ManageAgent] のコマンドドキュメントを指定します。
  2. パラメータの詳細にはこちらの設定を行います。
【設定項目】【設定値】
[必須] Actions[configure]を選択
[必須] Mode[ec2]を選択
[必須] Optional Configuration Source[ssm]を選択
[必須] Optional Configuration Location[AmazonCloudWatch-sample-config]を入力
[必須] Optional Restart[yes]を選択
  1. [ターゲット] では、対象のインスタンスを選択します。
  2. (任意)[出力オプション]では、[S3 バケットへの書き込みを有効化する]のチェックボックスを外します。
  3. 実行後、RunCommandの実行ログ上でエージェントの起動成功ログが出力されていることを確認します。

【確認】 CloudWatch Logs でログデータを確認する

  1. CloudWatch コンソール > [ロググループ] を選択します。
  2. ロググループの一覧に「CloudWatchAgent」と「System」が表示されており、ログストリームに対象のEC2インスタンスを確認します。

これで、Systems Managerによって CloudWatchエージェントのセットアップ等できました。

■ 完成図

本ブログでは、このような構成図を作成しました。