EC2 Instance Connectのアップデートを受けて、EC2インスタンスへのログイン方法を整理してみる

記事タイトルとURLをコピーする

3月よりIE課(インターナルエデュケーション課) に異動しました山﨑です。

6月13日のAWSアップデートでPublic IPを利用することなく、EC2 Instance Connect を用いてSSH/RDP接続ができるようになったというアップデートがありました。

そこで今回はEC2インスタンス(Linux)へのログイン方法について整理してみたいと思います。

aws.amazon.com

サマリー

ログイン方法の比較表

主観も多少混じっていますが、各ログイン方法について比較表を作ってみましたのでご参考までにご覧ください。

ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合

EC2インスタンスがインターネットと通信可能な環境に配置されている場合は、「SSM経由」のアクセス方法がコスト面やメンテナンスを考慮すると良さそうです。

項目 踏み台サーバー経由 SSM経由 EC2 Instance Connect経由(using Public IP)
構築負荷 EC2インスタンスの構築 ・SSMエージェントのインストール
※Pre-installされているAMIあり
・Instance Profile の作成とアタッチ
・IAMユーザーへ権限を付与
・EC2 Instance Connect エージェントのインストール
※Pre-installされているAMIあり
※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降
・IAMユーザーへ権限を付与
・EC2インスタンスにPublic IPを付与
メンテナンス ・パッチ適用
・サーバーのセキュリティ対策等の運用が必要
・SSMエージェントのアップデート
・SSMエージェントの死活監視等の運用が必要
・EC2 Instance Connect エージェントのアップデート
・EC2 Instance Connect エージェントの死活監視等の運用が必要
ログ記録 ・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
・CloudTrail によるログ記録
・セッションアクティビティのログ記録
・CloudTrail によるログ記録
・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
コスト t3.micro: $0.0136/hr
t3.small: $0.0272/hr
t4g.micro: $0.0108/hr
t4g.small: $0.0216/hr
不要 不要
アクセス制御 ・Security Group
・キーペア
IAM ・Security Group
・IAM

ログイン対象のEC2インスタンスがプライベート環境に配置されている場合

EC2インスタンスがプライベート環境に配置されている且つOSがAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降であれば、「EC2 Instance Connect経由(without Public IP)」のアクセス方法がコスト面を考慮すると良さそうです。

項目 踏み台サーバー経由 SSM経由 EC2 Instance Connect経由(without Public IP)
構築負荷 EC2インスタンスの構築 ・SSMエージェントのインストール
※Pre-installされているAMIあり
・Instance Profile の作成とアタッチ
・VPC Endpoint の構築(×3)
com.amazonaws.region.ssm
com.amazonaws.region.ec2messages
com.amazonaws.region.ssmmessages
・EC2 Instance Connect エージェントのインストール
※Pre-installされているAMIあり
サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降
・IAMユーザーへ権限を付与
・VPC Endpoint の構築
EC2 Instance Connect Endpoint
メンテナンス ・パッチ適用
・サーバーのセキュリティ対策等の運用が必要
・SSMエージェントのアップデート
・SSMエージェントの死活監視等の運用が必要
特に不要
ログ記録 ・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
・CloudTrail によるログ記録
・セッションアクティビティのログ記録
・CloudTrail によるログ記録
・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
※VPC Endpointが必要
コスト t3.micro: $0.0136/hr
t3.small: $0.0272/hr
t4g.micro: $0.0108/hr
t4g.small: $0.0216/hr
($0.014/hr + $0.01/GB) × 3 $0.014/hr + $0.01/GB
アクセス制御 ・Security Group
・キーペア
IAM ・Security Group
・IAM

EC2インスタンスへのログイン方法

①踏み台サーバーを利用する方法

項目 踏み台サーバー経由(in Public) 踏み台サーバー経由(in Private)
構築負荷 EC2インスタンスの構築 EC2インスタンスの構築
メンテナンス ・パッチ適用
・サーバーのセキュリティ対策等の運用が必要
・パッチ適用
・サーバーのセキュリティ対策等の運用が必要
ログ記録 ・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
コスト t3.micro: $0.0136/hr
t3.small: $0.0272/hr
t4g.micro: $0.0108/hr
t4g.small: $0.0216/hr
t3.micro: $0.0136/hr
t3.small: $0.0272/hr
t4g.micro: $0.0108/hr
t4g.small: $0.0216/hr
アクセス制御 ・Security Group
・キーペア
・Security Group
・キーペア

踏み台サーバーを利用する場合、ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されていても、そうでなくても構成は特に変わりませんが、踏み台サーバーを利用する方法は、コストとメンテナンスの観点からあまりお勧めできないかなと思います。この方法を採用する場合は未使用時にインスタンスを停止して、余計なコストがかからないように自動化しておくことをお勧めします。

②SSM Session Manager を利用する方法

ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合

ログイン対象のEC2インスタンスがプライベート環境に配置されている場合

構成比較

項目 SSM経由(in Public) SSM経由(in Private)
構築負荷 ・SSMエージェントのインストール
※Pre-installされているAMIあり
・Instance Profile の作成とアタッチ
・IAMユーザーへ権限を付与
・SSMエージェントのインストール
※Pre-installされているAMIあり
・Instance Profile の作成とアタッチ
・IAMユーザーへ権限を付与
・VPC Endpoint の構築(×3)
com.amazonaws.region.ssm
com.amazonaws.region.ec2messages
com.amazonaws.region.ssmmessages
メンテナンス ・SSMエージェントのアップデート
・SSMエージェントの死活監視等の運用が必要
・SSMエージェントのアップデート
・SSMエージェントの死活監視等の運用が必要
ログ記録 ・CloudTrail によるログ記録
・セッションアクティビティのログ記録
・CloudTrail によるログ記録
・セッションアクティビティのログ記録
コスト 不要 ($0.014/hr + $0.01/GB) × 3
アクセス制御 IAM IAM

SSM経由(in Public)はコストメリットが大きいです。ただし、セッションアクティビティのログ記録を有効化する場合は別途、S3バケットを作成したりする手間とコストがかかる点は留意しておきましょう。

SSM経由(in Private)はVPC Endpoint を3つ作成しないいけないためコストが余計にかかってしまいます。セッションアクティビティのログ記録を有効化すると追加コストもかかります。

IAM を用いたアクセス制御

SSM Session Manager を利用する場合はIAMアイデンティ(IAMユーザー/IAMグループ/IAMロール)に対して以下のようなIAMポリシーをアタッチすることで、アクセス制御をすることができます。

参考ドキュメント:Quickstart default IAM policies for Session Manager - AWS Systems Manager

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:ResumeSession",
                "ssm:DescribeSessions",
                "ssm:TerminateSession",
                "ssm:StartSession",
                "ssm-guiconnect:CancelConnection",
                "ssm-guiconnect:GetConnection",
                "ssm-guiconnect:StartConnection"
            ],
            "Resource": [
                "arn:aws:ec2:region:account-id:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/DivisionCode": [
                        "IT-System"
                    ]
                }
            }
        }
    ]
}
  • DivisionCode: IT-System タグが付与されたEC2インスタンス対してセッションの開始/中断/切断を許可する

③EC2 Instance Connect を利用する方法

ログイン対象のEC2インスタンスがインターネットと通信可能な環境に配置されている場合

ログイン対象のEC2インスタンスがプライベート環境に配置されている場合

構成比較

項目 EC2 Instance Connect経由
(in Public)
EC2 Instance Connect経由
(in Private)
構築負荷 ・EC2 Instance Connect エージェントのインストール
※Pre-installされているAMIあり
※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降
・IAMユーザーへ権限を付与
・EC2インスタンスにPublic IPを付与
・EC2 Instance Connect エージェントのインストール
※Pre-installされているAMIあり
※サポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降
・IAMユーザーへ権限を付与
・VPC Endpoint の構築
EC2 Instance Connect Endpoint
メンテナンス ・EC2 Instance Connect エージェントのアップデート
・EC2 Instance Connect エージェントの死活監視等の運用が必要
・EC2 Instance Connect エージェントのアップデート
・EC2 Instance Connect エージェントの死活監視等の運用が必要
ログ記録 ・CloudTrail によるログ記録
・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
・CloudTrail によるログ記録
・EC2インスタンス内でログを記録
・CloudWatch Logs にログを記録
※VPC Endpointが必要
コスト 不要 $0.014/hr + $0.01/GB
アクセス制御 ・Security Group
・IAM
・Security Group
・IAM

EC2 Instance Connect経由(in Public)だとPublic IPをEC2インスタンスに付与する必要があるので、それであればキーペアを使って通常通りSSHアクセスすれば良いのではないかと思いました。

EC2 Instance Connect経由(in Private)はSSM Session Manager とは異なり、VPC Endpoint を1つ作成すればVPC Endpoint経由でプライベートアクセスが可能なのでコストメリットが大きいです。しかし、注意点としてはLinux OS の場合はEC2 Instance Connect エージェントのサポートOSはAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降ということです。

参考ドキュメント:Install EC2 Instance Connect on your EC2 instances - Amazon Elastic Compute Cloud

実際にRHELでエージェントをインストールしようとするとレポジトリにマッチするソフトウェアがないためエラーが出ました。

[ec2-user@ip-xx-xx-xx ~]$ sudo yum install ec2-instance-connect
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)           49 MB/s |  22 MB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)              50 MB/s |  12 MB     00:00
Red Hat Enterprise Linux 9 Client Configuration                              36 kB/s | 3.0 kB     00:00
No match for argument: ec2-instance-connect
Error: Unable to find a match: ec2-instance-connect

Security Group を用いたアクセス制御

EC2 Instance Connect(in Private)では、VPC Endpointで「Preserve Client IP」というクライアント端末のIPを保持する機能を有効化し、VPC Endpointに対してSecurity GroupのInboundルールを設定することで、アクセス元のIPアドレス制限を設けることができます。

また、Security GroupのOutboundルールを設定することで、アクセス先のEC2インスタンスを制御することができます。

Security Group を用いたアクセス制御

Security groups for EC2 Instance Connect Endpoint - Amazon Elastic Compute Cloud

IAM を用いたアクセス制御

EC2 Instance Connect(in Private)では、VPC Endpointで「Preserve Client IP」というクライアント端末のIPを保持する機能を有効化し、IAMポリシーのCondition句を用いれば、IPアドレス単位でアクセス制御が可能です。

{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Resource": "arn:aws:ec2:region:account-id:instance-connect-endpoint/eice-123456789abcdef",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                },
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                }
            }
        }
    ]
}

docs.aws.amazon.com

まとめ

ざっと整理してみましたが、結論としては

  • EC2インスタンスがインターネットと通信可能な環境に配置されている場合は、「SSM経由」のアクセス方法がコスト面やメンテナンスを考慮すると良さそう
  • EC2インスタンスがプライベート環境に配置されている且つOSがAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降であれば、「EC2 Instance Connect経由(without Public IP)」のアクセス方法がコスト面を考慮すると良さそうです。

山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ

2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors