プライベートサブネット上の Windows EC2 インスタンスに AWS CLI を導入してみた (非インターネット接続環境)

プライベートサブネット上の Windows EC2 インスタンスに AWS CLI を導入してみた (非インターネット接続環境)

2026.01.18

はじめに

テクニカルサポートの 片方 です。
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 を利用

07
08

ネットワーク構成

  • 対象 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 エンドポイント経由でマネージドノードに登録する方法については省略させて頂きます。

大まかな流れは以下のとおりです。

  1. AWS CLI (Windows 用 MSI) をローカル端末で取得し、S3 バケットに配置
  2. 配置した MSI ファイルに対して、署名付き URL (Presigned URL) を発行
  3. SSM Run Command を利用して、EC2 インスタンス上へ MSI ファイルをダウンロード
  4. ダウンロードした MSI ファイルを使用して、EC2 インスタンス上で AWS CLI をインストール
  5. フルパス指定で AWS CLI を実行し、動作確認を実施

それぞれの手順について、順番に見ていきます。

AWS CLI (Windows 用 MSI) を S3 バケットに配置

まずは、AWS CLI の Windows 用インストーラを用意します。
以下の公式ページから、インターネット接続可能なローカル端末でAWS CLI v2(64 bit)の MSI ファイルをダウンロードします。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

Windows 用の AWS CLI MSI インストーラ (64 ビット) をダウンロードして実行します。
https://awscli.amazonaws.com/AWSCLIV2.msi

ダウンロードした AWSCLIV2.msi を、対象の Windows EC2 インスタンスからアクセス可能な S3 バケットへアップロードします。
※ 後続の手順でこの MSI ファイルを SSM の機能を利用して EC2 インスタンスにダウンロードします。EC2 インスタンスにアタッチした IAM ロールから読み取り可能な S3 バケットである必要があります。

01

署名付き URL(Presigned URL)を発行

次に、S3 バケットに配置した AWS CLI の MSI ファイルを EC2 インスタンスからダウンロードするために、署名付き URL (Presigned URL) を発行します。
今回の構成では AWS CLI が未インストールのため IAM 認証を用いた S3 アクセスが行えず、その代替として一時的に S3 オブジェクトへアクセス可能な署名付き URL (Presigned URL) を利用しています。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-presigned-url.html

署名付き 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=...

02

SSM Run Command で MSI を EC2 インスタンスにダウンロード

AWS Systems Manager の Run Command 機能を利用して、S3 バケットに配置した AWS CLI の MSI ファイルを Windows EC2 インスタンス上にダウンロードします。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/running-commands-console.html

Run Command の実行

AWS マネジメントコンソールから以下の手順で Run Command を実行します。

  • AWS Systems Manager
  • Run Command
  • ドキュメント:AWS-RunPowerShellScript
  • 対象:対象の Windows EC2 インスタンス

03

実行する 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 が配置されます。

04

なお、有効期限切れの場合は、Run Command 自体は成功するものの以下の Error が出力されます。

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

05

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

06

まとめ

今回ご紹介した方法は、既にプライベートサブネットに EC2 インスタンスが存在している場合や、セキュリティ要件上インターネット接続が許可されていない環境を想定した手順です。
一方で、環境によっては以下のような方法の方がシンプルに対応できるケースもあります。

  • パブリックサブネットに Windows EC2 インスタンスを起動
  • インターネット接続可能な状態で AWS CLI をインストール
  • 必要な初期設定を行った上で カスタム AMI を作成
  • 作成した AMI から、プライベートサブネットに EC2 インスタンスを起動

この方法であれば、AWS CLI の導入手順自体は非常に簡単になります。
本ブログが誰かの参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事