LinuxインスタンスにSSM Session Manager経由でアクセスする
EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。
Session Manager は完全マネージド型の AWS Systems Manager 機能です。ブラウザベースのインタラクティブなワンクリックシェルまたは AWS CLI を介して Amazon EC2 インスタンスを管理できます。Session Manager を使用して、アカウント内のインスタンスとのセッションを開始できます。セッションの開始後、他の接続タイプと同様、bash コマンドを実行できます。
Session Manager を使用した Linux インスタンスへの接続
SSM Session Managerを使用したインスタンスへのアクセスは、一般的なSSHでのアクセスと比べてさまざまなメリットがあります。特に注目すべきポイントは、リモートアクセス用のポート開放が不要になる点と、踏み台サーバも不要になる点です。
インスタンスでインバウンド SSH ポートとリモート PowerShell ポートを開いたままにすると、エンティティが許可されていないコマンドや、悪意のあるコマンドをインスタンス上で実行するリスクが大幅に増加します。Session Manager は、これらの着信ポートを閉じることにより、SSH キーと証明書、踏み台ホスト、およびジャンプボックスの管理からユーザーを解放して、セキュリティ体制を向上させるのに役立ちます。
AWS Systems Manager Session Manager
今回はSSM Session Managerを使用してEC2インスタンスにアクセスする3パターンをご紹介します。
- インターネット経由でSSM Session Managerを使用してアクセス
- NATゲートウェイ経由でSSM Session Managerを使用してアクセス
- VPCエンドポイント経由でSSM Session Managerを使用してアクセス
SSM Session Managerを使用した接続の比較対象として、SSHを使用した接続もご紹介します。
なお本ページはLinuxインスタンスを対象とした内容です。WindowsインスタンスにSession Manager経由でアクセスする方法については、以下のページをご確認ください。
構築する環境
2つのVPCを作成します。
1つ目のVPCには2つのサブネットを作成します。
1つはインターネットにアクセス可能なパブリックサブネットとし、もう1つは不可なプライベートサブネットとします。
パブリックサブネットにインターネットゲートウェイとNATゲートウェイを作成します。
2つ目のVPCにはプライベートサブネットを1つ作成します。
こちらのVPCにはSSM用のVPCエンドポイントを設定します。
1つ目のVPCには3つのEC2インスタンス、2つ目のVPCにはEC2インスタンスを1つ作成します。
今回作成するインスタンスは最新のAmazon Linux 2023とします。
検証シナリオ
4つのインスタンスに対してアクセスを試みます。
以下に4インスタンスへのアクセス方法と、そのために作成するリソースを整理します。
ポイントはアクセス時の経路と方法です。
インスタンス | 経路 | 方法 |
インスタンス1 | インターネットゲートウェイ | SSH |
インスタンス2 | インターネットゲートウェイ | SSM Session Manager |
インスタンス3 | NATゲートウェイ | SSM Session Manager |
インスタンス4 | VPCエンドポイント | SSM Session Manager |
環境構築用のCloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/003
テンプレートファイルのポイント解説
セキュリティグループ設定
SSHとSSM Session Managerを比較する上で大きな違いがあるのがセキュリティグループです。
SSHの場合、同サービス用のポート(一般にtcp/22)を開ける必要があります。
一方SSM Session Managerであれば、そのような対応は不要です。
以下がセキュリティグループにおいて各インスタンスが許可するインバウンド通信をまとめた表です。
インスタンス | 方法 | セキュリティグループ |
インスタンス1 | SSH | 22/tcpを許可 |
インスタンス2 | SSM Session Manager | – |
インスタンス3 | SSM Session Manager | – |
インスタンス4 | SSM Session Manager | – |
インスタンス1:SSHを許可するセキュリティグループ
Resources:
InstanceSecurityGroup1:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-InstanceSecurityGroup1"
GroupDescription: Allow SSH.
VpcId: !Ref VPC1
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref SSHPort
ToPort: !Ref SSHPort
CidrIp: 0.0.0.0/0
Code language: YAML (yaml)
セキュリティグループを考える上でポイントは2つです。
1つ目はポート番号です。
今回はSSH(22/tcp)によってこのセキュリティグループが適用されるインスタンス1にアクセスしますから、同ポートを指定します。
2つ目は送信元です。
今回はCIDRとして「0.0.0.0/0」を指定します。
このように設定することによって、全送信元アドレスからのアクセスを許可することを意味します。
以上をまとめるとインターネット経由の全アドレスからのSSHを許可することになります。
インスタンス2および3:SSM Session Managerではインバウンド通信は発生しない
Resources:
InstanceSecurityGroup2:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-InstanceSecurityGroup2"
GroupDescription: Deny All.
VpcId: !Ref VPC1
Code language: YAML (yaml)
インスタンス2および3に適用するセキュリティグループです。
インスタンス1と比較すると良くわかりますが、何もインバウンド通信を許可していません。
つまり全てのインバウンド通信を許可しないということです。
実はSSM Session Manager等のSSMの働きは、インスタンス内のSSMエージェントが実行しています。
SSMエージェントはSSMと定期的に通信しており、この時の通信はSSMエージェントが送信元、SSMが宛先となります。
つまりSSM Session Managerを実行するためには、許可するべきインバウンド通信が存在しないということです。
ですから全インバウンド通信を許可しないセキュリティグループを作成します。
インスタンス4:VPCエンドポイント用のセキュリティグループではインスタンスからのHTTPSを許可する
Resources:
InstanceSecurityGroup3:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-InstanceSecurityGroup3"
GroupDescription: Deny All.
VpcId: !Ref VPC2
EndpointSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-EndpointSecurityGroup"
GroupDescription: Allow HTTPS from InstanceSecurityGroup3.
VpcId: !Ref VPC2
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref HTTPSPort
ToPort: !Ref HTTPSPort
SourceSecurityGroupId: !Ref InstanceSecurityGroup3
Code language: YAML (yaml)
前者がインスタンス4に適用するセキュリティグループです。
本インスタンスもSSM Session Managerを使用するため、全インバウンド通信を許可していません。
注目するべきは後者のセキュリティグループです。
これはVPCエンドポイント用です。
インスタンス4からのHTTPS通信(443/tcp)を許可します。
これは後述するVPCエンドポイントを作成する上での要件の1つです。
VPC エンドポイントにアタッチされたセキュリティグループでは、マネージドインスタンスのプライベートサブネットから、ポート 443 で着信接続を許可する必要があります。着信接続が許可されていない場合、マネージドインスタンスは SSM および EC2 エンドポイントに接続できません。
VPC エンドポイントの制約と制限
ルーティング設定
ルーティングを考える上でのポイントはインターネットゲートウェイを経由するかどうかです。
インターネットゲートウェイを経由する場合は、同ゲートウェイ向けのルーティング設定が必要となります。
一方インターフェースタイプのVPC Endpointを使用する場合はルーティング設定は不要です。
以下が各インスタンスに関係するルーティング設定をまとめた表です。
インスタンス | 方法 | 経路 | 配置するサブネット | ルーティング |
インスタンス1 | SSH | インターネットゲートウェイ | パブリックサブネット | インターネット向け |
インスタンス2 | SSM Session Manager | インターネットゲートウェイ | パブリックサブネット | インターネット向け |
インスタンス3 | SSM Session Manager | NATゲートウェイ | プライベートサブネット1 | NATゲートウェイ向け |
インスタンス4 | SSM Session Manager | VPCエンドポイント | プライベートサブネット2 | – |
インスタンス1および2:インターネットゲートウェイ向けのルーティング設定
インスタンス1および2はインターネットに向かって通信します。
それぞれSSH・SSM Session Managerを使用してアクセスしますが、どちらの方法を使用する場合もインターネット向けに通信ができるように設定する必要があります。
インスタンス1およびインスタンス2のために、以下のリソースを定義します。
Resources:
IGW:
Type: AWS::EC2::InternetGateway
IGWAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC1
InternetGatewayId: !Ref IGW
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref CidrIp1
VpcId: !Ref VPC1
AvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone1}"
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC1
RouteToInternet:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref IGW
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
Code language: YAML (yaml)
まずパブリックサブネットとインターネットゲートウェイを定義します。
そしてパブリックサブネット用のルートテーブルを用意し、同ゲートウェイ向けのデフォルトルートを作成します。
デフォルトルートはDestinationCidrBlockプロパティに「0.0.0.0/0」を指定することで作成できます。
これらのリソースを作成することによって、インスタンス1および2がインターネット向けに通信できるようになります。
インスタンス3:NATゲートウェイ向けのルーティング設定
NATゲートウェイを経由する場合もルーティングについて考慮する必要があります。
一般にNATゲートウェイの使用方法は、プライベートサブネット内に設置されているインスタンスがインターネットにアクセスできるようにするために使用します。
まさにインスタンス3のような構成ということです。
インスタンス3のために、以下のリソースを定義します。
Resources:
EIP:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
NATGateway:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt EIP.AllocationId
SubnetId: !Ref PublicSubnet
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref CidrIp2
VpcId: !Ref VPC1
AvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone1}"
PrivateSubnet1RouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC1
RouteToNATGateway:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateSubnet1RouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NATGateway
PrivateRoute1TableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet1
RouteTableId: !Ref PrivateSubnet1RouteTable
Code language: YAML (yaml)
ポイントは2つです。
1点目はNATゲートウェイはパブリックサブネットに配置します。
NATゲートウェイにはElastic IPを設定し、インターネットアクセス用のパブリックアドレスを固定化します。
2点目はプライベートサブネット1用のルートテーブルを作成し、このテーブルにNATゲートウェイ向けのルートを設定します。
このようにリソースを作成することによって、プライベートサブネット1内のインスタンス3からのSSM通信は、NATゲートウェイへルーティングされるようになります。
そして前項で確認した通り、パブリックサブネットにはインターネットゲートウェイ向けのルーティングが設定されています。
ですからSSM通信はインターネットに抜けて、最終的にSSMまで到達することができるようになります。
インスタンス4:SSM Session Managerを使用するためには、3つのVPCエンドポイントを作成する
前項ではプライベートサブネット内のインスタンスがSSM通信を行うために、NATゲートウェイを使用する方法を確認しました。
もう1つの方法はVPCエンドポイントを使用する方法です。
こちらの場合、インターネットを経由することなくSSM通信が可能です。
インスタンス4のためにプライベートサブネット2を定義します。
Resources:
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref CidrIp3
VpcId: !Ref VPC2
AvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone2}"
Code language: YAML (yaml)
ルーティングに関する設定は行いません。
インスタンス4は以下のVPCエンドポイントを経由してSSMにアクセスするため、インターネットゲートウェイ等を使用しないためです。
以下がVPCエンドポイントです。
Resources:
SSMEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref EndpointSecurityGroup
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
SubnetIds:
- !Ref PrivateSubnet
VpcEndpointType: Interface
VpcId: !Ref VPC2
EC2MessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref EndpointSecurityGroup
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
SubnetIds:
- !Ref PrivateSubnet
VpcEndpointType: Interface
VpcId: !Ref VPC2
SSMMessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref EndpointSecurityGroup
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
SubnetIds:
- !Ref PrivateSubnet
VpcEndpointType: Interface
VpcId: !Ref VPC2
Code language: YAML (yaml)
ポイントは4点です。
1点目はSSM Session Managerを使用するためには、3種類のVPCエンドポイントを作成する必要があります。
SSM Session Managerを使用してEC2インスタンスにアクセスするために必要なサービスは以下の3つです。
com.amazonaws.[region].ssm
Systems Manager を使用してインターネットアクセスなしでプライベート EC2 インスタンスを管理できるように、VPC エンドポイントを作成するにはどうすればよいですか?
com.amazonaws.[region].ec2messages
com.amazonaws.[region].ssmmessages
ServiceNameプロパティに各サービス名を指定します。
2点目はVPCエンドポイントのタイプです。
VpcEndpointTypeプロパティに「Interface」を指定して、インターフェースタイプを選択します。
インターフェイスエンドポイントは、サブネットの IP アドレス範囲のプライベート IP アドレスを持つ Elastic Network Interface です。サポートされている AWS のサービスまたは VPC エンドポイントサービスへのトラフィックのエントリポイントとして機能します。インターフェイスエンドポイントは を使用します AWS PrivateLink
VPC エンドポイント
VPCエンドポイントにはゲートウェイタイプも存在しますが、対象のサービスが限定されています。
ゲートウェイエンドポイントは、次のサポートされている AWS のサービスを対象としています。
Amazon S3
VPC エンドポイント
DynamoDB
3点目はセキュリティグループです。
SecurityGroupIdsプロパティに先述のVPCエンドポイント用のセキュリティグループを指定します。
これでインスタンス4からのHTTPS通信(443/tcp)を受け付けることができるようになります。
4点目はプライベートDNSです。
PrivateDnsEnabledプロパティに「true」を指定して、プライベートDNSを有効化します。
AWS のサービスおよび AWS Marketplace パートナーサービス用に作成されたエンドポイントに対しては、プライベート DNS がデフォルトで有効になります。
インターフェイス VPC エンドポイント ( AWS PrivateLink )
加えてVPC側でもプライベートDNS機能を有効化する必要があります。
以下の通りにVPCを設定します。
Resources:
VPC2:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VPCCidrBlock
EnableDnsHostnames: true
EnableDnsSupport: true
Code language: YAML (yaml)
VPCエンドポイントを設置する場合、VPCで2つのパラメータを設定する必要があります。
インターフェイス VPC エンドポイント ( AWS PrivateLink ) でプライベート DNS を使用する場合は、enableDnsHostnames 属性と enableDnsSupport 属性の両方を true に設定する必要があります。
VPC 内の DNS 属性
上記に従い、2プロパティに「true」を設定します。
EC2設定
EC2インスタンスの設定において、今回ポイントとなる点は4つです。
1つ目はセキュリティグループです。
これは前項で確認したため割愛します。
2つ目はアドレスです。
インターネット向けに通信させるためにインスタンスをパブリックサブネットに配置する場合、インスタンスにパブリックアドレスを設定する必要があります。
逆にプライベートサブネットに配置するインスタンスであれば、パブリックアドレスは不要です。
3つ目はIAMロールです。
SSM Session Managerを使用するためには、IAMロールを関連付けてインスタンスに複数のSSMアクションを許可する必要があります。
必要なアクションはAWS管理ポリシー(AmazonSSMManagedInstanceCore)という形でまとめられており、作成するIAMロールにこれをアタッチします。
4つ目はキーペアです。
SSHを使用する場合は、キーペアの設定が必要です。
キーペアには、プライベートキーと公開キーを含んでおり、 Amazon EC2 インスタンスへの接続時の身分証明に使用する、セキュリティ認証情報のセットを構成しています。
Amazon EC2 のキーペアと Linux インスタンス
以下が各インスタンスの設定をまとめた表です。
インスタンス | 方法 | 配置するサブネット | アドレス | IAMロールにアタッチするポリシー | キーペア |
インスタンス1 | SSH | パブリックサブネット | パブリックアドレス | – | 設定する |
インスタンス2 | SSM Session Manager | パブリックサブネット | パブリックアドレス | SSM用AWS管理ポリシー | – |
インスタンス3 | SSM Session Manager | プライベートサブネット1 | プライベートアドレス | SSM用AWS管理ポリシー | – |
インスタンス4 | SSM Session Manager | プライベートサブネット2 | プライベートアドレス | SSM用AWS管理ポリシー | – |
インスタンス1:パブリックアドレスを設定し、キーペアとセキュリティグループでSSHを許可する
Resources:
Instance1:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref InstanceSecurityGroup1
Code language: YAML (yaml)
インスタンス1はパブリックサブネットに配置してインターネット向けに通信します。
ですからパブリックアドレスが必要になりますが、AssociatePublicIpAddressプロパティに「true」を指定することで、同アドレスが設定されます。
インスタンス1用のセキュリティグループを使用します。
これはインターネットからのSSH(22/tcp)を許可するものです。
キーペアを設定します。
今回は「MyKeyPair」という名前のキーペアを作成しているものとして記載しています。
キーペアの作成に関しては以下のページをご確認ください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-keypairs.html
インスタンス2:パブリックアドレスを設定して、IAMロールでSession Managerを許可する
Resources:
Instance2:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref InstanceSecurityGroup2
InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: /
Roles:
- !Ref InstanceRole
InstanceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- ec2.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Code language: YAML (yaml)
インスタンス2もパブリックサブネットに配置してインターネット向けに通信するため、パブリックサブネットを設定します。
インスタンス2用のセキュリティグループでは、全インバウンド通信を許可していません。
IamInstanceProfileプロパティでIAMロールを関連づけます。
今回関連付けるIAMロールには、AWS管理ポリシーAmazonSSMManagedInstanceCoreをアタッチしています。
これをアタッチすることでSSM Session Managerを実行するために必要なアクションが許可されます。
なおSSM Session Managerを実行するためのもう1つの条件として、インスタンスにSSMエージェントがインストールする必要があります。
ただし今回使用しているAmazon Linux 2023のように、Amazon Linux 系のインスタンスでは、デフォルトで同エージェントがインストールされているため、追加の対応は不要です。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html
インスタンス3および4:パブリックアドレスは不要
Resources:
Instance3:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PrivateSubnet1
GroupSet:
- !Ref InstanceSecurityGroup2
Instance4:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PrivateSubnet2
GroupSet:
- !Ref InstanceSecurityGroup3
Code language: YAML (yaml)
2つのインスタンスは概ね共通しています。
どちらも先述のIAMロールを関連づけますし、どちらもプライベートサブネットに配置するため、パブリックアドレスは設定しません。
異なる点は設置するプライベートサブネットです。
インスタンス3はプライベートサブネット1に配置しますから、NATゲートウェイを経由してインターネット面からSSMと通信します。
対してインスタンス4はプライベートサブネット2に配置しますから、VPCエンドポイントを経由してSSMと通信します。
つまりSSMと通信する過程でインターネットを中継するかどうかが大きく異なります。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
AWS Management Consoleから各リソースを確認します。
セキュリティグループ
インスタンス1
全アドレスからのSSHを許可する設定です。
インスタンス2および3
インバウンド通信を許可していません。
SSM Session Managerを使用する上で、インバウンド通信が発生しないためです。
インスタンス4およびVPCエンドポイント
インスタンス4用セキュリティグループを見ると、やはりインバウンド通信を許可していません。
VPCエンドポイント用のセキュリティグループを見ると、送信元を先述のセキュリティグループとしてHTTPS(443/tcp)を許可しています。
ルーティング
パブリックサブネット
パブリックサブネットに紐づくルートテーブルを見ると、インターネットゲートウェイ向けにデフォルトルートが設定されていることがわかります。
つまりVPCで使用しているCIDR(10.0.0.0/16)以外のアドレス帯への通信はインターネットへルーティングされます。
このことからパブリックサブネットに配置されているインスタンス1および2、そしてNATゲートウェイはインターネット向けの通信が行うことができます。
プライベートサブネット1
同様にプライベートサブネット1のルートテーブルを見ると、NATゲートウェイ向けにデフォルトルートが設定されていることがわかります。
つまりVPC外のアドレス帯への通信はNATゲートウェイにルーティングされます。
先ほどのパブリックサブネットのルーティング設定と組み合わせることで、インスタンス3はインターネット向けに通信を行うことができます。
プライベートサブネット2
そしてプライベートサブネット2のルートテーブルを見ると、デフォルトルートが設定されていないことが分かります。
このサブネット内のEC2インスタンス4はVPCエンドポイント経由でSSMにアクセスするため、ルーティング設定が不要なためです。
VPCエンドポイント
3種類のVPCエンドポイントが作成されています。
サブネット情報を見ると、プライベートサブネット2のアドレスが付与されています。
ですからVPC2内のEC2インスタンス4は、同エンドポイントを経由してSSMにアクセスすることができるようになります。
EC2インスタンス
インスタンス1
パブリックアドレスとキーペアが設定されています。
これらの設定はインスタンス1にインターネット越しにSSHでアクセスするためです。
インスタンス2
パブリックアドレスが設定されているのに対して、キーペアは設定されていません。
これらはインススタンス2にインターネット越しにSSM Session Managerでアクセスするためです。
インスタンス3
パブリックアドレスが設定されていません。
インスタンス3はプライベートサブネット1に配置されており、NATゲートウェイを経由してSSMにアクセスするため、パブリックアドレスが不要だからです。
インスタンス4
こちらもパブリックアドレスが設定されていません。
インスタンス4はプライベートサブネット2に配置されており、VPCエンドポイントを経由してSSMにアクセスするため、パブリックアドレスが不要だからです。
動作確認
インスタンス1
インスタンス1へのアクセスはSSHを使用します。
$ ssh -i MyKeyPair.pem ec2-54-238-222-53.ap-northeast-1.compute.amazonaws.com
...
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
[ec2-user@ip-10-0-1-16 ~]$
Code language: Bash (bash)
キーペアを指定することで、インスタンス1にアクセスすることができました。
試しにパブリックアドレスを確認後、インターネット向けに通信を行います。
[ec2-user@ip-10-0-1-16 ~]$ ec2-metadata --public-ipv4
public-ipv4: 54.238.222.53
[ec2-user@ip-10-0-1-16 ~]$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=112 time=1.24 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=112 time=1.22 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=112 time=1.21 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=112 time=1.19 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.194/1.214/1.239/0.016 ms
Code language: Bash (bash)
パブリックアドレスが付与されており、インターネットへのアクセスも確認できました。
このようにSSHを使用する場合は、セキュリティグループでSSHを許可した上で、パブリックアドレスの付与やルーティング設定、加えてキーペアの設定・管理を行う必要があります。
インスタンス2
インスタンス2へのアクセスはSSM Session Managerを使用します。
$ aws ssm start-session --target i-0456a149fdc9a185a
...
sh-5.2$
Code language: Bash (bash)
確かにインスタンス2へアクセスすることができました。
試しにパブリックアドレスを確認後、インターネット向けに通信を行います。
sh-5.2$ ec2-metadata --public-ipv4
public-ipv4: 54.250.118.93
sh-5.2$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=2.02 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=2.04 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=2.04 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=2.05 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 2.022/2.038/2.049/0.010 ms
Code language: Bash (bash)
パブリックアドレスが付与されており、インターネットへのアクセスも確認できました。
インスタンス2のようにパブリックサブネットに配置されているインスタンスの場合は、SSM Session Managerを使用するために、セキュリティグループで特定のインバウンド通信を許可する必要はありませんが、パブリックアドレスの付与やルーティング設定が必要になります。
インスタンス3
インスタンス3へのアクセスはSSM Session Managerを使用します。
$ aws ssm start-session --target i-07764dec3ebaa7723
...
sh-5.2$
Code language: Bash (bash)
確かにインスタンス3へアクセスすることができました。
試しにパブリックアドレスを確認後、インターネット向けに通信を行います。
sh-5.2$ ec2-metadata --public-ipv4
public-ipv4: not available
sh-5.2$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=113 time=2.70 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=113 time=2.18 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=113 time=2.17 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=113 time=2.16 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 2.161/2.302/2.702/0.231 ms
Code language: Bash (bash)
パブリックアドレスは付与されていませんが、インターネットへのアクセスも確認できました。
これはNATゲートウェイを経由してインターネットにアクセスしているためです。
インスタンス3のようにプライベートサブネットに配置されているインスタンスの場合は、SSM Session Managerを使用するために、パブリックサブネットにNATゲートウェイを配置し、適切にルーティング設定をすることによって、セキュリティグループによる特定のインバウンド通信の許可や、パブリックアドレスの付与が不要となります。
インスタンス4
インスタンス4へのアクセスはSSM Session Managerを使用します。
$ aws ssm start-session --target i-048d60ca236073a63
...
sh-5.2$
Code language: Bash (bash)
確かにインスタンス4へアクセスすることができました。
試しにパブリックアドレスを確認後、インターネット向けに通信を行います。
sh-5.2$ ec2-metadata --public-ipv4
public-ipv4: not available
sh-5.2$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 7280ms
Code language: Bash (bash)
パブリックアドレスは付与されておらず、インターネットへのアクセスも不可でした。
これはインスタンス4がVPCエンドポイント経由でSSMにアクセスしており、インターネットへのアクセスする経路がないためです。
インスタンス4のようにプライベートサブネットに配置されているインスタンスの場合は、SSM Session Managerを使用するために、VPCエンドポイントを設定することによって、セキュリティグループによる特定のインバウンド通信の許可や、パブリックアドレスの付与が不要となります。
まとめ
今回はSSM Session Managerを使用してEC2インスタンスにアクセスする3パターンをご紹介しました。
- インターネット経由でSSM Session Managerを使用してアクセス
- NATゲートウェイ経由でSSM Session Managerを使用してアクセス
- VPCエンドポイント経由でSSM Session Managerを使用してアクセス
SSM Session ManagerとSSHを比較すると、ポート解放やキーペア設定が不要となります。
SSM Session Managerを使用することで、インスタンスに不正にアクセスされるリスクを低減することができますし、インスタンスの管理工数の軽減にも繋がるでしょう。