この記事でわかること
インターネットから隔離されたプライベートサブネット内のWindows EC2環境において、ファイルの受け渡しは悩みの種です 。
先日、業務で「閉域環境の Windows EC2 に DataSpider Servista をインストールして検証環境を作る」というミッションが発生しました。
特に今回のシステム構成では、具体的に以下のような制約がありました。
・ローカル端末からのファイルコピー不可
EC2へのRDP接続にAWS Systems Manager Fleet Managerを利用しているため、手元の端末からの直接的なファイルのコピー&ペーストが制限されている。
・オンプレミスからのファイル転送不可
ネットワーク的な疎通はあるものの、セキュリティ上の理由からオンプレミス側の操作権限がなく、FTPやファイル共有といったプッシュ型のファイル転送が行えない。
このような制約がある場合、よくある解決策としてS3バケットをファイルの一時保管庫として利用する方法が挙げられます。
例えば、「S3バケット内のインストーラーをこのEC2へ転送したい」という場面、エンジニアの皆様ならどう対処されますか?
本来であれば aws s3 cp を実行すれば済む話ですが、「そもそもAWS CLIがインストールされていない」という状況に直面することがあります。
AWS CLIのインストーラーをダウンロードしたくても、インターネットに繋がっていないからダウンロードできない……。
そんなジレンマに陥り、作業が止まってしまった経験はないでしょうか。
本記事では、この状況をAWS Tools for PowerShellを使ってスマートに解決できた方法を紹介します。
ネットで検索すると、AWS CLIがプリインストールされていない閉域環境へのファイル転送方法として、一般的に次のようなプロセスが提案されています。
1.転送したいファイルをS3にオブジェクトとして配置
2.対象S3オブジェクトの「署名付きURL」を発行
3.対象Windows EC2にRDP接続し、Windows PowerShell を起動(もしくは RunCommand から 4. を実行)
4.PowerShellの標準コマンドレット「Invoke-WebRequest」で署名付きURLを指定して実行
# S3からインストーラーをダウンロードする例
Invoke-WebRequest -Uri "署名付きURL" -OutFile "C:\temp\app-setup.msi"
参考サイト:プライベートサブネット上の Windows EC2 インスタンスに AWS CLI を導入してみた (非インターネット接続環境) | DevelopersIO
このアプローチでも目的は達成可能ですが、わざわざ長大な署名付きURLを発行し、それをEC2上のコマンドにコピペする……というのは、少し面倒ですよね。 署名付きURLは「有効期限切れによる作業のやり直し」といった地味なストレスも発生します。
「もっとスマートに、手間をかけずに解決できる方法はないか」と模索していた折に出会ったのが、AWS Tools for PowerShell というツールの存在でした。
ファイル転送を「署名付きURL」+ PowerShellの標準コマンドレット「Invoke-WebRequest」で行うのではなく、AWS Tools for PowerShellのコマンドレット「Read-S3Object」のみで実現する方法です。
前提
・EC2インスタンスに対し、対象のS3バケットへの読み取り権限(s3:GetObject など)を持つIAMロールがアタッチされていること
・VPC内にS3向けのVPCエンドポイントが構築されており、EC2からS3への経路が確保されていること
手順
1.対象Windows EC2にRDP接続し、Windows PowerShell を起動
2.AWS Tools for PowerShellのコマンドレット「Read-S3Object」を実行
# S3からインストーラーをダウンロードする例
Read-S3Object -BucketName "your-bucket-name" -Key "installers/app-setup.msi" -File "C:\temp\app-setup.msi"
これだけでS3からのダウンロードが完了します。
あとはダウンロードしたインストーラー(C:\temp\app-setup.msi)をそのままGUIでダブルクリックしてインストールを進めるだけです。この方法であれば、面倒な署名付きURLを発行する必要がありません!
※もしコマンドが認識されずエラーになる場合は、環境にモジュールが組み込まれていない可能性があります。詳しくは後述のモジュールの確認方法をご参照ください。
\AWSの設定でお困りですか?専門エンジニアがサポートします/
AWS Tools for PowerShellとは、Windows環境でお馴染みの「PowerShell」を使って、コマンドラインからAWSの各種サービス(S3やEC2など)を直接操作・管理するための公式ツールです。
ツール全体の総称を 「AWS Tools for PowerShell」 と呼び、その中に提供形態として以下の3つの「モジュール(またはパッケージ)」が存在する、という位置づけになっています。
1.AWS.Tools(最新・推奨のモジュール分割版)
2.AWSPowerShell.NetCore(クロスプラットフォーム用の単一モジュール版)
3.AWSPowerShell(Windows専用の旧式・単一モジュール版)
「でも、それもモジュールをインストールしないと使えないのでは?」と思われるかもしれません。私も最初はそう思いました。
しかし、AWSが提供している標準の Windows Server AMI には、実はこのモジュール がプリインストールされているのです!
(なんでAWS Tools for PowerShellは入ってるのに、AWS CLIは入れてくれていないんだろう…)
AWS Tools for PowerShellには複数のモジュールが存在するため、まずは自身の環境にどれが組み込まれているかを確認してみましょう。
手順
1.対象Windows EC2にRDP接続し、Windows PowerShell を起動
2.PowerShellの標準コマンドレット「Get-Module」および「Select-Object」を組み合わせて実行
# AWS関連モジュールのインストール情報を取得
Get-Module -ListAvailable -Name AWS* | Select-Object Name, Version, Path
出力例:
今回のEC2環境(Windows Server 2025)にはAWS.Tools モジュールが入っていました。
出力結果の見方:
・AWSPowerShell.NetCore モジュールの場合出力内容に「AWSPowerShell.NetCore」が表示されます。
・AWS.Tools モジュールの場合出力内容に 各AWSサービスごとの細かいモジュール名(AWS.Tools.Common や AWS.Tools.S3 など)が表示されます。
・AWSPowerShell(旧版) モジュールの場合出力内容に「AWSPowerShell」が表示されます。
公式ドキュメントでは以下の通り、後継のモジュール(AWS.Tools)への移行が推奨されています。
"AWSPowerShell は、AWS Tools for PowerShell のインストール方法として推奨されていません。推奨される方法については、「AWS.Tools のインストール (推奨)」を参照してください。"
引用元:Windows PowerShell (レガシー) に AWSPowerShell をインストールする - AWS Tools for PowerShell
裏側では、以下のようなリレーが行われてAWSと通信しています。
1.コマンドの実行: ユーザーがコマンドレット(例:Get-S3Object)を実行します。
2.SDKへの橋渡し: モジュールがその指示を受け取り、裏側で組み込まれている AWS SDK for .NET に渡します。
3.APIリクエストの送信: SDKが、環境内の認証情報(今回であればEC2にアタッチされたIAMロール)を自動で取得・署名し、各AWSサービスが提供しているAPIに対してリクエスト(HTTP/HTTPS通信)を送ります。
4.オブジェクトとして返却: AWSから返ってきたレスポンス(JSONやXML)を、SDKが .NETのオブジェクト に変換してPowerShellの画面に出力します。
参考サイト:What are the AWS Tools for PowerShell?
このように、実態は「AWS SDK for .NET」であるため、プログラミング言語でSDKを扱うのと同じくらい構造的で確実なデータ処理を、スクリプト上で手軽に実現できるのがAWS Tools for PowerShellの最大の魅力です。
運用管理や自動化で利用できるAWS Tools for PowerShellのコマンドレットを抜粋しました。
命名規則は基本的に 動詞-AWSサービスプレフィックス + リソース名 となっています。
Amazon S3
・Read-S3Object : S3バケットからファイルをダウンロードする
・Write-S3Object : S3バケットへファイルをアップロードする
・Get-S3Object : S3バケット内のファイル(オブジェクト)一覧を取得する
・Get-S3Bucket : S3バケットの一覧を取得する
・Remove-S3Object : S3バケット内のファイルを削除する
Amazon EC2
・Get-EC2Instance : EC2インスタンスの情報やステータスを取得する
・Start-EC2Instance : 停止しているEC2インスタンスを起動する
・Stop-EC2Instance : 稼働中のEC2インスタンスを停止する
・New-EC2Snapshot : EBSボリュームのスナップショットを作成する
AWS Systems Manager (SSM)
・Get-SSMParameter : パラメータストアから設定値やパスワードを取得する
・Send-SSMCommand : Run Commandを利用してインスタンス内でスクリプトを実行する
・Get-SSMCommandInvocation : 実行したRun Commandの結果やステータスを確認する
AWS IAM
・Get-IAMRole : IAMロールの情報を取得する
・Test-IAMCustomPolicy : 任意のポリシー(JSON)の動作をシミュレーションする
・New-IAMPolicy : IAMカスタマー管理ポリシーを作成する
・Register-IAMRolePolicy : IAMロールにポリシーをアタッチする
・Get-IAMUserList : IAMユーザーの一覧を取得する
・New-IAMAccessKey : IAMユーザーのアクセスキーを発行する
Amazon CloudWatch
・Get-CWMetricStatistic : CPU使用率などのメトリクスデータを取得する
・Write-CWMetricData : カスタムメトリクスをCloudWatchに送信する
これほど便利なツールなのに、Web検索してもAWS CLIほど情報が出てきません。
その理由は、AWSの記事の多くがLinuxベースで書かれていることと、AWS CLIの方がOSを問わず汎用的に使えるからです。
(私自身も普段はLinux EC2を扱っています。)
しかし、Windows EC2を運用する上では以下の違いがあります。
| ツール | 出力データ形式 | 特徴 |
|---|---|---|
| AWS CLI | 文字列(JSON, テキスト, テーブル) | どのOSでも同じ感覚で使える。特定の要素を抜き出すには、--query オプション(JMESPath)を用いた構造化データの抽出や、jq や grep などによるテキストベースのフィルタリングが必要。 |
| AWS Tools for PowerShell | .NETオブジェクト(プロパティを持ったデータの塊) | PowerShellのパイプライン(|)と相性抜群。プロパティ名(例:$_.Key)を指定するだけで直感的に値を取り出せる。テキスト解析不要。 |
このように、クロスプラットフォームな標準ツールとしての知名度はAWS CLIに及びませんが、Windowsの既存資産やスキルセットを最大限に活かしつつ、クラウド管理をより直感的かつ効率的に高度化できる点において、AWS Tools for PowerShell は強力な選択肢となります。
AWS Tools for PowerShellの仕組みやメリットをご紹介したところで、実際のシステム構築における活用例をご紹介します。
以下はイメージ図です。この赤枠部分を構築しました。
今回は、以下の閉域網接続を要件として満たす必要がありました。
・同一VPC内:localルートを利用してVPC内の各コンポーネント間を接続
・異なるアカウント・VPC間:Transit Gatewayを経由してルーティング
・VPC-S3間:VPC Endpointsを利用してプライベートネットワーク内で通信を完結
・オンプレ-AWS間:Direct Connectを利用して閉域網で経路を確立
・SaaS/iPaaS-AWS間:PrivateLinkを利用して閉域網で経路を確立
AWS CLIがプリインストールされていない環境でDataSpider ServistaのインストーラーをどうやってEC2に持ち込むかでつまずきましたが、今回紹介した Read-S3Object を使った手順で無事にS3からダウンロードでき、そのままセットアップを完了させることができました。
セットアップ完了後の DataSpider Studio(操作ツール)の画面です。
Windows環境であれば、無理にAWS CLIに固執せず、標準搭載されているAWS Tools for PowerShellを活用する方がスムーズに構築を進められると実感しました。
\AWSの設定でお困りですか?専門エンジニアがサポートします/
・閉域環境のWindows EC2でAWS CLIがなくても焦らなくてOK。
・AWS標準のWindows AMIなら AWS Tools for PowerShell が最初から入っている。
・PowerShellで Read-S3Object を使えば、AWS CLIの aws s3 cp のようにS3から直接ファイルをダウンロード可能。
閉域環境という制約もインフラの小技を知ることで作業効率が劇的に変わります。困ったときの手札の一つとして、ぜひこのAWS Tools for PowerShellという選択肢を加えてみてください。
著者プロフィール
N.H(AWSエンジニア)
🏅保有資格
・AWS Certified Cloud Practitioner
・AWS Certified Solutions Architect - Associate
・AWS Certified SysOps Administrator - Associate
・AWS Certified Developer - Associate
・AWS Certified Solutions Architect - Professional
・AWS Microcredentials Application Networking Demonstrated
・Google Cloud Certified - Generative AI Leader
・Snowflake認定 SnowPro Core
鉄道業界のシステム開発業務に1年半従事しています。
社内システム(データ管理基盤・データ分析基盤)やユーザー向けシステム(MaaSシステム・運行情報システム)の新規構築・改修に携わり、AWSでのインフラ構築とセキュアなDB運用の仕組みづくりに取り組んでいます。