Capistranoで新規作成したEC2インスタンスにSSH接続する

前回に引き続き、Capistranoで新たに作成したEC2インスタンスにSSHでログインしてみます。

まず、事前準備として、AWS側で新規インスタンス用のキーペアを作成しておきます。AWSマネージメントコンソールの「EC2」メニューから「NETWORK & SECURITY」カテゴリの「Key Pairs」メニューで、キーペアを作成できるので、必要に応じて作成してください。本項の例では、「deploy-test」というCapistranoが稼動しているデプロイ環境用インスタンスで使用しているキーペアを使います。

AWSマネージメントコンソール:キーペア

そして、利用するキーペアのプライベートキーファイル(本項例ではdeploy-test.pemファイル)をCapistranoを実行するデプロイ環境のデプロイを実行するユーザのホームディレクトリ(本項例では/home/deploy-user/)にアップロードしておきます1
アップロードしたプライベートキーには適切な読み込み権限を付与しておく必要があるので、ファイルのパーミッションを変更します。

デプロイ設定ファイルconfig/deploy.rbは下記のように修正。

では、インスタンスラウンチタスクを実行してみます。

作成されたインスタンスの起動をAWSマネージメントコンソールで確認したら、コマンドラインでec2-userでのSSHを試してみます。

無事に成功しました。

Capistranoで新規作成したEC2インスタンスに対して、SSHアクセスを行う後続タスクを追加してみます。

新たに作成した「init」タスクでは、まず作成したインスタンスが起動済みであるかをチェックする「check」タスクを実行します。「check」タスクでは、新規作成したインスタンスIDからプライベートIPアドレスを取得して、「WEB、APP」ロールを持つアクセス対象のサーバとしてSSH情報を定義します。この際、Amazon Linuxの初期ユーザ「ec2-user」でのアクセスに対してプライベートキーを付与したログインを行うように設定しています。forward_agentをTRUEにしておかないと、初回SSH時のコンソール対話でアクセスが止まってしまうので注意が必要です。
「check」タスクがOKの場合、「init」タスクが自動で実行されます。こっちのタスクではhostnameコマンドでログインしたそれぞれのサーバのホスト名を出力して終了しています。
では、実際に「init」タスクを実行してみましょう。

作成した新規インスタンスにCapistnranoで無事SSHログインができました。あとは、それぞれのインスタンス用のデプロイ設定をタスクに追加していくだけです。

次回は新規作成したインスタンスに対して、ec2-user以外のユーザを作成して、そのユーザでSSHアクセスが出来るようにしつつ、デフォルトのec2-userユーザにパスワードを設定してデフォルトユーザでのSSHアクセスには制限を設けるというタスクをCapistranoで設定してみようかと。いつまでも強権限のec2-userユーザでEC2インスタンスにアクセスできるのはセキュリティ的に危険なので、作ったインスタンスに保守用アカウントを作成するのはEC2デプロイの初期設定みたいなものになるかと。


  1. AWSではキーペアのプライベートキーは、キーペア作成時に1回だけダウンロードでき、それ以外にはプライベートキーファイルを取得できないため、プライベートキーの取り扱いには注意が必要です。 

おすすめ記事