【Terraform-01】keypairを使ってパスワードレスでSSH


はじめに

タイトルそのまま、公開鍵と秘密鍵を使ってパスワードレスでEC2にSSHします。
ただそれだけなのですが、Terraformを使って構築したのが原因でハマりました。。
戒めの備忘録です。環境はmac。

先に結論

Terraformのaws_key_pairはimportしかサポートしていないので、パスワード無しで生成した公開鍵を使ってコード化する必要がある。

参考にしたサイト

下記サイトを参考にさせて頂きました、この場を借りてお礼申し上げます
Terraformを使わない場合の手順は下記サイトをご参考頂ければと思います!

sshの鍵をTerraformで扱う
SSH公開鍵認証で接続するまで
ssh-copy-idで公開鍵を渡す
sshで公開鍵認証を使ってアクセスする

作業開始

公開鍵と秘密鍵の生成

$ pwd
/Users/okome/.ssh
$ ssh-keygen -t rsa -f okome_id_rsa
$ ls -l
-rw-------  1 okome  okome  1843 Nov 15 20:30 okomne_id_rsa
-rw-r--r--  1 okome  okome   412 Nov 15 20:30 okomne_id_rsa.pub
$ cat okome_id_rsa.pub
ssh-rsa #ハッシュ値は省略します

秘密鍵(okomne_id_rsa)のパーミッションは600が必須です。

コード化

今回はkeypair.tf(拡張子が.tfであればファイル名は任意)に、先ほど作成した公開鍵を指定します。
コードはgithubにupしておきました。

リソース名の"this"とkey_nameの"this-key"は任意の値でOKです。

$ cat keypair.tf 
# okome_id_rsa.pub(password less)
resource "aws_key_pair" "this" {
  key_name = "this-key"
  public_key = "[okome_id_rsa.pub]の値をコピペする"
}

コード化の後はterraform applyでEC2インスタンス(とVPCとかのNW)を構築します。

.ssh/configの作成

SSHを楽にすべく、以下のファイルを作成します。

$ /Users/okome/.ssh
$ vi /Users/okome/.ssh/config
Host okome01
  HostName     [EC2インスタンスに付与したパブリックIP]
  Port         22
  User         ec2-user #AmazonLinux2の場合
  IdentityFile ~/.ssh/okomne_id_rsa

EC2インスタンスにSSH

$ ssh okome01

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
40 package(s) needed for security, out of 72 available
Run "sudo yum update" to apply all updates.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[ec2-user@ip-xx-xx-xx-xx ~]$

パスワード聞かれなかった!成功!

おわりに

SGでアクセスを制限してるのでパスワードレスでも良いと思いますが、強固にしたい場合はパスワードあったほうが間違いないと思います。
その場合は鍵を生成する際にパスワードを入力すれば、それがそのままSSH実行時のパスワードになります。

$ ssh-keygen -t rsa -f okome_id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

ハマった原因は以前作成したパスワード付きの鍵をコード化してそれをすっかり忘れてた、ですね。。
一旦コメントに書くことで応急処置しましたが、できれば技術で解決したい!
ただしやり方はわからないw

簡単ですが以上です