なぜSSHではなくSSMにしたか
SSHでEC2へ接続する場合、Public IPを付与したり、踏み台サーバーやVPNなどの接続経路を用意したりする必要があります。
特にPublic IPを付与してインターネット経由で接続する構成では、外部から到達可能な経路を持つことになります。
一方、SSM Session Managerを利用すれば、EC2をPrivate Subnetに配置したまま接続できます。SSH用の22番ポートを開放したり、秘密鍵を管理したりする必要もありません。
ただし、SSM接続を利用するには、SSM Agentの導入、IAMロールの設定、Systems Managerへ通信するためのネットワーク経路などを事前に準備する必要があります。
SSM接続に必要な要素
SSM Session ManagerでEC2へ接続するためには、主に次の3つの要素が必要です。
- EC2にSSM Agentがインストールされ、起動していること
- EC2にアタッチされたIAMロールが、AmazonSSMManagedInstanceCore 相当の権限を持っていること
- EC2からSystems Managerへ通信できるネットワーク経路があること
今回の構成では、EC2をPrivate Subnetに配置しているため、Systems Managerへ接続するために ssm、ssmmessages、ec2messages のInterface VPC Endpointを作成しています。
ssm / ssmmessages / ec2messages の役割
今回作成したVPC Endpointには、それぞれ異なる役割があります。
- ssm
Systems Manager APIとの通信に使用します。 - ssmmessages
Session Managerのセッション通信や、SSM Agentとのメッセージ通信に使用します。 - ec2messages
SSM AgentとSystems Manager間のメッセージ通信に使用されてきたEndpointです。
SSM Agent 3.3.40.0以降では、利用可能な場合は ec2messages より ssmmessages が優先して使用されます。
また、2024年以降に開設されたAWSリージョンでは ec2messages はサポートされず、ssmmessages が使用されます。
今回は ssm、ssmmessages、ec2messages の3つを作成しました。
ただし、現在のSSM Agentでは ssmmessages が優先されるため、ec2messages については今後、本当に必要か確認して削除を検討します。
Interface VPC EndpointとSecurity Group
Interface型VPC Endpointは、Subnet内にENI(Elastic Network Interface)を作成し、プライベートIPアドレスを持ちます。
そのため、VPC EndpointにSecurity Groupを設定して、どこからどのポートへの通信を許可するか制御できます。
今回の構成では、SSM用VPC EndpointのSecurity Groupで、EC2のSecurity GroupからのTCP 443(HTTPS)のみを許可しています。
Private DNSの役割
VPC Endpointには、AWSサービスごとに対応するサービス名があります。
Private DNSを有効にすると、通常のAWSサービスのDNS名を名前解決した際に、その通信をVPC EndpointのプライベートIPアドレスへ向けることができます。
そのため、SSM Agent側で特別な接続先を指定しなくても、通常のSystems ManagerのDNS名を使ったまま、VPC Endpoint経由で通信できます。
VPC EndpointとNAT Gatewayの役割の違い
VPC Endpointを利用すると、EC2からAWSサービスへインターネットを経由せずに接続できます。
そのため、インターネットへ通信を出さず、AWSサービスとの通信だけで完結させたい場合に有効です。
一方、NAT GatewayはPrivate Subnetに配置したEC2からインターネットへ通信する必要がある場合に利用します。
Spring Bootアプリケーションを配置することを想定しているため、外部リポジトリからパッケージやライブラリを取得する必要があります。そのため、外部通信の経路としてNAT Gatewayも利用しています。
NAT Gatewayは外部サービスにも接続できるため通信先の自由度は高いですが、AWSサービスとの通信だけでよい場合は、VPC Endpointを利用することでインターネットを経由しない構成にできます。
通信経路は次のようになります。
-
Systems Managerへの通信
EC2 → Interface VPC Endpoint → Systems Manager -
外部パッケージ取得
EC2 → NAT Gateway → Internet Gateway → Internet
NAT Gatewayへの依存を減らす方法
NAT Gatewayへの依存を減らす方法として、次のような構成が考えられます。
- 必要なパッケージやミドルウェアをあらかじめAMIに組み込んでおく
- 必要なファイルをS3に配置する
- S3 Gateway Endpointを作成し、Private Subnetが利用するRoute Tableに関連付ける
S3 Gateway Endpointを利用することで、EC2からS3への通信はNAT Gatewayやインターネットを経由せずに行えます。
ただし、GitHubや外部のパッケージリポジトリなど、AWS外のサービスへ接続する必要がある場合は、別途NAT Gatewayなどの外部通信経路が必要です。