[AWS] [2020/8/18Update] Cloud9がSession Managerに対応しました！

# Cloud9
AWSが提供する、コードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE)です。
詳細はこちら。

[AWS Cloud9](https://aws.amazon.com/jp/cloud9/)

そのCloud9ですが、2020/8/18にアップデートがあり、

> Cloud9 は、Cloud9 IDE を使用しているお客様に拡張 VPC サポートの提供を開始します。このリリースでは、イングレスがない (そして、オプションでエグレスがない) プライベートサブネットで Cloud9 環境を作成するためのサポートが追加されています。

[AWS Cloud9 が拡張 VPC サポートをリリース](https://aws.amazon.com/jp/about-aws/whats-new/2020/08/aws-cloud9-releases-enhanced-vpc-support/)

という機能追加が行われました。
つまり、Session ManagerでEC2インスタンスに接続して、そこで開発作業が行えるようになったのです。

# Session Manager
System Managerの機能の一部で、インバウンドポートを開いたり、踏み台ホストを維持したり、SSHキーを管理したりすることなく、監査可能なインスタンスを安全に管理できるようになります。
詳細はこちら。

[AWS Systems Manager Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)

# 何がうれしくなるの？
これまで、Cloud9を動作させるために必要なEC2インスタンスは、SSH接続する必要がありました。
それはそれで、別にダメではないのですが、よりセキュアな環境を作るために、SSHポートは閉じてSession Managerでセキュアに接続する運用をしたい、と考えていた開発者の方々には、なんかひっかかる部分があったのではないでしょうか。
今回、Session Manager経由でアクセスできるようになったことで、SSHポートを開けることなく、Private でセキュアなEC2インスタンスをCloud9から接続して開発作業が行えるようになるのです。
これは、朗報ではないでしょうか。

# 準備
準備の章については、既に特定のVPC上に、Session ManagerでアクセスできるPrivate Subnetが構築できている（既にEC2用に使用している）のであれば、スキップしても大丈夫です。

## VPC
### ルートテーブル
以下の設定で作成します。

- 名前タグ：わかりやすい名称で
- VPC：デフォルトのVPCでOKです

InternetGatewayにルーティングしていないことを確認してください。

### サブネット
以下設定で作成します。

- 名前タグ：わかりやすい名称で
- VPC：デフォルトのVPCでOKです
- アベイラリティゾーン：指定なし
- IPv4 CIDRブロック：VPCのCIDR内の適当なCIDRを指定

ルートテーブルは、上で作成したルートテーブルに関連付けるようにしてください。

### セキュリティグループ
以下設定で作成します。

- セキュリティグループ名：わかりやすい名称で
- 説明：適当にわかりやすい説明を
- VPC：デフォルトのVPCでOKです
- インバウンドルール：
    - タイプ：HTTPS
    - プロトコル：TCP
    - ポート範囲：443
    - ソース：サブネットのIPv4 CIDRブロックを指定
- アウトバンドルール：なし

### エンドポイント
以下のエンドポイントを作成してください。

- com.amazonaws.[リージョン名].ssm
- com.amazonaws.[リージョン名].ssmmessages
- com.amazonaws.[リージョン名].ec2messages

上記インタフェースは、いずれも、

- VPC：デフォルトのVPCでOKです
- サブネット：上で作成したサブネット
- アベイラリティゾーン：全部チェックでOKです
- プライベートDNS名有効にする：チェック
- セキュリティグループ：上で作成したセキュリティグループ

さらに、下記ゲートウェイを同様に作成してください。

- com.amazonaws.[リージョン名].s3

各種設定は、以下のようになります。

- VPC：デフォルトのVPCでOKです
- ルートテーブル：上記で作成したルートテーブル
- ポリシー：フルアクセス

# Cloud9
では、Cloud9の環境を作成していきましょう。
最初の「Name」については、わかりやすい適当な名前をつけてください。

次に、Configure settingsで、Environment typeに、新しく選択項目が追加になったのです。

- Create a new no-ingress EC2 instance for environment (access via Systems Manager)

という項目です。これが、EC2インスタンスを作成しつつSession Managerで接続できる環境を意味します。

![c91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/434bb2d1-9010-5f90-2646-ab758d741f9c.png)

そして、画面の下部ぶある「Network settings（advanced）」を展開し、Session ManagerのEndpointが設定済みのVPCと、Private Subnetを選択してください。

![c92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/31669637-a821-095d-b922-428824458086.png)

そして「Next Step」ボタンを押します。
確認画面が出るので、そのまま「Create environment」ボタンを押すと、Cloud9の環境と、EC2のプロビジョニングが始まります。

![c93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/c279a42b-2260-b853-85cb-ff7ab59ede50.png)

そして、繋がりました。

![c96.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/beffdcf2-8243-be50-b471-de3bddd89f05.png)

でも正直、今までとの違いがわかりません。

# 接続確認
というわけで、ローカルPCのターミナルから、SSHではなくSession Managerで接続してみましょう。

接続するコマンドは、

```bash:構文
$ aws ssm start-session --target [インスタンスID]
```

です。
インスタンスIDを調べるには、起動中のCloud9のコンソールから

```bash
$ curl 169.254.169.254/latest/meta-data/instance-id/
i-0d4c52a1c2080013e
```

と実行してみましょう。自分のインスタンスIDが表示されます。
では、ローカルPCのターミナルから、Session Managerで接続してみましょう。
あと、事前にクレデンシャルの設定をお忘れなく。

```bash
$ aws ssm start-session --target i-0d4c52a1c2080013e

Starting session with SessionId: **************
sh-4.2$
```

繋がりますね、あっさりと。

なお、AWS Cliから、Session Managerでアクセスするためには、Session Manager Pluginが必要です。もしプラグインがインストールされていない場合は、下記よりクライアント環境にあったプラグインをインストールしてください。

[(Optional) Install the Session Manager Plugin for the AWS CLI](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)

# まとめ
今回のアップデートは、セキュリティ強化のためのアップデートですので、ぜひ開発環境向けに活用したいと思います。
あと、開発するものからAWSのサービスを使う際に、場合によってはアタッチしているVPCにエンドポイントを追加する必要があるかもしれませんので、その辺は必要に応じて追加していってみてください。

# 関連記事

- [[AWS] Private Subnet内のEC2インスタンスにローカルPCのターミナルからSession Managerでアクセスする](https://qiita.com/herohit-tool/items/85ccfd7799474c81fb6a)