はじめに
EC2 Instance ConnectがPrivate Subnetに対応したEC2 Instance Connect Endpointが出たようなので試してみた
応用すれば、ローカルとRDSをVPNなしで接続可能!!
事前準備
- AWS-CLI aws-cli/2.12.0以上をローカルにインストール
 - VPCの構築
 - EC2の構築とSSHのキーペア or Windowsのパスワードを控える
 
構築
- 
マネジメントコンソールの場合
- VPCのコンソールを開く
 - 左のペインからエンドポイントを選択
 - エンドポイントを作成を謳歌
 - EC2 Instance Connect Endpointを選択し、適当なVPCとサブネット、セキュリティグループを選択
 
 - 
CloudFormationの場合
ドキュメントはあるのに実際に試したら非対応リソースだった。悲しいね。ドキュメントリンク
 
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  EICEndPoint:
    Type: AWS::EC2::InstanceConnectEndpoint
    Properties: 
      SecurityGroupIds: 
        - String
      SubnetId: String
接続
- 
以下のコマンドを実行する
aws ec2-instance-connect open-tunnel \ --instance-connect-endpoint-id エンドポイントID \ --private-ip-address EC2のプライベートIP \ --local-port ローカルで使用するポート(今回は13389) \ --remote-port ターゲットのポート(今回はRDPなので3389を指定) - 
リモートデスクトップアプリに
127.0.0.1:ローカルで使用するポートを入力 
無事ローカルとVPCをEC2 Instance Connect Endpointを使用して繋ぐことができました

※ SSHの場合は下記のコマンドを実行する(手順1はremote-port引数を省略するor22番ポートを指定する以外変化なし)
ssh -i キーペア(pemファイル)へのパス ec2-user@localhost -p 10022
課題になりそうなところ
- WebSocketを使っているので、Proxy配下では死ぬ可能性がある
 - SSHの場合、キーペアの保管がいる(マネジメントコンソールから接続する場合は不要)
 - CloudFormation・CDKによる構築が未対応(カスタムリソースで対応可能 → リンク )
 - AWS CloudTrailでの監視になる(別途CloudWatchやS3、Athenaと連携が必要になる)
 - 接続先をIAM Policyで制御できず、セキュリティグループによる制御が必要になる(=グループ・人を限定して制御できない)
 - VPC1つに付き1つのエンドポイント(=AZ障害に弱い)
 
良いと感じたところ
- VPCエンドポイントが不要なので安い(転送料のみ)
 - SSHやRDPだけでなく、VPCのリソースにはすべてアクセスできるのでVPNのように使える(常時接続不可なので、ちょっとした作業に良い)
 - 踏み台撲滅できる
 - IAM Policyで接続元のIPアドレス制限が可能(=マネコンアクセスと一括管理が可能)