はじめに
こんばんは。今日はRHEL9にssmエージェントをインストールして、AMIを取得した後、そのAMIでEC2インスタンスを起動させてセッションマネージャーで接続するということをやってみたいと思います。
背景
RHEL9にssm-agentがプリインストールされていない…
[ec2-user@ip-10-0-0-72 ~]$ sudo systemctl status amazon-ssm-agent
Unit amazon-ssm-agent.service could not be found.
上記コマンドの結果の通り、RHEL9や8ではssm-agentがプリインストールされていません。
セッションマネージャで接続したい場合、ssm-agentのインストールは必須のため困ります。
そこで今回の記事というわけです。
構成
ネットワークは下記に示すと通りとなっており、パブリックサブネットのリソースはInternet-gatewayを経由して直接インターネットにアクセス可能です。
プライベートサブネットのリソースについては、アウトバウンド通信に限ってNat-gatewayを経由してインターネットにアクセスできるようになっています。
※ 今回のネットワーク構成は以前のブログでCloudFormationを使って作成したものです。
CloudFormationのcodeもブログに載せており、NATゲートウェイまでコード化済みですので、もしネットワークを構築するのが面倒であればお使いいただけます。
https://cloud5.jp/get-started-with-cloudformation/
作業の流れ
パブリックサブネットにRHEL9のEC2インスタンスを起動し、sshで接続したうえでssm-agentをインストールしたら、AMIを取得します。取得したAMIでプライベートサブネットにEC2インスタンスを起動させたらセッションマネージャで接続します。
セッションマネージャでは、インターネットを介さず接続する場合VPCエンドポイントを作成する必要がありますが、インターネットを経由してもよい場合は、今回のようにNatgatewayを使ってアウトバウンド通信を可能とする構成でも実現可能です。
前提条件
今回ssm-agentをインストールするコマンドを利用するうえでの前提条件は以下となります。
- x86_64
- RHEL 8.x and 9.x
前置きが長くなりました。
では以下から作業を開始しましょう。
作業
SSM-agentのインストール
まず、パブリックサブネットに起動させたEC2インスタンスにsshでアクセスします。
アクセス出来たら以下コマンドを順に実行します。
※ 以下1と2の手順ではIMDSを利用してメタデータ(region)を取得していますが、マネジメントコンソールなどから確認して変数部分に直接リージョン情報を記載しても問題ありません。もし、IMDSでのメタデータ取得方法に興味がある方は以下の記事を参考にしていただけると幸いです。
https://cloud5.jp/get-imdsv2/
-
リージョン情報取得のためのトークンを取得します。
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s)
-
リージョン情報を取得します。
REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/region)
-
ssm-agentをインストールします。
sudo dnf install -y https://s3.${REGION}.amazonaws.com/amazon-ssm-${REGION}/latest/linux_amd64/amazon-ssm-agent.rpm
ssm-agentの有効化
※ インストール直後にsytemctl statusを見るとpreset: disabledですがなぜか最初からenbaledになっており、かつactive(running)でした。が、以下念のため実行して確認します。
sudo systemctl status amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl is-enabled amazon-ssm-agent
sudo systemctl restart amazon-ssm-agent
sudo systemctl status amazon-ssm-agent
AMIの作成
インストールができたら次はAMIの作成です。
AMIを作成したら今度から使いまわしができて、今回のようにいちいちssm-agentをインストールする手間が省けて便利になりますね。
-
EC2のナビゲーションペインからインスタンスのページを開き、インスタンスを選択したら[アクション] -> [イメージとテンプレート] -> [イメージを作成] をクリックします。
-
[イメージ名]と[イメージの説明]に適当な内容を入力します。
今回、そのほかはすべてデフォルトの設定のままにしますので、そのまま[イメージを作成]をクリックします。
※ 作成が完了するまで2-3分程がかかりました。
IAMロールの作成
作成したAMIを使ってEC2インスタンスをプライベートサブネットに起動させる前に、セッションマネージャで接続するのに必要なEC2インスタンスに関連付けるIAMロールをつくっておきます。
-
IAMのナビゲーションペインからロールのページを開き、[ロールを作成]をクリックします。
-
信頼されたエンティティで[AWS のサービス]を選択し、ユースケースのサービスまたはユースケースで[EC2]を選び、表示される選択肢の中から[EC2 Role for AWS Systems Manager]を選択して画面下部(キャプチャには映っていませんが)の[次へ]をクリックします。
-
デフォルトでAmazonSSMManagedInstanceCoreというポリシーがロールに追加されています。
SSMにはこのポリシーが必要ですのでこのまま[次へ]をクリックします。
-
ロール名を入力して画面下部の[ロールを作成]をクリックするとロール作成完了です。
あとでEC2に関連付けるためにロール名はコピーして控えておきます。
VPCのDNSを有効化
- [DNSホスト名]と[DNS解決]がともに有効になっていることを確認します。こちらの設定もロールと同じく必須です。
※ VPCのナビゲーションペインから[お使いのVPC]のページを開き、利用するVPCを選択して詳細タブから確認できます。
作成したAMIからEC2を起動
-
EC2のナビゲーションペインからAMIのページを開き、左上のプルタブから[プライベートイメージ]を選び、AMIの名前で検索して対象のAMIを選択します。右上の[AMIからインスタンスを起動]をクリックします。
-
要件に合わせてEC2の設定をしていきます。今回はプライベートサブネットで起動させてみます(画像は省略)。
ssmで接続するために高度な詳細から作成したIAMロール関連付けます。
-
セッションマネージャで接続してみます。
-
無事接続することができました。
-
ちなみにEC2のセキュリティグループのインバウンドルールをなくした状態でも接続できました。
これでsshのポートを開けずに接続することができますね!!
おわりに
いかがだったでしょうか。
今回はRHEL9にssm-agentをインストールするところからセッションマネージャで接続確認するまでを行ってみました。
今回の構成の場合にセッションマネージャで接続するための要件をまとめると以下の通りです。
- リソースがNatgatewayを経由してインターネットとアウトバウンド通信が可能
- ssm-gentがインストールされている
- EC2のIAMロールにAmazonSSMManagedInstanceCoreポリシーが追加されている
- VPC設定でDNSホスト名とDNS解決の両方が有効である
先述した通り、インターネットとの通信を行わずにセッションマネージャで接続する場合は、Natgatewayを経由するのではなく、VPCエンドポイントを作成する必要があります。
この点についてはまた別の機会に取り上げたいと思います。
ではまたお会いしましょう!
あでゅー!!
参考
https://blog.serverworks.co.jp/install-ssm-agent-in-user-data
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/agent-install-rhel-8-9.html
https://dev.classmethod.jp/articles/tsnote-private-ec2-ssm-vpc-endpoint/
https://repost.aws/ja/knowledge-center/ec2-systems-manager-vpc-endpoints
https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-permissions.html
https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html