※設定方法や接続方法は他の記事で詳しく書いてあるので事象だけ書きます。
やりたいこと
aws cli を使用して local から private subnetにある EC2(ubuntu)にインターネットを使用せずアクセスしたい
aws ssm start-session --target i-xxx
エラー
記事を参考に構成したが An error occurred (TargetNotConnected) when calling the StartSession operation: i-xxxxx is not connected.
になる
結論
ubuntuにRoute 53 Resolverである169.254.169.253
(AWS DNS IPv4)を読むようにセットしアクセスすることで解決した。
構成
この記事を参考にして
- VPC
- IAM
- Security Group
- VPC
- EC2
- EC2 (ubuntu)
- policy(
AmazonSSMManagedInstanceCore
) - ssm-agent install
- policy(
- VPC endpoint
- com.amazonaws.[region].ssm
- com.amazonaws.[region].ssmmessages
- com.amazonaws.[region].ec2messages
- ※ ssm-agentのversionが3.3.40.0以降では ssmmessagesを使用する場合、ec2messagesは必要ないらしい
の構成で組んでアクセスしたが上記エラーが発生
原因特定
- EC2, VPCにアタッチされている policy, roleが正しいか
- roleが古い文法になっていたので修正したが解決せず(公式の最新を確認)
- 各所のインバウンド/アウトバウンドの設定に不備がないか
- 問題なかった
- ssm-agentが最新versionであるか
- なっていなかったのでinstanceに接続しアップデートしたが解決しなかった
-
sudo snap refresh amazon-ssm-agent
を実行
- ssm-agentが起動しているか確認
-
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
を実行 - runningであることを確認
-
-
sudo cat /var/log/amazon/ssm/amazon-ssm-agent.log
を実行し ssm-agentのログを確認する- ssm-agent立ち上げの段階でerrorを確認
Entering SSM Agent hibernate - RequestError: send request failed caused by: Post "https://ssm.[region].amazonaws.com/": dial tcp: lookup ssm.[region].amazonaws.com on 8.8.8.8:53: read udp xx.xx.xx.xx:xxxx->8.8.8.8:53: i/o timeout
DNSで接続エラーが出ているので修正
private subnetなのにpublicにあるGoogle Public DNS(8.8.8.8)にアクセスしようとしている。
現状把握
instance内で sudo cat /etc/resolv.conf
nameserver xxx.xxx.xxx.xxx
nameserver 8.8.8.8
修正
ここを参考にして169.254.169.253
をとりあえず /etc/resolv.conf
に追加 (tee
or vi
などで行う)
nameserver 169.254.169.253
nameserver xxx.xxx.xxx.xxx
nameserver 8.8.8.8
接続確認
-
ssm-agentを再起動
sudo systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent.service
-
localから確認
aws ssm start-session --target i-xxx
アクセスできた!
永続化
instanceの停止なので設定が消える場合があるのでnetplan
で設定しておく