Windowsサーバーの運用に慣れた方がAWSを触るなら、PowerShellはそのまま武器になります。本記事はAWS Tools for PowerShellの導入から、Windows EC2の日常運用・S3操作・SSMでのリモート実行、AWS CLIとの使い分けまで、コピペで試せるcmdlet断片を中心にまとめた実践リファレンスです。未経験からでも「やりたいこと→cmdlet」で引けるよう、最後に逆引き早見表を用意しました。
01なぜPowerShell×AWSなのか
Windowsサーバーの運用現場では、GUIよりもPowerShellでの操作が標準になっています。AWS上で動かすWindows Serverも同じで、OSの中の操作(サービス・イベントログ・ディスク)と、AWS側の操作(EC2やS3)を同じPowerShellスクリプトの中でまとめて書けるのが最大の利点です。
AWSのAPIをPowerShellから叩くための公式ツールが AWS Tools for PowerShell です。各AWS操作が「cmdlet(コマンドレット)」として提供され、Windows標準のパイプラインやオブジェクト処理にそのまま乗せられます。
- AWSの操作を cmdlet として実行できる(例:EC2一覧、S3アップロード)
- Windows OS内の運用(サービス再起動・ログ確認)とAWS操作を1本のスクリプトに統合できる
- 戻り値が最初から.NETオブジェクトなので、テキスト整形なしでプロパティを扱える
02導入 — 必要なモジュールだけ入れる
AWS Tools for PowerShell は、サービスごとに分かれた AWS.Tools.*(モジュール式)を使うのが現在の推奨です。まずインストーラーモジュールを入れ、そこから使うサービスのモジュールだけを追加します。
# 1) インストーラーモジュールを入れる(PowerShell Gallery から)
Install-Module -Name AWS.Tools.Installer -Force
# 2) 使うサービスのモジュールだけ入れる(-CleanUp で旧バージョンを掃除)
Install-AWSToolsModule AWS.Tools.EC2,AWS.Tools.S3 -CleanUp
# → 依存する共有モジュール AWS.Tools.Common も自動で入る
# 3) 認証プロファイルと既定リージョンをセッションに設定
Set-AWSCredential -ProfileName my-profile # ~/.aws/credentials のプロファイル名
Set-DefaultAWSRegion -Region ap-northeast-1 # 東京リージョンを既定に
# 4) 動作確認(S3バケット一覧が引ければ認証・リージョンはOK)
Get-S3Bucket 03基本 — cmdletの読み方とパイプライン
AWS Tools for PowerShell の cmdlet は 「動詞-AWSサービス名詞」(Verb-AWSNoun)で命名されています。取得は Get-、作成は New-、削除は Remove-、設定変更は Set- や Edit- です。まず Get- 系で「今どうなっているか」を確認するのが安全な入り方です。
Get-Command -Module AWS.Tools.EC2でそのサービスのcmdlet一覧を探せる- パイプライン
|でcmdletの出力を次の処理へ渡す Where-Object(絞り込み)/Select-Object(列選択)/ForEach-Object(各要素の処理)が三種の神器
# 使えるcmdletを探す(EC2モジュールの Get- 系を一覧)
Get-Command -Module AWS.Tools.EC2 -Verb Get | Select-Object Name
# パイプラインの基本:一覧 → 平坦化 → 絞り込み → 列選択
Get-EC2Instance |
ForEach-Object { $_.Instances } |
Where-Object { $_.InstanceType -eq 't3.micro' } |
Select-Object InstanceId, InstanceType, @{n='State'; e={$_.State.Name}} Get-EC2Instance は「予約(Reservation)」の単位で返るため、実インスタンスは各要素の .Instances の中にあります。上のように ForEach-Object { $_.Instances } で平坦化してから扱うと迷いません。04ユースケース:インフラの確認(EC2 / S3)
日々いちばん多いのは「今どうなっているか」を確認する読み取り操作です。EC2はAPI側のフィルタで状態を絞り、S3はオブジェクトの一覧・アップロード・ダウンロードを押さえておけば大半は回ります。
# 稼働中(running)のインスタンスだけを抽出(EC2 APIのフィルタで絞る)
Get-EC2Instance -Filter @{Name='instance-state-name'; Values='running'} |
Select-Object -ExpandProperty Instances |
Select-Object InstanceId, InstanceType,
@{n='Name'; e={ ($_.Tags | Where-Object Key -eq 'Name').Value }}
# S3:バケット内オブジェクトの一覧(プレフィックスで絞り込み)
Get-S3Object -BucketName my-bucket -KeyPrefix logs/2026/
# S3:アップロードとダウンロード
Write-S3Object -BucketName my-bucket -Key backup/app.zip -File .\app.zip
Read-S3Object -BucketName my-bucket -Key backup/app.zip -File .\restore\app.zip instance-state-name を使います(値は running / stopped など)。クライアント側で Where-Object するより、サーバ側フィルタの方が転送量も少なく高速です。05ユースケース:Windows EC2の運用
ここがPowerShell×AWSの本領です。AWSのcmdletと、Windows標準のcmdletを混ぜて、OS内部の状態確認・復旧を素早く行えます。以下はすべてWindows PowerShell標準のcmdletなので、Windows EC2上でそのまま使えます。
# イベントログ(システムログの直近20件)
Get-WinEvent -LogName System -MaxEvents 20 |
Select-Object TimeCreated, Id, LevelDisplayName, Message
# サービスの状態確認と再起動(例:IIS の W3SVC)
Get-Service -Name W3SVC
Restart-Service -Name W3SVC
# ディスクの空き容量(GB表示に整形)
Get-Volume |
Select-Object DriveLetter, FileSystemLabel,
@{n='FreeGB'; e={ [math]::Round($_.SizeRemaining/1GB, 1) }}
# CPU使用の重いプロセス上位5件
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, CPU 06ユースケース:自動化(スクリプト / タスク / SSM)
単発の操作に慣れたら、.ps1 スクリプトにまとめて再利用します。定期実行はWindowsのタスクスケジューラ、多数のサーバへの一斉実行は SSM Run Command が便利です。
.ps1に処理をまとめ、引数やログ出力を付けて再利用可能にする- タスクスケジューラ(
Register-ScheduledTask)で定期実行 - 多数のインスタンスへ一斉実行するなら SSM Run Command の AWS-RunPowerShellScript
- 起動時に流したい初期化は EC2 の user-data に
<powershell>ブロックで記述
# SSM Run Command でリモートのWindows EC2上のPowerShellを実行
# (AWS.Tools.SimpleSystemsManagement モジュールが必要)
Send-SSMCommand `
-DocumentName 'AWS-RunPowerShellScript' `
-InstanceId i-0123456789abcdef0 `
-Parameter @{ commands = @('Restart-Service W3SVC', 'Get-Service W3SVC') }
# EC2 の user-data(起動時に一度だけ実行)。<powershell> タグで囲む
<powershell>
Install-WindowsFeature -Name Web-Server
</powershell> 07ユースケース:AWS CLIとの対比
同じ操作をAWS CLIとPowerShellで書き比べると、棲み分けが腑に落ちます。CLIの戻り値はJSON文字列なので、PowerShellで扱うには ConvertFrom-Json でオブジェクト化します。一方、AWS Tools for PowerShell は最初からオブジェクトを返し、-Select でSDK応答の一部だけを取り出せます。
# AWS CLI:戻り値はJSON文字列 → ConvertFrom-Json でPSオブジェクトに変換
aws ec2 describe-instances --output json |
ConvertFrom-Json |
Select-Object -ExpandProperty Reservations
# PowerShell:戻り値は最初からオブジェクト。-Select で応答の一部だけ返す
Get-S3Object -BucketName my-bucket -Select '*' # SDK応答の全体
Get-EC2Instance -Select 'Reservations' # Reservations の中身だけ -Select はAWS Tools for PowerShell 共通のパラメータで、SDKレスポンスのどの部分を出力するかを指定します(* で応答全体)。CLIの --query に相当する使い分けと考えると分かりやすいです。08つまづきポイントと事故らないコツ
- スクリプトが実行できない:実行ポリシーを必要範囲だけ緩和する(
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned)。Bypassや全体緩和は避ける - 起動が重い:AWS.Tools は必要なサービスモジュールだけ入れる。
AWSPowerShell.NetCoreは全サービス入りのモノリシックで重く、新規採用は非推奨 - 認証で詰まる:キーを直書きせず、プロファイル(Set-AWSCredential)やEC2のIAMロールを使う。鍵はGitにコミットしない
- 文字化け・改行事故:ファイル出力は文字コードを明示する(UTF-8)。CRLF/LFの差異にも注意
# 実行がブロックされる時:現在ユーザーだけに緩和(影響範囲を最小に)
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
# ファイル出力はUTF-8を明示(BOM/改行の事故を防ぐ)
Get-EC2Instance | ConvertTo-Json | Out-File -FilePath out.json -Encoding utf8 09逆引き早見表(やりたいこと → cmdlet)
迷ったらここから。「やりたいこと」から使うcmdletを引ける1画面チートシートです(プレースホルダは適宜置き換えてください)。
| やりたいこと | cmdlet / コマンド |
|---|---|
| EC2一覧(稼働中だけ) | Get-EC2Instance -Filter @{Name='instance-state-name';Values='running'} |
| インスタンス起動 / 停止 | Start-EC2Instance -InstanceId ... / Stop-EC2Instance -InstanceId ... |
| S3バケット一覧 | Get-S3Bucket |
| S3オブジェクト一覧 | Get-S3Object -BucketName ... -KeyPrefix ... |
| S3にアップロード | Write-S3Object -BucketName ... -Key ... -File ... |
| S3からダウンロード | Read-S3Object -BucketName ... -Key ... -File ... |
| イベントログ確認 | Get-WinEvent -LogName System -MaxEvents 20 |
| サービス再起動 | Restart-Service -Name W3SVC |
| ディスク空き確認 | Get-Volume |
| 重いプロセスを見る | Get-Process | Sort-Object CPU -Descending |
| リモート一斉実行(SSM) | Send-SSMCommand -DocumentName AWS-RunPowerShellScript ... |
| 認証プロファイル設定 | Set-AWSCredential -ProfileName ... |
| 既定リージョン設定 | Set-DefaultAWSRegion -Region ap-northeast-1 |
| モジュール追加 | Install-AWSToolsModule AWS.Tools.<サービス名> |
10よくある質問(FAQ)
AWS CLIとPowerShell、どちらを使うべきですか?
Windowsサーバー運用と統合したい、あるいは戻り値をオブジェクトとして加工したいならPowerShellが向きます。Linux中心・コンテナ・CIパイプライン・軽さ重視ならAWS CLIが手軽です。どちらか一方に決める必要はなく、用途で使い分けて構いません。CLI側の詳しい使い方はAWS CLI 実践リファレンスを参照してください。
AWSPowerShell と AWS.Tools は何が違いますか?
AWSPowerShell(およびクロスプラットフォーム版の AWSPowerShell.NetCore)は全サービスを1つに詰め込んだモノリシック版で、読み込みが重くなりがちです。現在推奨されるのは AWS.Tools.* のモジュール式で、使うサービス(EC2やS3など)のモジュールだけを Install-AWSToolsModule で入れます。新規に始めるなら AWS.Tools を選んでください。
スクリプトが「実行がブロックされました」と出て動きません。
既定の実行ポリシーがRestricted等になっているためです。Set-ExecutionPolicy -Scope CurrentUser RemoteSigned のように、必要な範囲だけを緩和します。Bypassや全ユーザー(LocalMachine)への安易な変更は避け、影響範囲を最小にするのが安全です。
認証情報の扱いで気をつけることは?
アクセスキーをスクリプトに直書きせず、名前付きプロファイル(Set-AWSCredential)やEC2に付与したIAMロールを使います。長期のアクセスキーよりも IAM Identity Center による一時認証が安全です。鍵やトークンは絶対にGitへコミットしないでください(例では YOUR_KEY などのプレースホルダを使います)。
EMWは札幌を拠点にAWSの設計・運用を支援しています。WindowsワークロードのAWS移行や運用自動化のご相談、そして基礎から学びたい方の採用も歓迎です。まずはお気軽にご相談ください。
相談する