Amazon Linux2 の EC2 インスタンスに SSH しようとしたら Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
が出てしまったのでそれの対処をメモとして残しておきます。
事象
起こっていた事象としては入ろうとしているインスタンス側に公開鍵がなかったでした。
なので、その場合の解決方法を AWS が解決方法を提示しています。
確かに SSM なりで公開鍵を追加してあげれば済む問題ですが、ほぼ同じ条件(後述)で別のインスタンスは SSH できていたため腑に落ちなかったので色々調べてみました。
調べてみた
まず、 SSH できなかったインスタンスのベースの AMI は Amazon Linux2 をベースにしています。
packer + CentOS で authorized_keys に公開鍵が登録されない という情報があったため、そこかなと思いましたがハズれ・・・。
パーミッション周りかなと思いましたがこれも違う。
途方にくれていた時、上記の「ほぼ同じ条件」というところで、うまくいってた時は Amazon Linux 1 、うまくいかないときは Amazon Linux 2 の違いがあったので、そこかなと考えました。
原因
OS の違いが根本的な原因だったわけではなく、真の原因はEC2 起動時に実行される ユーザーデータ でした。
ユーザーデータは普通のシェル形式ではなく、マルチパート形式で記述することができます。
このマルチパート形式を使っていたのですが、なぜか Amazon Linux 2 ではマルチパート形式でアスキー文字以外を使用しているとエラーでユーザーデータが実行されない という不具合があります(Amazon Linux 1 は問題なし)。
どうやら公開鍵の設定は cloud-init で行われているようなので、ユーザーデータが実行されないことで公開鍵も書き込まれなかったようです。そのため、インスタンスに設定した秘密鍵でログインすることができませんでした。
ちなみにセッションマネージャーを使えばこういった鍵問題も気にしなくてよくなりますね。
以上。