EC2作成時にユーザーを追加してsudo権限を与えて…と毎回やるのは面倒なので、EC2のユーザーデータを使用して初期化作業をサクっと完了させる。
準備・必要なもの
- AWSアカウント
- SSHキー(公開鍵・秘密鍵) - SSHで接続するため必要
- vscode - WindowsからのSSH接続で使用
EC2インスタンス作成
コンソール画面からインスタンスを起動。
イメージで Amazon Linux 2023 を選択
インスタンスタイプ、キーペア、セキュリティーグループを良しなに選択。
高度な詳細 > ユーザーデータに以下を入力
#!/bin/bash
# init config
echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
hostnamectl set-hostname myserver1
# add user
adduser myuser1
usermod -aG wheel myuser1
mkdir /home/myuser1/.ssh
touch /home/myuser1/.ssh/authorized_keys
chown -R myuser1:myuser1 /home/myuser1
echo "ssh-rsa XXXXX..." >> /home/myuser1/.ssh/authorized_keys
※myserver1, myuser1はお好みで設定する。
最後の"ssh-rsa XXXXX..."
の箇所にはあらかじめ準備したSSH公開鍵(id_rsa.pub)の内容を貼り付ける。
これで、sudoのパスワードスキップ、ホスト名の設定、ユーザーの追加とsudo許可、SSHキーの設定が完了する。
SSH接続
インスタンスが起動したらvscodeにRemote - SSH
Extensionを追加する。
Remote ExplorerからSSHの横の歯車で~/.ssh/config
ファイルを開く。
(もしくは、直接~/.ssh/config
ファイルを作成・編集する)
~/.ssh/config
に以下のように設定を追加
Host myserver1
HostName ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com
User myuser1
IdentityFile "C:\temp\ssh\id_rsa"
設定名・ホスト名・ユーザー名・SSH秘密鍵のパスを指定する。
ホスト名は起動後にAWSコンソールでパブリック IPv4 DNSまたはパブリック IPv4 アドレスを確認して設定する。
ユーザー名はサーバー作成時に指定したユーザー名と合わせる。
(IdentityFileで秘密鍵を指定しなければ デフォルトの~/.ssh/id_rsa
が使用される。)
設定追加後にExtensionのRefreshボタンで反映される。
初回接続時はサーバのタイプとfingerprintの確認が表示される。
Amazon LinuxならLinuxを選択する。
接続が完了したら、メニューのTerminal
からNew Terminal
で新しいターミナル画面が下に開く。
補足: SSHキーの作成(Windows)
SSHキーがない場合、dockerがインストール済みなら以下のコマンドで作成できる。
docker run -it -v c:\temp\ssh:/var/ssh alpine sh -c "apk add openssh && ssh-keygen -N '' -f /var/ssh/id_rsa"
これでc:\temp\ssh
以下にid_rsa
とid_rsa.pub
出力される。
補足: SSH秘密鍵のアクセス権限
WindowsのvscodeからSSHで接続する場合、SSH秘密鍵を自分以外のユーザーが読み取りできると接続時にエラーになる。
ログを見るとWARNING: UNPROTECTED PRIVATE KEY FILE!
とかLoad key "C:\\temp\\ssh\\id_rsa": bad permissions
とエラーが表示されている。
この場合、ファイルのアクセス許可を修正し、自分以外からアクセスできないようにする必要がある。
自分のユーザーにフルアクセス権限を指定した後、Authenticated Users
とUsers
グループ等からアクセスできないようアクセス権限を削除する。