AWS Cloud9 で既存の EC2 インスタンスに接続する

 以前の記事でEC2インスタンスも同時に自動的に作成するやり方で Cloud9 の環境を作成してみましたが、仕事等で使うケースを考えると、既存のインスタンスに接続するケースもありそうだったので、試しに EC2 インスタンスを事前に別途作成して、そこに接続するやり方で Cloud9 の環境を作成してみました。

 手順はこちらで紹介されているので、この手順に沿ってやってみました。 EC2 インスタンスを作成するリージョンは Cloud9 と同様にシンガポールリージョンにしています。

docs.aws.amazon.com

VPC作成

 まずは VPC を作成します。 VPC コンソールから VPC ウィザードの起動 をクリックします。

f:id:akanuma-hiroaki:20190309215356p:plain

 VPC 内からインターネットに接続できる必要があるので、種別としては 1個のパブリックサブネットを持つ VPC を選択して 選択 ボタンをクリックします。

f:id:akanuma-hiroaki:20190309215501p:plain

 VPC の設定は基本的にデフォルトで OK なので、 VPC 名だけ任意のものを設定し、 VPC の作成 をクリックします。

f:id:akanuma-hiroaki:20190309215614p:plain

 VPC が作成されたら、 VPC コンソールからその VPC を選択し、 Description タブの Network ACL の ID のリンクをクリックします。

f:id:akanuma-hiroaki:20190309215853p:plain

 インバウンドルールを設定するために、 Inbound Rules タブの Edit inbound rules をクリックします。

f:id:akanuma-hiroaki:20190309220004p:plain

 インバウンドルールでは ssh の接続元を Cloud9 に限定するのですが、設定すべき CIDR は ip-ranges.json というファイルに記載されているので、下記のように確認することができます。今回はシンガポールリージョンなので、 region が ap-southeast-1 になっている2項目を使用します。

$ wget https://ip-ranges.amazonaws.com/ip-ranges.json
$ jq '.prefixes[] | select(.service=="CLOUD9")' < ip-ranges.json
{                              
  "ip_prefix": "13.250.186.128/27",
  "region": "ap-southeast-1",
  "service": "CLOUD9"
}                                 
{                               
  "ip_prefix": "13.250.186.160/27",
  "region": "ap-southeast-1",
  "service": "CLOUD9"
}            
〜〜〜以下略〜〜〜

 上記 CIDR をアクセス元として設定した ssh のルール2つと、Port Range で接続を許可する設定1つの合計3つのルールを設定します。最後に Save ボタンをクリックして設定を保存します。

f:id:akanuma-hiroaki:20190309220132p:plain

EC2 インスタンス作成

 続いて実際に接続する EC2 インスタンスを作成します。 EC2 コンソールから インスタンスの作成 をクリックします。

f:id:akanuma-hiroaki:20190309220344p:plain

 AMI は Amazon Linux 2 を選択します。

f:id:akanuma-hiroaki:20190309220640p:plain

 インスタンスタイプは、今回はお試しということで t2.micro を選択します。

f:id:akanuma-hiroaki:20190309220759p:plain

 インスタンスの詳細設定では、ネットワークとして先程作成した VPC を選択します。サブネットもその VPC に属する一つが選択されます。その他はデフォルト設定でOKなので、 次の手順: ストレージの追加 をクリックします。

f:id:akanuma-hiroaki:20190309221009p:plain

 今回はストレージはデフォルトのままで良いので、そのまま 次の手順: タグの追加 をクリックします。

f:id:akanuma-hiroaki:20190309221104p:plain

 今回は特にタグも追加しないので、そのまま 次の手順: セキュリティグループの設定 をクリックします。

f:id:akanuma-hiroaki:20190309221156p:plain

 セキュリティグループの割り当てでは 既存のセキュリティグループを選択する を選択し、VPC 内に作成されているセキュリティグループを選択して 確認と作成 をクリックします。

f:id:akanuma-hiroaki:20190309221342p:plain

 設定内容の確認画面が表示されますので、間違いがなければ 起動 ボタンをクリックします。

f:id:akanuma-hiroaki:20190309221513p:plain

 インスタンスに接続する際のキーペアを新たに作るか、既存のものを使用するかの選択フォームが表示されます。今回は 新しいキーペアの作成 を選択し、キーペア名を設定して キーペアのダウンロード をクリックし、プライベートキーファイルをダウンロードします。ダウンロードすると インスタンスの作成 ボタンがアクティブになりますので、クリックしてインスタンスを作成します。

f:id:akanuma-hiroaki:20190309221730p:plain

EC2 の環境設定

 冒頭で紹介したページでも説明されている通り、 Cloud9 で接続するにはいくつかの要件を満たす必要がありますので、インスタンスに接続して設定を行います。 VPC の作成中にインバウンドルールの設定で ssh の接続元を Cloud9 に限定しましたが、設定時にローカルからも接続できるように一時的に設定を追加します。設定が完了したら追加した設定は削除しておきます。

f:id:akanuma-hiroaki:20190309222144p:plain

 また、詳細な説明は割愛しますが、パブリックIPアドレスが必要になりますので Elastic IP も割り当てておきます。

 接続できるようになったら ssh でインスタンスに接続します。

$ ssh -i "cloud9.pem" ec2-user@ec2-52-XXX-XXX-XXX.ap-southeast-1.compute.amazonaws.com

 Cloud9 で接続するには Python 2.7 が必要になります。これはデフォルトでインストールされています。

$ python -V
Python 2.7.14

 次に node.js も必要になります。これはデフォルトではインストールされていませんので、下記手順でインストールします。

$ sudo yum -y update 
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
$ . ~/.bashrc
$ nvm install node
$ node --version
v11.11.0

 また、 Cloud9 で接続するディレクトリの権限を設定します。ホームディレクトリを対象とする場合には下記のように権限を設定します。

$ ls -ld ~
drwx------ 5 ec2-user ec2-user 122 Mar  9 11:47 /home/ec2-user
$ 
$ sudo chmod u=rwx,g=rx,o=rx ~
$ 
$ ls -ld ~
drwxr-xr-x 5 ec2-user ec2-user 122 Mar  9 11:47 /home/ec2-user

 最後に AWS Cloud9 インストーラを実行します。 gcc が必要なので yum で Development Tools をインストールしてから、 curl でインストーラをダウンロードして実行します。

$ sudo yum -y groupinstall "Development Tools"
$ curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash

Cloud9 の環境作成

 それでは Cloud9 の環境を作成します。 Cloud9 のコンソールから Create environment をクリックします。

f:id:akanuma-hiroaki:20190309222332p:plain

 環境名と説明を任意に入力し、 Next step をクリックします。

f:id:akanuma-hiroaki:20190309222454p:plain

 Environment type で Connect and run in remote server (SSH) を選択します。User には ec2-user、Host には先程までに作成した EC2 インスタンスのパブリックIPを設定します。 Copy key to clipboard をクリックすると Cloud9 から EC2 インスタンスに接続するためのパブリックキーがコピーされますので、インスタンス上で authorized_keys に設定します。設定できたら Next step をクリックします。

f:id:akanuma-hiroaki:20190309222729p:plain

 ちなみに authorized_keys への登録は vi などで下記のようにファイルを編集してペーストします。

$ vi ~/.ssh/authorized_keys

 設定内容の確認画面が表示されますので、問題なければ Create environment をクリックします。

f:id:akanuma-hiroaki:20190309222850p:plain

 Cloud9 の環境が作成され、追加でインストールが必要なもののリストが表示されますので、全て選択された状態のまま Next をクリックします。

f:id:akanuma-hiroaki:20190309223009p:plain

 コンポーネントのインストールが始まりますので完了するまで待ちます。ちなみに私は上記の画面から進まなくなってしまったので一度キャンセルしましたが、再度 Cloud9 環境に接続した際にインストールが行われ、無事に完了しました。

f:id:akanuma-hiroaki:20190309223100p:plain

 インストールが完了すると Cloud9 の IDE が表示され、使用できるようになります。

f:id:akanuma-hiroaki:20190309223144p:plain

まとめ

 Cloud9 で接続するためにはサーバ側がネットワーク設定やソフトウェアのインストールなどの要件を満たす必要があるのでちょっと煩雑ですが、一度設定を作ってしまって AMI として保存しておけば、誰かが同じ環境を使う場合にも AMI からインスタンスを作成すれば Cloud9 側の環境だけ新たに作れば良いので、導入時の手間が削減できそうですね。

f:id:akanuma-hiroaki:20190309233114j:plain:w400