オンプレミス環境のサーバーに CloudWatch エージェントを導入し、IAM ロールの権限でメトリクスやログを出力する方法
困っていること
オンプレミス環境のサーバーに CloudWatch エージェントを導入し、カスタムメトリクスを CloudWatch メトリクスに送信し、ログを CloudWatch Logs へ送信したいです。
しかしながら、オンプレミス環境のサーバーに IAM ユーザーのアクセスキーを発行し、クレデンシャル情報を登録する必要があり、セキュリティの関係上、これを避けたいです。
IAM ロールを使用する方法があれば、教えてください。
どう対応すればいいの?
オンプレミス環境のサーバーを Systems Manager のマネージドノードとして登録します。
その後、CloudWatch エージェントの common-config.toml
ファイルにて、SSM エージェントが生成する認証情報を指定します。
これにより、CloudWatch エージェントが SSM エージェントの用いる認証情報を使用して、カスタムメトリクスの送信、及び、CloudWatch Logs へのログ出力を実現します。
やってみた
今回はローカル環境の Windows 10 をマネージドノードとして登録してみます。Linux の場合は、参考資料[1]を参考に適宜置き換えてください。
ハイブリッドアクティベーション用の IAM ロールを作成する
1. IAM コンソールから、IAM ロール作成画面へ推移する。
2. 信頼されたエンティティタイプとして、AWS のサービスを選択し、ユースケースのサービスに Systems Manager を選択する。
3. 許可ポリシーに下記 2 つのマネージドポリシーを追加する。
- AmazonSSMManagedInstanceCore
- CloudWatchAgentServerPolicy
4. 任意の名前(ここではSSMCloudWatchAgentRole
)を指定し、ロールを作成する。
ハイブリッドアクティベーションを作成する
1. System Manager コンソールから、アクティベーションの作成画面へ推移する。
2. IAM ロールに「必要な許可を持つ既存のカスタム IAM ロールを選択する」を選択し、SSMCloudWatchAgentRole
を指定する。
3. Activation ID と Activation Code が発行されるため、テキストエディタなどに控える。
オンプレミス環境のサーバーに SSM エージェントをインストールし、マネージドノードとして登録する。
PowerShell を管理者権限で起動し、下記のコマンドレットを実行します。
[System.Net.ServicePointManager]::SecurityProtocol = 'TLS12' $code = "activation-code" $id = "activation-id" $region = "ap-northeast-1" $dir = $env:TEMP + "\ssm" New-Item -ItemType directory -Path $dir -Force cd $dir (New-Object System.Net.WebClient).DownloadFile("https://amazon-ssm-$region.s3.$region.amazonaws.com/latest/windows_amd64/ssm-setup-cli.exe", $dir + "\ssm-setup-cli.exe") ./ssm-setup-cli.exe -register -activation-code="$code" -activation-id="$id" -region="$region" Get-Content ($env:ProgramData + "\Amazon\SSM\InstanceData\registration") Get-Service -Name "AmazonSSMAgent"
※activation-code
, activation-id
はハイブリッドアクティベーション作成時に生成されたコード、$region
の値はマネージドノードとして登録したリージョンへと適宜変更ください。
※ SSM エージェントのインストールに失敗するなどのエラーが発生した場合、Windows AWS Tools for PowerShell を最新バージョンに更新してください[3]。
※ それでも失敗する場合は、PowerShell の文字コードを utf-8 に変更するために、下記のコマンドを実行してください。
chcp 65001
オンプレミス環境のサーバーに CloudWatch エージェントをインストールする
インストール方法についての詳細は割愛します。下記ドキュメントが参考になります。
CloudWatch エージェントのインストール - Amazon CloudWatch
common-config.toml ファイルを編集し、SSM エージェントによって生成された認証情報をポイントする
common-config.toml
ファイルを用いて、CloudWatch エージェントが使用する認証情報や、プロキシの設定が可能です。
編集するファイルの場所
$Env:ProgramData\Amazon\AmazonCloudWatchAgent\common-config.toml
下記のように変更します。
[credentials] shared_credential_profile = "default" shared_credential_file = "C:\\Windows\\System32\\config\\systemprofile\\.aws\\credentials"
※ SSM エージェントによって生成される認証情報は C:\Windows\System32\config\systemprofile\.aws\credentials
に保管されます。
SSM エージェントが参照する認証情報のフォルダに config ファイルを追加する
下記フォルダに認証情報が保存されています。
C:\Windows\System32\config\systemprofile\.aws
このフォルダに新規ファイルconfig
を作成し、下記を入力します。
[default] region = "ap-northeast-1"
※$region
の値はマネージドノードとして登録したリージョンへと適宜変更ください。
CloudWatch エージェントの設定ファイルを適切に設定する
詳細については割愛しますが、動作検証目的であれば下記ドキュメントを参照にして、ウィザードで生成することがお手軽です。
CloudWatch エージェント設定ファイルを作成する - Amazon CloudWatch
CloudWatch エージェントを開始する
PowerShell 上で下記のコマンドを実行します。
& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m onPremise -s -c file:configuration-file-path
※file:configuration-file-path は前段のステップで作成した CloudWatch エージェントの設定ファイルを指定します。
その他の開始方法につきましては、下記のドキュメントをご参照ください。
オンプレミスサーバーへの CloudWatch エージェントのインストール - Amazon CloudWatch
補足:AWS CLI をハイブリッドアクティベーション用の IAM ロールを用いて実行する
環境変数AWS_SHARED_CREDENTIALS_FILE
を
C:\Windows\System32\config\systemprofile\.aws\credentials
に設定することで、ハイブリッドアクティベーションによって保存された認証情報を AWS CLI から参照することが可能となります。
下記コマンドでユーザーの環境変数に追加できます。
[Environment]::SetEnvironmentVariable('AWS_SHARED_CREDENTIALS_FILE', 'C:\Windows\System32\config\systemprofile\.aws\credentials', 'User')
参考資料
[1] SSM Agent と統合 CloudWatch エージェントを使用するオンプレミスサーバーで、一時的な認証情報のみを使用するように設定する | AWS re:Post
[2] ステップ 4: ハイブリッドおよびマルチクラウド環境に SSM Agent をインストールする (Windows) - AWS Systems Manager
[3] Windows AWS Tools for PowerShell への のインストール - AWS Tools for PowerShell