Cloud9をパブリックIPアドレスを取得して自身のVSCodeで利用する方法。

## 背景

まずAWSのCloud9を利用することで簡単に検証用環境を立ち上げることができ、
自身端末の環境変更することが済むのでよく使います。
DockerやPythonなどもインストール済みなので、
インターネットが繋がっていればどこでも使えるので気に入ってます。

ただ、IDE自体は特に拡張機能もないですし、
使い慣れたVSCodeを利用したと思い色々調べてみました。

今回Cloud9をVSCodeで利用する方法を紹介します。

また、Cloud9は起動するとパブリックIPアドレスが変更されます。
毎回設定ファイルを更新するのも面倒なため、
設定ファイルを更新するスクリプトもご紹介します。

## 手順

### ローカル端末側設定

- 公開鍵、秘密鍵作成
    
    ```bash
    $ cd ~/.ssh
    $ ssh-keygen -b 4096 -t rsa -f id_rsa_cloud9
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in id_rsa_cloud9
    Your public key has been saved in id_rsa_cloud9.pub
    The key fingerprint is:
    SHA256:X+8t7nVFYHeKnjcJm8rirdEtCiI/F1RhpehwHuoaTCM ***********************
    The key's randomart image is:
    +---[RSA 4096]----+
    |        oo.   o o|
    |       o..   o +.|
    |    . +..   o . .|
    |     *..   . = o |
    |E o ..o S   * + .|
    | + o  .  + + o ..|
    |  + o ..o * . . o|
    |   =...o = . ..o.|
    |  . .o  +..  o+..|
    +----[SHA256]-----+
    $ cat id_rsa_cloud9.pub
    Cloud9側で利用するため控えておくこと
    ```
    
- ~/.ssh/cloud9_config作成
    
    ```bash
    $ vi clou9_config
    以下記載
    Host cloud9
      HostName <cloud9のパブリックIPアドレス>
      User ec2-user
      IdentityFile ~/.ssh/id_rsa_cloud9
    
    ```
    

### Cloud9側設定

- authorized_keys修正
    
    Cloud9を起動し、/home/ec2-user/.ssh/authorized_keysを修正します。
    
    ```bash
    $ vi /home/ec2-user/.ssh/authorized_keys
    先ほど控えたid_rsa_cloud9.pubの内容を追記。
    ```
    
- セキュリティグループ修正
ローカル端末からSSHでCloud9のEC2インスタンスに接続できるように22ポートに接続できるようにします。
AWSコンソール画面からcloud9で利用しているEC2インスタンスのセキュリティタブを確認し、
セキュリティグループのリンクをクリックする。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281678/a953c41c-79bf-17c3-fec2-e7ba4458bdf6.png)



インバウンドルールタブからインバウンドのルールを編集をクリックする。

![画像２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281678/79cc631b-341a-4456-6919-4d55a9d515dc.png)


SSHを設定し、ソースに許可したいIPアドレスを記載する。
※自宅のネットワークからのみ利用する場合はマイIPで設定することができるのでおすすめです。

### VSCode設定(Remote - SSH)

拡張機能からRemote ー SSHをインストールします。

![画像３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281678/a6194e4a-f595-9baa-d954-1d24308cbd4d.png)


左側にRemote sshのアイコンが追加されたらクリックして、
cloud9_configに記載したHostNameが表示されたら、
右側のボタンからCloud9に接続できるようなります。

![画像４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281678/867b4a89-0782-b7f9-197e-0c9d4cda9837.png)

表示されない場合は、SSHの右側設定ボタンから読み込む設定ファイルを変更してみてください。

## パブリックIPアドレスが変わってしまう件についての対処方法

Cloud9のIDEを閉じて数分（デフォルト30分）でEC2インスタンスが停止してしまいます。
起動するとパブリックIPアドレスが変わってしまい、cloud9_configをその度修正する必要があります。

Elastic IPでIPアドレスを固定することもできますが、
ちょっとお金もかかってしまいます。

私の場合は少しでも節約したいので以下のようなシェルスクリプトを利用して、
AWS CLIを利用してパブリックIPアドレスを取得し、
cloud9_configを更新できるようにしました。

※費用を別に考えてない場合は、Elastic IPを利用しつつ、
IDEを停止してもEC2が停止しないようにするのが良いのかなと思います。

```bash
#!/bin/bash

# Cloud9インスタンスのタグ名を設定
CLOUD9_INSTANCE_TAG_NAME='<cloud9インスタンス名>'

# SSH設定ファイルのパスを設定
CONFIG_FILE='<cloud9_config格納パス>'

# AWS CLIを使用して、指定されたタグ名に一致するEC2インスタンスのPublic IPアドレスを取得
CLOUD9_ADDRESS=$(\
  aws ec2 describe-instances \
    --filters "Name=tag:Name,Values=${CLOUD9_INSTANCE_TAG_NAME}" \
    --query "Reservations[*].Instances[*].PublicIpAddress" \
    --output text
)

# 取得したIPアドレスを表示
echo "Dev Cloud9 Instance IPaddress is ${CLOUD9_ADDRESS}"

# SSH設定ファイル内のHostNameフィールドを新しいIPアドレスに置き換え
sed -i '' "s/HostName [0-9\.]*/HostName ${CLOUD9_ADDRESS}/" ${CONFIG_FILE}
```

## 参考記事
https://note.com/build_service/n/n823c7d446f3a
https://qiita.com/hayate_h/items/93273285cdc7372ae569