プライベートサブネット上の Windows EC2 インスタンスに AWS CLI を導入してみた (非インターネット接続環境)
はじめに
テクニカルサポートの 片方 です。
EC2 インスタンス上から S3 バケットへファイルをアップロードしたり、逆に S3 バケットからファイルを取得したくなる場面は多いと思います。
そのような場合、AWS CLI を EC2 にインストールして操作するのが一般的です。
しかし、セキュリティ要件などの理由から、
- EC2 インスタンスを プライベートサブネットに配置している
- EC2 インスタンスから インターネットへ接続できない
- RDP が利用できない、または利用したくない
といった構成になっているケースも少なくありません。
特に Windows OS の場合、AWS CLI がプリインストールされていないケースが多く、頭を悩ませることもあるかと思います。
いくつかの方法は考えられますが、本記事ではインターネット非接続のプライベートサブネットに配置された Windows EC2 インスタンスに対して、SSM を利用して AWS CLI をインストールし、コマンド確認を行うまでの手順を、実際に試した内容をもとにご紹介します。同様の構成でお困りの方の参考になれば幸いです。
構成 / 前提条件
構成概要
- Windows Server 2022 を利用した EC2 インスタンス(AWS CLI:未インストール)
- EC2 インスタンスは プライベートサブネット に配置
- EC2 インスタンスから インターネットへの直接通信は不可
- EC2 インスタンスへの接続は SSM を利用 (VPC エンドポイント経由でマネージドノード登録済み)
- RDP 接続は行わない
- ファイルの受け渡し先として Amazon S3 を利用


ネットワーク構成
- 対象 VPC には S3 Gateway VPC エンドポイント を作成済み
- NAT Gateway / Internet Gateway は利用していない
EC2 インスタンスから外部インターネットへの通信は不可
IAM 設定
IAM ロールには以下の権限を付与
- AmazonSSMManagedInstanceCore
- 対象 S3 バケットに対する s3:GetObject / s3:PutObject
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetPutObjectForSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::example-bucket-name/*"
}
]
}
※ 適宜修正してください
やってみた
それでは、実際にプライベートサブネット上の Windows EC2 インスタンスへ AWS CLI をインストールしていきます。
今回の作業は SSM 機能を多く利用して実施します。
なお、VPC エンドポイント経由でマネージドノードに登録する方法については省略させて頂きます。
大まかな流れは以下のとおりです。
- AWS CLI (Windows 用 MSI) をローカル端末で取得し、S3 バケットに配置
- 配置した MSI ファイルに対して、署名付き URL (Presigned URL) を発行
- SSM Run Command を利用して、EC2 インスタンス上へ MSI ファイルをダウンロード
- ダウンロードした MSI ファイルを使用して、EC2 インスタンス上で AWS CLI をインストール
- フルパス指定で AWS CLI を実行し、動作確認を実施
それぞれの手順について、順番に見ていきます。
AWS CLI (Windows 用 MSI) を S3 バケットに配置
まずは、AWS CLI の Windows 用インストーラを用意します。
以下の公式ページから、インターネット接続可能なローカル端末でAWS CLI v2(64 bit)の MSI ファイルをダウンロードします。
Windows 用の AWS CLI MSI インストーラ (64 ビット) をダウンロードして実行します。
https://awscli.amazonaws.com/AWSCLIV2.msi
ダウンロードした AWSCLIV2.msi を、対象の Windows EC2 インスタンスからアクセス可能な S3 バケットへアップロードします。
※ 後続の手順でこの MSI ファイルを SSM の機能を利用して EC2 インスタンスにダウンロードします。EC2 インスタンスにアタッチした IAM ロールから読み取り可能な S3 バケットである必要があります。

署名付き URL(Presigned URL)を発行
次に、S3 バケットに配置した AWS CLI の MSI ファイルを EC2 インスタンスからダウンロードするために、署名付き URL (Presigned URL) を発行します。
今回の構成では AWS CLI が未インストールのため IAM 認証を用いた S3 アクセスが行えず、その代替として一時的に S3 オブジェクトへアクセス可能な署名付き URL (Presigned URL) を利用しています。
署名付き URL の発行
AWS CLI が利用可能なローカル端末、または CloudShell などで、以下のコマンドを実行します。
$ aws s3 presign s3://example-bucket/tools/AWSCLIV2.msi --expires-in 3600
※ 適宜修正してください。
コマンドを実行すると、以下のような URL が出力されます。
この URL を、後続の手順で使用します。
https://example-bucket.s3.ap-northeast-1.amazonaws.com/AWSCLIV2.msi?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...

SSM Run Command で MSI を EC2 インスタンスにダウンロード
AWS Systems Manager の Run Command 機能を利用して、S3 バケットに配置した AWS CLI の MSI ファイルを Windows EC2 インスタンス上にダウンロードします。
Run Command の実行
AWS マネジメントコンソールから以下の手順で Run Command を実行します。
- AWS Systems Manager
- Run Command
- ドキュメント:
AWS-RunPowerShellScript - 対象:対象の Windows EC2 インスタンス

実行する PowerShell スクリプト
以下の PowerShell スクリプトを実行します。
事前に発行した 署名付き URL (Presigned URL) を $source に指定してください。
$source = "(発行した Presigned URL)"
$dest = "C:\temp\AWSCLIV2.msi"
New-Item -ItemType Directory -Path C:\temp -Force | Out-Null
Invoke-WebRequest -Uri $source -OutFile $dest
なお、このスクリプトでは、以下の処理を行っています。
- C:\temp ディレクトリが存在しない場合は作成
- 署名付き URL を利用して MSI ファイルをダウンロード
- ダウンロード先を C:\temp\AWSCLIV2.msi に指定
実行結果の確認
Run Command の実行が成功すると、C:\temp 配下に AWSCLIV2.msi が配置されます。

なお、有効期限切れの場合は、Run Command 自体は成功するものの以下の Error が出力されます。
Invoke-WebRequest : The remote server returned an error: (400) Bad Request.
At C:\ProgramData\Amazon\SSM\InstanceData\i-0a198ae62c3abf190\document\orchestration\b14b8391-0c3c-4e33-81fa-3f8a3377db
ae\awsrunPowerShellScript\0.awsrunPowerShellScript\_script.ps1:5 char:1
+ Invoke-WebRequest -Uri $source -OutFile $dest
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
eption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
ここまでで、AWS CLI をインストールするための MSI ファイルを、プライベートサブネットに存在する Windows EC2 インスタンス上に配置することができました。
AWS CLI をインストール
SSM Run Command を利用して AWS CLI の MSI ファイルを EC2 インスタンス上に配置できたので、続いてこの MSI ファイルを使って AWS CLI をインストールします。
AWS CLI のインストール実行
引き続き Systems Manager の Run Command を利用し、
以下の PowerShell コマンドを実行します。
- ドキュメント:
AWS-RunPowerShellScript
msiexec /i C:\temp\AWSCLIV2.msi /qn
なお、Session Manager 経由で対象 EC2 インスタンスへアクセスし、実行しても問題ないです。
インストールが完了すると、以下のパスに AWS CLI の実行ファイルが配置されます。
- C:\Program Files\Amazon\AWSCLIV2\aws.exe
以上で AWS CLI のインストールは完了です。お疲れさまでした。
確認してみた
Session Manager 経由の場合、環境変数 PATH が反映されないケースがあるため、AWS CLI コマンドはフルパス指定で実行します。
& "C:\Program Files\Amazon\AWSCLIV2\aws.exe" --version

AWS CLI が正常にインストールされ、コマンド実行可能なことを確認できました。
なお、cmd であれば aws --version でも確認可能です。

まとめ
今回ご紹介した方法は、既にプライベートサブネットに EC2 インスタンスが存在している場合や、セキュリティ要件上インターネット接続が許可されていない環境を想定した手順です。
一方で、環境によっては以下のような方法の方がシンプルに対応できるケースもあります。
- パブリックサブネットに Windows EC2 インスタンスを起動
- インターネット接続可能な状態で AWS CLI をインストール
- 必要な初期設定を行った上で カスタム AMI を作成
- 作成した AMI から、プライベートサブネットに EC2 インスタンスを起動
この方法であれば、AWS CLI の導入手順自体は非常に簡単になります。
本ブログが誰かの参考になれば幸いです。
参考資料
- AWS CLI の最新バージョンのインストールまたは更新 - AWS Command Line Interface
- 署名付き URL を使用したオブジェクトのダウンロードおよびアップロード - Amazon Simple Storage Service
- コンソールからコマンドを実行する - AWS Systems Manager
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






