yuj1osm's tech blog

クラウドやセキュリティなど

Amazon EC2 Instance Connect Endpoint経由でEC2インスタンスのプライベートIPアドレスにSSH接続する

Amazon EC2 Instance Connectで、パブリック IP アドレスなしのSSHおよびRDP接続ができるようになりました。

aws.amazon.com

今回はプライベートサブネットに配置したEC2インスタンスに、Amazon EC2 Instance Connect Endpoint経由でSSH接続をしてみます。
以下が今回作成する構成図です。

アップデート概要

  • EC2 Instance Connect Endpoint (EIC エンドポイント) を使用すると、パブリック IP アドレスを使用せずに EC2 インスタンスSSHおよびRDP接続が可能
  • プライベートサブネット内のインスタンスにリモート接続できるため、接続にパブリックIPv4アドレスを使用する必要がない

事前準備

構成図のセキュリティグループを作成しておきます。

EC2 Instance Connect Endpoint用のセキュリティグループ

セキュリティグループ名 : test-eic-sg
 インバウンドルール : なし
 アウトバウンドルール : セキュリティグループ「test-ec2-sg」宛のSSH(22)

EC2インスタンス用のセキュリティグループ

セキュリティグループ名 : test-ec2-sg
 インバウンドルール : セキュリティグループ「test-eic-sg」からのSSH(22)
 アウトバウンドルール : 0.0.0.0/0宛の全ポート

VPCの「エンドポイント」→「エンドポイントの作成」から、「EC2 Instance Connect Endpoint」を選択します。

事前に作成した、EC2 Instance Connect Endpoint用のセキュリティグループ「test-eic-sg」を選択し、サブネットを指定して、「エンドポイントを作成」を押下します。

EC2に接続する

それでは、AWSマネジメントコンソールから接続するEC2インスタンスを選択し、Amazon EC2 Instance Connect Endpoint経由でSSH接続してみます。
「EC2 Instance Connect」タブから、「EC2 Instance Connectエンドポイントを使用して接続する」を選択し、エンドポイントを指定して、「接続」します。

接続できました。

CloudTrailログを確認する

AWS CloudTrailで接続ログを取得しているので、いつ誰がどのインスタンスに接続したかを調査することができます。
イベント名は「OpenTunnel」です。

Trailログの例

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "xxxxxxxxxxxx",
        "arn": "arn:aws:iam::xxxxxxxxxxxx:user/xxxxxxxxxxxx",
        "accountId": "xxxxxxxxxxxx",
        "accessKeyId": "xxxxxxxxxxxx",
        "userName": "xxxxxxxxxxxx"
    },
    "eventTime": "2023-06-25T05:09:44Z",
    "eventSource": "ec2-instance-connect.amazonaws.com",
    "eventName": "OpenTunnel",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxxxxxxxxxxx",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0",
    "requestParameters": {
        "instanceConnectEndpointId": "eice-xxxxxxxxxxxx",
        "maxTunnelDuration": "3600",
        "remotePort": "22",
        "privateIpAddress": "10.0.128.161"
    },
    "responseElements": null,
    "requestID": "xxxxxxxxxxxx",
    "eventID": "xxxxxxxxxxxx",
    "readOnly": false,
    "resources": [
        {
            "accountId": "xxxxxxxxxxxx",
            "type": "AWS::EC2::InstanceConnectEndpoint",
            "ARN": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance-connect-endpoint/eice-xxxxxxxxxxxx"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "xxxxxxxxxxxx",
    "eventCategory": "Management"
}

SSM Session Managerとの違い

以前、SSM Session Managerを使ってEC2インスタンスに接続する方法を紹介しました。

yuj1osm.hatenablog.com

SSM Session ManagerはIAMポリシーでアクセスコントロールをしているのに対し、Instance Connect Endpointはセキュリティグループでアクセスコントロールしています。
要件に応じて使い分ければ良いと思います。

また、SSM Session Managerは3つのVPCエンドポイントが必要で費用が掛かりますが、Instance Connect Endpointは無料になります。
費用面を気にする場合は、このメリットは大きいと思います。

まとめ

プライベートサブネットに配置したEC2インスタンスに、Amazon EC2 Instance Connect Endpoint経由でSSH接続することができました。
プライベートサブネットのEC2インスタンスに対して、手軽に安全に接続できるため、非常に使い勝手が良いと思います。
SSM Session Managerとの違いを意識しながら、要件に応じて使い分けていただければと思います。