[アップデート] Amazon EC2 Instance ConnectがRHELやCentOS StreamなどのOSをサポートしました

プライベートサブネットのEC2インスタンスにできるだけコストをかけずに接続したい場合に
2023.12.07

RHELのEC2インスタンスにEC2 Instance Connectで接続したい

こんにちは、のんピ(@non____97)です。

皆さんはRHELのEC2インスタンスにEC2 Instance Connectで接続したいと思ったことはありますか? 私はあります。

EC2 Instance Connectを用いることで、パスワードや鍵を用意しなくとも簡単にアクセスすることが可能です。

ただし、EC2 Instance Connectで接続できるOSはAmazon LinuxとUbuntuと限られたOSのみでした。

今回、アップデートによりEC2 Instance ConnectがRHELやCentOS Stream、macOSをサポートするようになりました。

実際に触ってみたので紹介します。

いきなりまとめ

  • 以下OSが新たにEC2 Instance Connectをサポート
    • CentOS Stream 8, 9
    • macOS Sonoma, Ventura, and Monterey
    • Red Hat Enterprise Linux (RHEL) 8, 9
  • ただし、上述のOSのAMIにはEC2 Instance Connectで接続するための設定は組み込まれていない
  • AMIにプリインストールされているOSは以下のとおり
    • Amazon Linux 2023
    • Amazon Linux 2 2.0.20190618 or later
    • Ubuntu 20.04 or later
  • EC2 Instance Connectで接続するために、EC2 Instance Connect用のパッケージをインストールする必要がある
  • RHEL、CentOS Streamでインストールするパッケージは us-west-2 のS3バケットでのみ公開されている
    • us-west-2 以外のリージョンではS3のGateway型VPC Endpoint経由では取得できないので注意

対応OSの確認

AWS公式ドキュメントを確認して、具体的にどのOSをサポートしているのか確認します。

Launch the instance with one of the following supported AMIs:

Amazon Linux 2 prior to version 2.0.20190618
CentOS Stream 8 or 9
macOS Sonoma, Ventura, and Monterey
Red Hat Enterprise Linux (RHEL) 8 or 9
Ubuntu 16.04 and 18.04

If your instance was launched with a later version of Amazon Linux 2 or Ubuntu, it comes preinstalled with EC2 Instance Connect and you can skip this procedure.

Install EC2 Instance Connect on your EC2 instances - Amazon Elastic Compute Cloud

以下OSが新規でサポートされていそうです

  • CentOS Stream 8, 9
  • macOS Sonoma, Ventura, and Monterey
  • Red Hat Enterprise Linux (RHEL) 8, 9

また、先述のAWS公式ドキュメントに記載のとおり、追加サポートされたOSのAMIにはEC2 Instance Connectの設定はプリインストールされていないようです。

やってみた

RHELにEC2 Instance Connectの設定を行う

実際に試してみます。

まず、OSに対してEC2 Instance Connectの設定を行います。以下AWS公式ドキュメントにOS毎の設定手順があるので、そちらを参考に行います。

今回はRHEL 9.2のEC2インスタンスで試します。

  • AMI名 : RHEL-9.2.0_HVM-20230503-x86_64-41-Hourly2-GP2
  • AMI ID : ami-026ebd4cfe2c043b2

EC2 Instance Connectのパッケージをダウンロードします。

$ mkdir /tmp/ec2-instance-connect

$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect.rpm \
  -o /tmp/ec2-instance-connect/ec2-instance-connect.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3883k  100 3883k    0     0  3766k      0  0:00:01  0:00:01 --:--:-- 3766k

$ curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux.noarch.rpm \
  -o /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6040  100  6040    0     0  18875      0 --:--:-- --:--:-- --:--:-- 18875

コマンドから分かるように、S3バケット上に置かれているようです。

us-west-2以外のリージョンのS3バケットもあるかと思い確認してみましたが、us-west-2以外はなさそうです。

$ curl https://amazon-ec2-instance-connect-us-east-1.s3.us-east-1.amazonaws.com/latest/linux_amd64/ec2-instance-connect.rpm -I
HTTP/1.1 404 Not Found
x-amz-request-id: 1VR9227VKTDWB6SB
x-amz-id-2: drWILVG7Gonq/MjySFaNmG0HKpZGoG3wg93Z7FnDMNIMkE3GjNCdvWD+goDaDu8/hFeHhyVSxkc=
Content-Type: application/xml
Date: Thu, 07 Dec 2023 04:50:58 GMT
Server: AmazonS3

プライベートサブネット上のEC2インスタンスからダウンロードしたい場合、us-west-2 以外のリージョンではS3のGateway型VPC Endpoint経由では取得できないので注意が必要ですね。

ダウンロードしたRPMパッケージをインストールします。

$ sudo yum install -y \
  /tmp/ec2-instance-connect/ec2-instance-connect.rpm \
  /tmp/ec2-instance-connect/ec2-instance-connect-selinux.rpm
Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)                                           41 kB/s | 4.5 kB     00:00
Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)                                           28 MB/s |  27 MB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)                                              85 kB/s | 4.1 kB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)                                              40 MB/s |  15 MB     00:00
Red Hat Enterprise Linux 9 Client Configuration                                                              43 kB/s | 2.0 kB     00:00
Dependencies resolved.
============================================================================================================================================
 Package                                       Architecture            Version                          Repository                     Size
============================================================================================================================================
Installing:
 ec2-instance-connect                          x86_64                  2.0.0-1.rhel9                    @commandline                  3.8 M
 ec2-instance-connect-selinux                  noarch                  2.0.0-1                          @commandline                  5.9 k

Transaction Summary
============================================================================================================================================
Install  2 Packages

Total size: 3.8 M
Installed size: 7.6 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                    1/1
  Running scriptlet: ec2-instance-connect-selinux-2.0.0-1.noarch                                                                        1/2
  Installing       : ec2-instance-connect-selinux-2.0.0-1.noarch                                                                        1/2
  Running scriptlet: ec2-instance-connect-selinux-2.0.0-1.noarch                                                                        1/2
  Running scriptlet: ec2-instance-connect-2.0.0-1.rhel9.x86_64                                                                          2/2
  Installing       : ec2-instance-connect-2.0.0-1.rhel9.x86_64                                                                          2/2
  Running scriptlet: ec2-instance-connect-2.0.0-1.rhel9.x86_64                                                                          2/2
  Running scriptlet: ec2-instance-connect-selinux-2.0.0-1.noarch                                                                        2/2
skipping the directory /sys
skipping the directory /proc
skipping the directory /mnt
skipping the directory /var/tmp
skipping the directory /home
skipping the directory /root
skipping the directory /tmp

  Verifying        : ec2-instance-connect-2.0.0-1.rhel9.x86_64                                                                          1/2
  Verifying        : ec2-instance-connect-selinux-2.0.0-1.noarch                                                                        2/2
Installed products updated.

Installed:
  ec2-instance-connect-2.0.0-1.rhel9.x86_64                           ec2-instance-connect-selinux-2.0.0-1.noarch

Complete!

インストール後、eic_run_authorized_keysというバイナリファイルがあることと、AuthorizedKeysCommandで公開鍵を探索するようになっていることを確認します。

$ ls -l /opt/aws/bin/
total 7756
-rwxr-xr-x. 1 root root 7941486 Dec  5 20:36 eic_run_authorized_keys

$ sudo cat /etc/ssh/sshd_config.d/60-ec2-instance-connect.conf
AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
AuthorizedKeysCommandUser ec2-instance-connect

動作確認

動作確認です。

マネジメントコンソールからEC2 Instance Connect Endpointを介して接続してみます。

EC2 Instance Connect Endpoint経由で接続

問題なく接続できました。

接続できたことを確認

プロセスツリーを確認してみると、内部でSSHを使っていることがよく分かります。

$ pstree -ulpc
systemd(1)─┬─NetworkManager(643)─┬─{NetworkManager}(644)
           │                     └─{NetworkManager}(645)
           ├─agetty(959)
           ├─agetty(960)
           ├─amazon-ssm-agen(1819)─┬─ssm-agent-worke(1929)─┬─ssm-session-wor(1990)─┬─sh(2004,ec2-user)───bash(2005)
           │                       │                       │                       ├─{ssm-session-wor}(1991)
           │                       │                       │                       ├─{ssm-session-wor}(1992)
           │                       │                       │                       ├─{ssm-session-wor}(1993)
           │                       │                       │                       ├─{ssm-session-wor}(1994)
           │                       │                       │                       ├─{ssm-session-wor}(1995)
           │                       │                       │                       ├─{ssm-session-wor}(1996)
           │                       │                       │                       ├─{ssm-session-wor}(1997)
           │                       │                       │                       ├─{ssm-session-wor}(1998)
           │                       │                       │                       └─{ssm-session-wor}(1999)
           │                       │                       ├─ssm-session-wor(2548)─┬─sh(2561,ec2-user)───bash(2562)
           │                       │                       │                       ├─{ssm-session-wor}(2550)
           │                       │                       │                       ├─{ssm-session-wor}(2551)
           │                       │                       │                       ├─{ssm-session-wor}(2552)
           │                       │                       │                       ├─{ssm-session-wor}(2553)
           │                       │                       │                       ├─{ssm-session-wor}(2554)
           │                       │                       │                       ├─{ssm-session-wor}(2555)
           │                       │                       │                       ├─{ssm-session-wor}(2556)
           │                       │                       │                       └─{ssm-session-wor}(2582)
           │                       │                       ├─{ssm-agent-worke}(1930)
           │                       │                       ├─{ssm-agent-worke}(1931)
           │                       │                       ├─{ssm-agent-worke}(1932)
           │                       │                       ├─{ssm-agent-worke}(1933)
           │                       │                       ├─{ssm-agent-worke}(1934)
           │                       │                       ├─{ssm-agent-worke}(1935)
           │                       │                       ├─{ssm-agent-worke}(1961)
           │                       │                       ├─{ssm-agent-worke}(1964)
           │                       │                       ├─{ssm-agent-worke}(1965)
           │                       │                       ├─{ssm-agent-worke}(1966)
           │                       │                       ├─{ssm-agent-worke}(1967)
           │                       │                       ├─{ssm-agent-worke}(2549)
           │                       │                       └─{ssm-agent-worke}(2612)
           │                       ├─{amazon-ssm-agen}(1820)
           │                       ├─{amazon-ssm-agen}(1821)
           │                       ├─{amazon-ssm-agen}(1822)
           │                       ├─{amazon-ssm-agen}(1823)
           │                       ├─{amazon-ssm-agen}(1825)
           │                       ├─{amazon-ssm-agen}(1826)
           │                       ├─{amazon-ssm-agen}(1927)
           │                       └─{amazon-ssm-agen}(2583)
           ├─auditd(574)───{auditd}(575)
           ├─chronyd(618,chrony)
           ├─crond(958)
           ├─dbus-broker-lau(600,dbus)───dbus-broker(606)
           ├─gssproxy(657)─┬─{gssproxy}(659)
           │               ├─{gssproxy}(660)
           │               ├─{gssproxy}(661)
           │               ├─{gssproxy}(662)
           │               └─{gssproxy}(663)
           ├─irqbalance(609)───{irqbalance}(612)
           ├─polkitd(898,polkitd)─┬─{polkitd}(911)
           │                      ├─{polkitd}(912)
           │                      ├─{polkitd}(913)
           │                      ├─{polkitd}(914)
           │                      └─{polkitd}(917)
           ├─rhsmcertd(651)───{rhsmcertd}(653)
           ├─rpcbind(571,rpc)
           ├─rsyslogd(610)─┬─{rsyslogd}(615)
           │               └─{rsyslogd}(616)
           ├─sshd(2107)───sshd(2628)───sshd(2652,ec2-user)───bash(2653)───pstree(2700)
           ├─systemd(2642,ec2-user)───(sd-pam)(2644)
           ├─systemd-journal(500)
           ├─systemd-logind(611)
           ├─systemd-udevd(513)
           └─tuned(652)─┬─{tuned}(899)
                        ├─{tuned}(903)
                        └─{tuned}(905)

プライベートサブネットのEC2インスタンスにできるだけコストをかけずに接続したい場合に

Amazon EC2 Instance ConnectがRHELやCentOS StreamなどのOSをサポートしたアップデートを紹介しました。

NAT Gateway経由でインターネットに出ることを許容できない環境において、プライベートサブネットのEC2インスタンスにできるだけコストをかけずに接続したい場合に役立ちそうですね。

ただし、追加サポートされたOSにEC2 Instance Connectに接続する際は、いずれもパッケージのインストールが必要なのがネックです。

RHELとCentOS Streamについては個別のRPMパッケージが配布されているため対応は楽そうです。

RPMパッケージを自アカウントのS3バケットに配置しておいて、ユーザーデータでS3バケット上のRPMパッケージのダウンロード→設定といった形もできるのではないでしょうか。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!