はじめに
AWSでWindows ServerのEC2インスタンスを利用する場合、通常はRDPで接続します。
しかし、一般的なRDP接続では以下のような構成になりがちです。
- EC2にパブリックIPを付与する
- セキュリティグループでTCP/3389を開放する
- 踏み台サーバーを用意する
- VPN経由で接続する
今回は、AWS Systems ManagerのFleet Managerを使い、起動したてのWindows Server EC2へブラウザからRDP接続します。
この方法では、EC2にパブリックIPを付けず、RDPポートも開放せずに接続できます。
今回の構成
利用者
↓
AWS Management Console
↓
Systems Manager Fleet Manager
↓
VPC Endpoint
↓
Private Subnet上のWindows Server EC2
今回のポイントは以下です。
- EC2にパブリックIPを付与しない
- TCP/3389を開放しない
- 踏み台サーバーを使わない
- Fleet ManagerからブラウザRDPする
- Systems Manager用VPCエンドポイントはCloudFormationで作成する
前提条件
今回の前提は以下です。
| 項目 | 内容 |
|---|---|
| リージョン | ap-northeast-1 |
| OS | Windows Server |
| 接続方式 | AWS Systems Manager Fleet Manager |
| EC2配置先 | Private Subnet |
| パブリックIP | なし |
| RDPポート開放 | なし |
| VPC Endpoint作成方法 | CloudFormation |
全体の流れ
作業の流れは以下です。
- Systems Manager用VPCエンドポイントをCloudFormationで作成する
- EC2用IAMロールを作成する
- Windows Server EC2を起動する
- Fleet ManagerにEC2が表示されることを確認する
- Administratorパスワードを取得する
- Fleet ManagerからRDP接続する
1. Systems Manager用VPCエンドポイントを作成する
Private Subnet上のEC2をSystems Managerで管理するには、EC2からSystems Managerへ通信できる必要があります。
今回はインターネットやNAT Gatewayを使わず、VPCエンドポイントを使います。
作成するVPCエンドポイントは以下の3つです。
| サービス | 用途 |
|---|---|
| ssm | Systems Manager API用 |
| ssmmessages | Session Manager/Fleet Managerの通信制御用 |
| ec2messages | SSM Agentとのメッセージ通信用 |
CloudFormationテンプレート
以下のCloudFormationテンプレートを使用します。
AWSTemplateFormatVersion: '2010-09-09'
Description: Create SSM Interface VPC Endpoints and Security Group
###############################################################################
# Parameters
###############################################################################
Parameters:
# 対象VPC
VpcId:
Type: AWS::EC2::VPC::Id
Description: Target VPC ID
# Interface Endpointを配置するサブネット
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Description: Subnets for Interface VPC Endpoints
# Endpointへのアクセスを許可するCIDR
AllowedCidr:
Type: String
Description: Allowed source CIDR
###############################################################################
# Resources
###############################################################################
Resources:
###########################################################################
# Security Group for SSM Endpoints
###########################################################################
SsmEndpointSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security Group for SSM VPC Endpoints
VpcId: !Ref VpcId
# EC2からEndpointへのHTTPS通信を許可
SecurityGroupIngress:
- Description: Allow HTTPS from allowed CIDR
IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Ref AllowedCidr
# Outboundは全許可
SecurityGroupEgress:
- Description: Allow all outbound traffic
IpProtocol: -1
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ssm-endpoint-sg
###########################################################################
# SSM Endpoint
###########################################################################
SsmEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !Ref VpcId
VpcEndpointType: Interface
ServiceName: !Sub com.amazonaws.${AWS::Region}.ssm
PrivateDnsEnabled: true
SubnetIds: !Ref SubnetIds
SecurityGroupIds:
- !Ref SsmEndpointSecurityGroup
###########################################################################
# SSM Messages Endpoint
###########################################################################
SsmMessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !Ref VpcId
VpcEndpointType: Interface
ServiceName: !Sub com.amazonaws.${AWS::Region}.ssmmessages
PrivateDnsEnabled: true
SubnetIds: !Ref SubnetIds
SecurityGroupIds:
- !Ref SsmEndpointSecurityGroup
###########################################################################
# EC2 Messages Endpoint
###########################################################################
Ec2MessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !Ref VpcId
VpcEndpointType: Interface
ServiceName: !Sub com.amazonaws.${AWS::Region}.ec2messages
PrivateDnsEnabled: true
SubnetIds: !Ref SubnetIds
SecurityGroupIds:
- !Ref SsmEndpointSecurityGroup
###############################################################################
# Outputs
###############################################################################
Outputs:
EndpointSecurityGroupId:
Description: SSM endpoint security group ID
Value: !Ref SsmEndpointSecurityGroup
SsmEndpointId:
Description: SSM endpoint ID
Value: !Ref SsmEndpoint
SsmMessagesEndpointId:
Description: SSM Messages endpoint ID
Value: !Ref SsmMessagesEndpoint
Ec2MessagesEndpointId:
Description: EC2 Messages endpoint ID
Value: !Ref Ec2MessagesEndpoint
CloudFormationスタックを作成する
AWSマネジメントコンソールから作成します。
CloudFormationを開きます。
CloudFormation
↓
スタックの作成
↓
新しいリソースを使用
テンプレートをアップロードします。
テンプレートファイルのアップロード
↓
上記YAMLファイルを選択
↓
次へ
スタック名を入力します。
例です。
ssm-vpc-endpoints
パラメータを入力します。
| パラメータ | 指定内容 |
|---|---|
| VpcId | 対象EC2を配置するVPC |
| SubnetIds | VPCエンドポイントを配置するPrivate Subnet |
| AllowedCidr | EC2が所属するVPC CIDRまたはPrivate SubnetのCIDR |
AllowedCidrの例です。
10.0.0.0/16
より絞る場合は、EC2を配置するPrivate SubnetのCIDRを指定します。
例です。
10.0.1.0/24
作成後、以下の3つのInterface Endpointが作成されていれば成功です。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.ec2messages
2. EC2用IAMロールを作成する
次に、Windows Server EC2がSystems Managerに登録されるようにIAMロールを作成します。
IAMを開きます。
IAM
↓
ロール
↓
ロールを作成
信頼されたエンティティタイプは以下を選択します。
AWSのサービス
ユースケースは以下です。
EC2
許可ポリシーには以下を付与します。
AmazonSSMManagedInstanceCore
ロール名の例です。
ec2-ssm-managed-role
このロールを、後で作成するEC2にアタッチします。
3. Windows Server EC2を起動する
EC2を作成します。
EC2
↓
インスタンス
↓
インスタンスを起動
AMIを選択する
Windows ServerのAMIを選択します。
例です。
Microsoft Windows Server 2022 Base
または
Microsoft Windows Server 2025 Base
インスタンスタイプを選択する
検証用途であれば、以下のようなインスタンスタイプで構いません。
t3.medium
Windows ServerはLinuxよりメモリを消費するため、t3.microなどは避けた方が無難です。
キーペアを選択する
Administratorパスワードの復号にキーペアを使います。
既存のキーペアを選択するか、新規作成します。
例です。
windows-keypair
.pemファイルは後で使用するため、保管しておきます。
ネットワークを設定する
ネットワーク設定は以下のようにします。
| 項目 | 設定 |
|---|---|
| VPC | VPCエンドポイントを作成したVPC |
| サブネット | Private Subnet |
| パブリックIPの自動割り当て | 無効 |
セキュリティグループを設定する
EC2側のセキュリティグループでは、RDPを開放しません。
インバウンドルールは空でも構いません。
Inbound rule: なし
アウトバウンドは、デフォルトの全許可とします。
Outbound rule: すべて許可
EC2からVPCエンドポイントへTCP/443で通信できれば、Systems Managerに登録できます。
IAMロールをアタッチする
高度な詳細、または作成後のインスタンス設定で、先ほど作成したIAMロールをアタッチします。
ec2-ssm-managed-role
この設定がないと、EC2はSystems ManagerのManaged Nodeとして登録されません。
EC2を起動する
設定内容を確認して、EC2を起動します。
4. Fleet Managerに表示されることを確認する
EC2起動後、数分待ちます。
Windows Serverの初期化には少し時間がかかります。
EC2のステータスチェックが以下になっていることを確認します。
2/2 checks passed
次に、Systems Managerを開きます。
Systems Manager
↓
Fleet Manager
↓
Managed nodes
対象のWindows Server EC2が表示されていれば成功です。
表示される名前は、EC2のNameタグやインスタンスIDです。
5. Administratorパスワードを取得する
Fleet ManagerでRDP接続するには、Windowsのユーザー名とパスワードが必要です。
まず、Administratorパスワードを取得します。
EC2コンソールを開きます。
EC2
↓
インスタンス
↓
対象のWindows Server EC2を選択
↓
接続
RDPクライアント タブを開きます。
RDPクライアント
↓
パスワードを取得
キーペアの秘密鍵ファイルをアップロードします。
例です。
windows-keypair.pem
復号に成功すると、以下が表示されます。
ユーザー名: Administrator
パスワード: xxxxxxxxx
このパスワードを控えておきます。
6. Fleet ManagerからRDP接続する
EC2コンソールから接続します。
EC2
↓
インスタンス
↓
対象のWindows Server EC2を選択
↓
接続
RDPクライアント タブを開きます。
接続タイプで以下を選択します。
Fleet Managerを使用して接続
その後、以下をクリックします。
Fleet Manager Remote Desktop
Fleet Managerのリモートデスクトップ接続画面が開きます。
認証情報を入力する
以下を入力します。
| 項目 | 値 |
|---|---|
| Username | Administrator |
| Password | 取得したAdministratorパスワード |
入力後、接続します。
ブラウザ上にWindows Serverのデスクトップが表示されれば成功です。
接続後の状態
この構成では、以下を使っていません。
- パブリックIP
- Elastic IP
- TCP/3389のインバウンド許可
- 踏み台サーバー
- VPN
- NAT Gateway
EC2はPrivate Subnetに配置したまま、Systems Manager経由でRDP接続できます。
よくあるトラブル
Fleet ManagerにEC2が表示されない
以下を確認します。
- EC2にIAMロールがアタッチされているか
- IAMロールにAmazonSSMManagedInstanceCoreが付与されているか
- EC2からVPCエンドポイントへTCP/443で通信できるか
- VPCエンドポイントが対象VPCに作成されているか
- VPCエンドポイントのPrivate DNSが有効か
- EC2のアウトバウンド通信が許可されているか
特に起動直後は、Fleet Managerに表示されるまで数分かかる場合があります。
VPCエンドポイントのセキュリティグループで拒否されている
今回のCloudFormationテンプレートでは、VPCエンドポイント用セキュリティグループにAllowedCidrを指定しています。
AllowedCidrにEC2のプライベートIPが含まれていない場合、EC2からVPCエンドポイントへ通信できません。
例として、EC2が以下のIPだったとします。
10.0.1.25
この場合、AllowedCidrには以下のようにEC2を含むCIDRを指定します。
10.0.1.0/24
またはVPC全体を許可します。
10.0.0.0/16
IAMロールを後から付けたが表示されない
EC2作成後にIAMロールを付けた場合、Systems Managerに登録されるまで少し時間がかかることがあります。
しばらく待っても表示されない場合は、Windows Server上のSSM Agentを確認します。
PowerShellで確認します。
Get-Service AmazonSSMAgent
正常な場合は、以下のように表示されます。
Status Name DisplayName
------ ---- -----------
Running AmazonSSMAgent Amazon SSM Agent
停止している場合は、起動します。
Start-Service AmazonSSMAgent
ただし、Private Subnet上でまだ接続できない状態の場合、まずはIAMロール、VPCエンドポイント、セキュリティグループを確認してみましょう。
Administratorパスワードが取得できない
Windows Serverの初期化が完了していない可能性があります。
EC2起動直後は、パスワード取得に時間がかかります。
ステータスチェックが2/2になってから、数分待って再度取得します。
また、EC2作成時に指定したキーペアと、パスワード取得時に使用する秘密鍵が一致している必要があります。
RDPポートを開ける必要はあるか
ありません。
Fleet Managerを使う場合、通常のRDP接続のようにインターネットからTCP/3389を開放する必要はありません。
EC2がSystems ManagerのManaged Nodeとして登録され、Fleet Managerから接続できれば問題ありません。
今回の構成で注意すること
VPCエンドポイント料金が発生する
Interface VPC Endpointは、エンドポイントごとに時間課金とデータ処理課金が発生します。
エンドポイント1つあたり$10/月もするので、最低でも$30/月ということは、5,000円ほどかかるので、注意が必要です。(当方、$90ほどやってしまいました。。)
今回の構成では、以下3つのInterface Endpointを作成します。
ssm
ssmmessages
ec2messages
検証環境で不要になった場合は、CloudFormationスタックを削除して停止するのを忘れないようにしましょう。
VPCエンドポイントを配置するサブネット
VPCエンドポイントは、EC2が配置されているサブネットと同じVPC内に作成する必要があります。
複数AZで運用する場合は、各AZのPrivate SubnetをSubnetIdsに指定します。
EC2のアウトバウンドを絞っている場合
EC2側のセキュリティグループやNACLでアウトバウンドを絞っている場合、VPCエンドポイントへのTCP/443通信を許可する必要があります。
最低限、以下の通信が必要です。
EC2 → SSM用VPCエンドポイント: TCP/443
まとめ
AWS Systems Manager Fleet Managerを使うことで、Windows Server EC2へブラウザからRDP接続できます。
今回の構成では、以下を実現しました。
- Windows Server EC2をPrivate Subnetに配置
- パブリックIPなし
- TCP/3389のインバウンド開放なし
- 踏み台サーバーなし
- NAT Gatewayなし
- Systems Manager用VPCエンドポイントをCloudFormationで作成
- Fleet ManagerからブラウザRDP接続
Windows Serverを安全に運用したい場合、Fleet Managerを使ったRDP接続は有効な選択肢です。
特に、検証環境や管理用サーバーで「とりあえずRDPのために3389を開ける」という構成を避けたい場合やJTCでHTTPSしか空いていない場合に便利です。