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 CLIとの棲み分けはシンプルです。Windows運用と統合したい・オブジェクトを加工したいならPowerShellLinux/コンテナ/CIで軽く回したいならAWS CLI。両方入れて用途で選んで構いません。ネットワークやLinuxの基礎から固めたい方はクラウドエンジニアの教科書もあわせてどうぞ。
現場のコツ:「PowerShellかCLIか」で消耗しないこと。現場では両方使います。今日の作業がWindows運用寄りか、CI寄りかで選べば十分です。

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
認証は長期アクセスキーよりも IAM Identity Center による一時認証が安全です。プロファイル名やロールで参照し、鍵そのものはコードに書きません。
現場のコツ:本番運用では、必要なサービスのモジュールだけを入れるのが鉄則です。全部入りのモノリシック版はロードが重く、起動が遅くなります(詳細は08)。

03基本 — cmdletの読み方とパイプライン

AWS Tools for PowerShell の cmdlet は 「動詞-AWSサービス名詞」(Verb-AWSNoun)で命名されています。取得は Get-、作成は New-、削除は Remove-、設定変更は Set-Edit- です。まず Get- 系で「今どうなっているか」を確認するのが安全な入り方です。

# 使える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
EC2のフィルタ名はAWS API準拠で、状態の絞り込みは instance-state-name を使います(値は running / stopped など)。クライアント側で Where-Object するより、サーバ側フィルタの方が転送量も少なく高速です。
現場のコツ:確認系(Get-)から慣れるのが安全です。停止・削除の前に、まず一覧で対象を目視してから実行する癖をつけましょう。

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
WindowsのイベントログやIISログを継続的にCloudWatch側へ集約したい場合は、CloudWatch Agentが定番です。設定の勘所はCloudWatch Agent × Logs 設定ガイドにまとめています。
現場のコツ:障害の一次調査は「イベントログ→サービス状態→ディスク/プロセス」の順で見ると早いです。上のスニペットを1つの.ps1にまとめておくと、駆けつけ時間が縮みます。

06ユースケース:自動化(スクリプト / タスク / SSM)

単発の操作に慣れたら、.ps1 スクリプトにまとめて再利用します。定期実行はWindowsのタスクスケジューラ、多数のサーバへの一斉実行は SSM Run Command が便利です。

# 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>
SSM Run Commandは、対象インスタンスにSSM Agentが入りIAMロールで権限が付いていることが前提です。SSHや踏み台を開けずにコマンドを配れるため、運用の安全性が上がります。

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

# ファイル出力はUTF-8を明示(BOM/改行の事故を防ぐ)
Get-EC2Instance | ConvertTo-Json | Out-File -FilePath out.json -Encoding utf8
現場のコツ:認証情報は「コードに書かない・リポジトリに置かない」を徹底します。例では必ず YOUR_KEY などのプレースホルダを使い、実鍵は環境(プロファイル/IAMロール)から解決させましょう。

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.<サービス名>
手を動かして基礎から積みたい方へ。EMWでは未経験からAWSの設計・運用を学べる環境を用意しています。採用情報・カジュアル面談はこちら。関連して、コマンド操作の相棒であるAWS CLI 実践リファレンスもどうぞ。

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移行や運用自動化のご相談、そして基礎から学びたい方の採用も歓迎です。まずはお気軽にご相談ください。

相談する
← ブログ一覧へ戻る