はじめに
AWS Session Managerを利用するには、EC2インスタンスへSSMエージェントを導入する必要があります。
Amazon Linux 2では初めからAMIにSSMエージェントが導入されていますが、
Red Hat Enterprise Linux等の他のLinux AMIを使用する場合は、
自前でSSMエージェントのインストール作業が必要になります。
Linux EC2インスタンスへSSMエージェント自動的にインストールし、
インスタンス起動後すぐにセッションマネージャーを使用可能にするコードを書いていた時に、
軽くハマった内容と解決方法をご紹介します。
やりたいこと
インターネット接続を禁止しているサブネットで起動するLinux EC2インスタンスへ
AWS所有のS3バケットからSSMエージェントを自動的にインストールしたい。
前提条件
- 東京リージョンを使用
- EC2インスタンスのAMIはRed Hat Enterprise Linuxを使用
- EC2からS3、SSMエンドポイントへの通信はInternet Gatewayではなく、VPC Endpointを使用
- EC2にはAWS 所有のS3バケットへのアクセス許可 を含むインスタンスプロファイルをアタッチ
- EC2にはAWS 管理ポリシー AmazonSSMManagedInstanceCore を含むインスタンスプロファイルをアタッチ
試したこと
AWSのドキュメントやナレッジセンターにて、
「Red Hat Enterprise LinuxインスタンスにSSMエージェントを手動でインストールする方法」や
「Linuxインスタンス起動時にSSMエージェントを自動インストールする方法」が紹介されています。
まずはEC2起動時にSSMエージェントをAWS所有のS3バケットからダウンロード・インストールするように
ユーザーデータでこちらの記事のコマンドを実行させてみました。
#!/bin/bash
cd /tmp
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
ハマりポイント
さきほどのコマンドをそのまま実行すると
インターネットへ接続できるEC2ではインストールに成功します。
しかし、インターネット接続を禁止しているEC2では
AWS所有のS3バケットからのRPMパッケージダウンロードに失敗してしまいました。
ちなみに、サブネットからS3 VPC Endpointへの疎通はこちらの方法で確認できます。
なぜダウンロードに失敗するのか
結論から言うと、S3 VPC Endpointを設置しているにもかかわらず、
S3へのアクセス時にS3 VPC Endpointを経由しておらずエラーになっていました。
原因はアクセスするS3のURLに、リージョンを含んでいなかったことです。
S3 VPC Endpointを使用するときには、アクセスするリージョンを明示する必要があります。
まず、リージョンを指定しないURL https://s3.amazonaws.com/ でS3にアクセスすると、
どのリージョンへ行くのか確認してみます。
$ nslookup s3.amazonaws.com
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
s3.amazonaws.com canonical name = s3-1.amazonaws.com.
Name: s3-1.amazonaws.com
Address: 52.216.89.102
アクセスするIPアドレス(52.216.89.102)を確認してみると、
us-east-1なので米国東部 (バージニア北部)リージョンであることが確認できます。
SSMエージェントは特定のリージョンからダウンロードすることも可能ですので、
東京リージョンからダウンロードするURL https://s3.ap-northeast-1
.amazonaws.com/ に打ち換えて確認してみます。
$ nslookup s3.ap-northeast-1.amazonaws.com
Server: 10.0.0.2
Address: 10.0.0.2#53
Non-authoritative answer:
Name: s3.ap-northeast-1.amazonaws.com
Address: 52.219.4.96
アクセスするIPアドレス(52.219.4.96)を確認してみると、
ap-northeast-1なので東京リージョンであることが確認できます。
次に、VPCのルートテーブルを確認してみます。
S3 VPC Endpoint作成時に関連付けたルートテーブルには、
自動的にS3 VPC Endpointへのルーティング設定が追加されます。
このルーティング設定を確認すると、
東京リージョンのS3 IPアドレス(52.219.0.0/20,52.219.136.0/22,52.219.16.0/22,52.219.68.0/22)
へのアクセスのみS3 VPC Endpointへ送信することが確認できます。
先ほど確認したIPアドレス(52.219.4.96)もこのレンジに含まれます。
解決方法
SSMエージェントのダウンロードURLでリージョン指定することにより、
S3 VPC Endpointへルーティングされるようになります。
これでインターネット接続を禁止しているサブネットからも
S3 VPC Endpoint経由でSSMエージェントのダウンロードが行えます。
S3バケットのURLでリージョンを明示的に指定
https://s3.ap-northeast-1
.amazonaws.com/amazon-ssm-ap-northeast-1
/latest/linux_amd64/amazon-ssm-agent.rpm
ユーザーデータ全体
#!/bin/bash
cd /tmp
sudo curl -O https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
sudo yum -y localinstall amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
まとめ
EC2インスタンスを起動した直後からセッションマネージャーが使えるととても便利ですよね。
S3 VPC Endpoinの振る舞いをおさらいしつつ、
AWS Session Managerをインターネット接続を禁止しているEC2に自動的にインストールする方法と、
SSMエージェントのインストールパッケージをVPCエンドポイント経由でダウンロードする方法を紹介しました。
以上です。