CloudFormationで立てたUbuntuにSSHできなくてハマった

クラウドサービス
guaxipoによるPixabayからの画像

はじめに

こんにちは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. となっていた。

ヒントを見つけた!

色々と調べているうちに以下に解決できそうなヒントを見つけたました。

https://kognitio.com/blog/making-amazon-machine-image/
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に追加することで解消できた。

以上です。もし同じような問題にぶつかった方の役に立てれば幸いです。

関連書籍


Ubuntuサーバー徹底入門

コメント

タイトルとURLをコピーしました