はじめに
こんにちはSREエンジニアのMakiです。
この記事ではAWSにクラウドフォーメーションを使って環境構築を行っていた際に発生したUbuntu 環境にSSHできなくなった問題についてどのように対処したのかを紹介します。
SSH接続ってサーバー管理者であれば当たり前に使うことだと思うので、もし接続できなくなったとしたらとっても困りますよね?
もし同じような状況に困ったという方の参考になれば幸いです。
キーワード
- AWS
- CloudFormation
- EC2
- Ubuntu
- SSH
- UserData
AWSで立てたUbuntu 環境にSSHできない
概要
問題
私はAWSの環境構築によくCloudFormation を使っています。
CloudFormationとはAWSが提供している環境構築のオーケストレーションサービスです。今回CloudFormationを使ってUbuntu のEC2 インスタンスを構築したのですが、インスタンス構築後にssh 接続できないという問題が発生しました。
結論
以下のコマンドをCloudFormation のUserData部分に記載することで解消できました。
sudo sed -e "$ a source /etc/network/interfaces.d/*.cfg" -i /etc/network/interfaces
では具体的に起きていたことと、対処したことについて説明いたします。
起きていたこと
CloudFormation を使って EC2 の環境構築を行おうとしておりました。
作成しようとした環境
- OS Version : ubuntu Ubuntu 16.04.4 LTS
- AMI-ID: ami-940cdceb
この状態で環境に接続用としたのですが。。。
あれ?つながらない。。
なんでだろうと思ってEC2のシステムログを確認したところ以下の内容が出力されていました。
ci-info: no authorized ssh keys fingerprints found for user ubuntu.
<14>Sep 17 04:29:55 ec2:
<14>Sep 17 04:29:55 ec2: #############################################################
<14>Sep 17 04:29:55 ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 04:29:55 ec2: 1024 SHA256:rvZQobKMB9EwwZ7cwafvTAI99P7fSJaK03F52N8OqWk root@ip-192-168-101-71 (DSA)
<14>Sep 17 04:29:55 ec2: 256 SHA256:J5oain5gRoAon08rEv/AVhHME5gM4o79pbAnY3HQcKg root@ip-192-168-101-71 (ECDSA)
<14>Sep 17 04:29:55 ec2: 256 SHA256:4mMyxAYQpXhdGmSdcr9DxwPUCq8sjItQYS1LWk+LD7I root@ip-192-168-101-71 (ED25519)
<14>Sep 17 04:29:55 ec2: 2048 SHA256:LnZqUBkCWJHLWTUw6DHGSkjvyko9E+U8XIGVg2rRLtI root@ip-192-168-101-71 (RSA)
<14>Sep 17 04:29:55 ec2: -----END SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 04:29:55 ec2: #############################################################
ci-info: no authorized ssh keys fingerprints found for user ubuntu
なるメッセージが出力されていました。
本来の姿
通常は BEGIN SSH HOST KEY FINGERPRINTS
の手前に Authorized keys from /home/ubuntu/.ssh/authorized_keys for user ubuntu
というメッセージが表示されるはずですが、表示されていませんでした。
ci-info: +++++++++++++++++Authorized keys from /home/ubuntu/.ssh/authorized_keys for user ubuntu+++++++++++++++++
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
ci-info: | Keytype | Fingerprint (md5) | Options | Comment |
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
ci-info: | ssh-rsa | 8e:e8:76:d6:f6:23:a7:94:8e:ca:1e:3d:da:f9:b3:e8 | - | test |
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
<14>Sep 17 04:29:56 ec2:
<14>Sep 17 04:29:56 ec2: #############################################################
<14>Sep 17 04:29:56 ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 04:29:56 ec2: 1024 SHA256:C6urmZrd+y2gnAJOFXHh82wR8vxfVvn18pAFevy25Bc root@ip-192-168-101-77 (DSA)
<14>Sep 17 04:29:56 ec2: 256 SHA256:hBL+yDSiWykRhbR8Um6c7YB/DGTGBwmsu0auVytptvg root@ip-192-168-101-77 (ECDSA)
<14>Sep 17 04:29:56 ec2: 256 SHA256:3skbIJPcIQTjx80PA+R98Bjl/t4Dvj5jcprOGA/AzJ4 root@ip-192-168-101-77 (ED25519)
<14>Sep 17 04:29:56 ec2: 2048 SHA256:dO7vcMB+ciN30PihRmz61DUIQ25bVeSQWWmVPCaPrUc root@ip-192-168-101-77 (RSA)
<14>Sep 17 04:29:56 ec2: -----END SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 04:29:56 ec2: #############################################################
通常なら Authorized keys from /home/ubuntu/.ssh/authorized_keys for user ubuntu
のようなメッセージが出力されるはずである。
これによってSSH接続接続できるようになるはずであるが、no authorized ssh keys fingerprints found for user ubuntu.
となっていた。
ヒントを見つけた!
色々と調べているうちに以下に解決できそうなヒントを見つけたました。
Linux Mint installs the cloud-init networking scripts in /etc/network/interfaces.d/50-cloud-init.cfg but doesn’t change /etc/network/interfaces to include that, so we need to do that manually. (Otherwise the networking hasn’t been properly set up when it tries to fetch configuration from http://169.254.169.254/ so it gives the error “Failed to establish a new connection: [Errno 101] Network is unreachable”, and the ubuntu user is not given your ssh key: “ci-info: no authorized ssh keys fingerprints found for user ubuntu”.)
ざっくり翻訳してみます。
Linux Mintは、「cloud-init」ネットワーク・スクリプトを「/etc/network/interfaces.d/50-cloud-init.cfg」にインストールします。しかし、「/etc/network/interfaces」を変更することはできないため、手動で行う必要があります。(そうしないと、「http://169.254.169.254/」から設定を取得しようとしたときにネットワークが正しく設定されず、エラー「Failed to establish a new connection: [Errno 101] Network is unreachable」が表示され、ubuntuユーザーにsshキー「ci-info: no authorized ssh keys fingerprints found for user ubuntu」が与えられません。)
コマンド
sudo sed -e "$ a source /etc/network/interfaces.d/*.cfg" -i /etc/network/interfaces
どうやら 上記を実行してあげないとEC2から設定を取得できずに no authorized ssh keys fingerprints found for user ubuntu
というメッセージが出てしまうようである。
やってみた
今回の環境構築ではCloudFormation 内にUserDataというインスタンスが作成された後に実行されるスクリプトを書いてました。そこでそこの末尾に以下の処理を追加
sed -e '$ a source /etc/network/interfaces.d/*.cfg' -i /etc/network/interfaces
実際にCloudFormation に書いたUserDataは次のような感じ
UserData:
Fn::Base64: !Sub |
#!/bin/bash -x
###################################
# install package
###################################
apt-get update
apt-get -y install zip
apt-get -y install unzip
apt-get -y install nfs-common
apt-get -y install git
apt-get -y install binutils
apt-get -y install docker.io
apt-get -y install python-pip
apt-get -y install jq
git clone https://github.com/aws/efs-utils
cd efs-utils && ./build-deb.sh && ls ./build/amazon-efs-utils*deb
apt-get install -y ./build/amazon-efs-utils*deb
cd ..
pip install awscli
pip install --upgrade awscli
apt-get -y install openjdk-8-jdk
*
* 途中割愛
*
###################################
# send cfn-signal
###################################
pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz
cp -a /usr/local/init/ubuntu/cfn-hup /etc/init.d/cfn-hup
chmod u+x /etc/init.d/cfn-hup
update-rc.d cfn-hup defaults
service cfn-hup start
/usr/local/bin/cfn-init -v --stack ${AWS::StackName} --resource SlaveLaunchConfiguration --region ${AWS::Region}
/usr/local/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource SlaveAutoScalingGroup --region ${AWS::Region}
sed -e '$ a source /etc/network/interfaces.d/*.cfg' -i /etc/network/interfaces
\n
どうなったか
ci-info: +++++++++++++++++Authorized keys from /home/ubuntu/.ssh/authorized_keys for user ubuntu+++++++++++++++++
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
ci-info: | Keytype | Fingerprint (md5) | Options | Comment |
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
ci-info: | ssh-rsa | 8e:e8:76:d6:f6:23:a7:94:8e:ca:1e:3d:da:f9:b3:e8 | - | test |
ci-info: +---------+-------------------------------------------------+---------+--------------------------------+
<14>Sep 17 06:40:03 ec2:
<14>Sep 17 06:40:03 ec2: #############################################################
<14>Sep 17 06:40:03 ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 06:40:03 ec2: 1024 SHA256:63r4H51pByGoe8Lg+6xaRPJVTtAmWz57lmOCJZ2tYsg root@ip-192-168-101-163 (DSA)
<14>Sep 17 06:40:03 ec2: 256 SHA256:GC46MU3s4JYNkzxr2XeT4WkYcInKE8yO7MmKi1sQTIs root@ip-192-168-101-163 (ECDSA)
<14>Sep 17 06:40:03 ec2: 256 SHA256:loGOrhIgTx2n3EG8q9a++dZjuRnLrRk2/Sos2UpK1v8 root@ip-192-168-101-163 (ED25519)
<14>Sep 17 06:40:03 ec2: 2048 SHA256:5eDuCmUC/Lty84cP12en5GZvqFqv7qoO04PRquIvTlU root@ip-192-168-101-163 (RSA)
<14>Sep 17 06:40:03 ec2: -----END SSH HOST KEY FINGERPRINTS-----
<14>Sep 17 06:40:03 ec2: #############################################################
-----BEGIN SSH HOST KEY KEYS-----
無事に Authorized keys from /home/ubuntu/.ssh/authorized_keys for user ubuntu
が出力され実際にssh 接続できるようになりました。
まとめ
いかがでしたでしょうか。改めて内容をまとめると。
- AWS CloudFormation を使ってUbuntuの環境構築を実施
no authorized ssh keys fingerprints found for user
というエラーでSSH接続できない問題が発生http://169.254.169.254/
に接続できなかったことが原因で `ubuntu' ユーザーにsshキーを付与できなかった。sudo sed -e "$ a source /etc/network/interfaces.d/*.cfg" -i /etc/network/interfaces
をUserDataに追加することで解消できた。
以上です。もし同じような問題にぶつかった方の役に立てれば幸いです。
コメント