【小ネタ】 CloudWatch AgentをWindowsに手動インストールしたらPowerShellの32bitと64bitでハマった話
はじめに
皆様こんにちは、あかいけです。
最近、Windows EC2インスタンスにCloudWatch Agentを手動でインストールする機会がありました。
手順自体はかなりシンプルですが、いざ設定を流し込もうとしたところ謎のエラーが発生し、しばらく悩んでしまいました。
調べてみると原因はPowerShellの32bit/64bit問題でした。
何が起きたか
CloudWatch Agentのインストール後、以下のコマンドでAgentを起動しようとしました。
msiexec /i amazon-cloudwatch-agent.msi
& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" `
-a fetch-config -m ec2 `
-c "file:C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.json" -s
すると以下のエラーが発生しました。
****** processing amazon-cloudwatch-agent ******
CWAConfig : 用語 'C:\Program Files (x86)\Amazon\AmazonCloudWatchAgent\config-downloader.exe' は、コマンドレット、関数、
スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パス
が含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1:313 文字:9
+ CWAConfig -multi_config ${multi_config}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Program File...-downloader.exe:String) [CWAConfig], CommandNotFoundE
xception
+ FullyQualifiedErrorId : CommandNotFoundException,CWAConfig
エラーメッセージをよく見ると C:\Program Files (x86)\... というパスが登場しています。
CloudWatch AgentのMSIはたしかに C:\Program Files\Amazon\AmazonCloudWatchAgent\ にインストールされているはずなのに、なぜ(x86)のパスを参照しようとしているのか...?
念のため C:\Program Files (x86)\Amazon\AmazonCloudWatchAgent\ の存在を確認してみましたが、やはり存在しませんでした。
PS C:\> ls "C:\Program Files (x86)\Amazon\AmazonCloudWatchAgent\"
ls : パス 'C:\Program Files (x86)\Amazon\AmazonCloudWatchAgent\' が存在しないため検出できません。
原因と解決方法
原因の特定:32bit PowerShellだった
しばらく悩んだ末、ふと「今開いているPowerShellは何bit?」という疑問が浮かびました。
以下のコマンドでプロセスが32bitかどうか確認できます。
[Environment]::Is64BitProcess
実行すると...
PS C:\> [Environment]::Is64BitProcess
False
False!つまり、32bit版のPowerShellを使っていたというわけです。
なぜ32bitのPowerShellが使われたのか
Windowsには実は2種類のPowerShellが存在します。
PS C:\> Get-ChildItem -Path "C:\Windows" -Recurse -Filter "powershell.exe" 2>$null | Select-Object FullName
FullName
--------
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
| パス | bit数 |
|---|---|
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe |
32bit |
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe |
64bit |
今回の場合検索窓で検索して一番上でヒットしたものが32Bit版であり、何も気にせずそちらを利用していたのが原因でした…。

32bit PowerShellを使うと、Windowsのファイルシステムのリダイレクト機能が働き、System32配下へのアクセスがSysWOW64にリダイレクトされたり、インストール先がProgram Files (x86)を参照するような動作になります。
CloudWatch Agentは64bit版しか提供されていないため、32bit PowerShellからだとパスのズレが生じてエラーになっていたわけです。
解決方法:64bit PowerShellで実行する
64bit版のPowerShellを使うよう切り替えます。
まず、使用中のPowerShellが64bitかどうかを確認します。
[Environment]::Is64BitProcess
False が返ってきた場合は、64bit PowerShellを明示的に起動してください。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
64bit PowerShellで確認すると True が返ります。
PS C:\Users\Administrator> [Environment]::Is64BitProcess
True
この状態でCloudWatch Agentの設定コマンドを実行すると、正常に動作しました。
PS C:\> & "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" `
>> -a fetch-config -m ec2 `
>> -c "file:C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.json" -s
****** processing amazon-cloudwatch-agent ******
Starting config-downloader, this will map back to a call to amazon-cloudwatch-agent
...
Configuration validation succeeded
AmazonCloudWatchAgent has been stopped
AmazonCloudWatchAgent has been started
無事起動できました。
補足:CloudWatch Agentは64bitのみ提供
CloudWatch AgentのWindows向けMSIのダウンロードURLを見ると、パスにamd64が含まれています。
https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi
また公式のサポート対象OS一覧を見ると、対応アーキテクチャはx86-64とARM64のみで、32bit(x86)はそもそもサポート対象に含まれていません。
さいごに
以上、CloudWatch AgentをWindowsに手動インストールする際にPowerShellの32bit/64bit問題でハマった話でした。
[Environment]::Is64BitProcessでサクっと確認できるので、Windows上でスクリプトを実行してなんかおかしいな?と感じたときはまず確認してみると良いかもしれません。
同じ事象で困っている方の助けになれば幸いです。






