Azure上の仮想マシンをAWS Cloud9で操作してみよう！

# はじめに

こちらは、職場で[Cloud9](https://aws.amazon.com/jp/cloud9/)の紹介をした際に試した内容を、Qiita向けに起こしたものになります。
実際はAWS Lambdaの開発を通して間接的に利用されている方も多いかと思いますが、どんな仕組みで動いているのかを中心に取り上げてみたいと思います。
このため、AWSだけでなく、Azure上のマシンにも登場してもらいます。

## やりたいこと / やること

- Cloud9ってなに？
- AWS Cloud9を使ってみよう
- AWSの設定画面を見てみよう
- みんなでアクセスしてみよう
- IDEとして使ってみよう

それでは、以下、Cloud9についての内容に進みます！

# Cloud9ってなに？

```
Cloud9の生い立ちから、現在までをお話しします！
```

発音ですが、Cloud9（クラウドナイン）と読みます

- アプリケーションの開発やデータベースなどをクラウド環境で利用できるサービスです
- 統合開発環境（IDE）と呼ばれるもので、様々な便利機能が集約されています
- https://github.com/c9 でソースコードが公開されていますよ！

実は、オープンソースでソースコードが公開されており、ブラウザを通して操作する開発環境（エディタ）としては、ご自身の環境にインストールすることが可能です。

過去にも、個人的にCloud9を紹介した記事がありますので、そちらも良かったらご覧ください。

- [Cloud9でRedmineを動かす](https://qiita.com/akiko-pusu/items/7b37745d6341cc55d5eb)

### Topic: 昨年にAWSに統合されました

Cloud9は、ソースコードを公開している以外に、単独でクラウドを利用したサービスを展開していました。私が[上記の記事で利用]((https://qiita.com/akiko-pusu/items/7b37745d6341cc55d5eb))していた際は、c9.io というドメインでのサービス利用でした。

このCloud9がAWSに買収をされ、現在クラウドのプラットフォームとしてはAWSに統合されつつあります。
以前からの c9.io でのサービスも利用は出来ますが、新規では受け付けていない模様です。

- 関連: [【速報】AWS Cloud9がリリースされました！ #reinvent](https://dev.classmethod.jp/cloud/aws/aws-reinvent-cloud9/) (クラスメソッドの公式ブログから）

Cloud9はGitHubアカウントを持ち、公開リポジトリ＆IDEも公開という条件であれば、無償で利用できたので、例えば [Railsチュートリアル](https://railstutorial.jp) のようなトレーニングのドキュメント内でも、開発環境の1つとしてHerokuと並んで紹介されていました。
（2018年4月時点では、[Railsチュートリアル](https://railstutorial.jp) のドキュメントもAWS Cloud9としてのセットアップの記述にアップデートされています）

## デメリット / 注意点

- ブラウザがないと利用できません
- GUIでの操作を可能にするため、いろんなものが入ります
 - マシン環境によっては動作が重くなります
- nodesを主に利用します
- AWS Cloud9としてAWSの環境を利用する場合は、AWSのアカウントが必要です

Cloud9を自前のサーバで稼働させる場合は、Webでサービス提供なので、インターネットアクセスができる環境では、特に注意してください。

# AWS Cloud9を使ってみよう！

```
何はともあれ、AWS ConsoleからCloud9へGo!
```

上記の通り、今回は自前ではなくAWS Cloud9としてのサービスを利用します。
2018年4月現在、東京リージョンでの利用は出来ませんので、この記事では「バージニア北部」を利用します。


## 環境を作ってみよう

```
Cloud9 Environmentのセットアップ！
```

さて、とにかくCloud9の環境を作ってみます。
まずは、環境の名前と説明（どういう用途か、みたいなもの）を入力します。

![create-cloud-env.png](https://qiita-image-store.s3.amazonaws.com/0/27976/215ca667-93c9-21a4-ea03-48f79aa0b62c.png)

次に細かい設定に進みます。
基本は、Cloud9はAWSの環境を利用するのが前提で、"Environment type" には 「Create a new instance(EC2)」という具合に、EC2上に新規に仮想サーバを立てる流れになります。

インスタンスのサイズやネットワークは、この画面で調整します。
また、作成後は、EC2のインスタンス一覧からもサイズなどは変更可能です。

![configure-env.png](https://qiita-image-store.s3.amazonaws.com/0/27976/79e2a466-4e2e-d620-2dff-0ff8fd9a2065.png)

Cloud9の機能自体は無償（2018年4月段階）ですが、その環境となるEC2に関しては課金が発生します。
せっかくAWSなのでEC2を利用した方が楽そうなのですが、リージョンも通常使っているものと異なりますし、「既存のサーバでも利用できます！」という旨が書かれていたので、今回はEC2を使わないで試してみます。

ということで、「Create a new instance」ではなく、「Connect and run in remote server(SSH)」をチェックして進みます！

## 密林を超えて、青空へ！

```
せっかくなので、紺碧の空へ飛び出してみよう！
```

さて、Cloud9の相手として登場させてみるのは、個人利用で **Azure上** に立てたサーバです。もちろん、AzureだけでなくAWS側からssh通信できるサーバなら、AWS Cloud9をWebベースの開発環境として利用できますので、ご興味があれば同じように試してみてください。

なお、Cloud9を利用できるサーバの条件については、こちらをご参照ください。

- [AWS Cloud9 SSH Development Environment Host Requirements](https://docs.aws.amazon.com/cloud9/latest/user-guide/ssh-settings.html)

EC2を使う方が管理上はメリットがあるよ、とのことですので、その辺りもご考慮の上。

- EC2を選ぶと、Cloud9の設定と同時に必要なパッケージも追加された適切なインスタンスが作られます
- Cloud9からのアクセスが30分以上間が空くと、自動でShutdownします（上げっぱなしで課金されてしまうのを防げます）
- Cloud9の環境を消すと、インスタンスも一緒に消えます

SSHで新規のEC2以外のサーバを使う場合は、ssh接続できる以外にNode.jsやpythonのセットアップ、それからssh接続のユーザでのパッケージ追加（sudoできる権限）も必要になります。

### Azure上のサーバを準備

では、まずはAzure側にVMを一つ作成します。
Cloud9はWebベースとは言っても、実際のサーバはsshのみ通ればOKです。（デフォルトではAzureは公開鍵認証のみです）

![azure-setting.png](https://qiita-image-store.s3.amazonaws.com/0/27976/91170f9a-bd49-7dfa-a02b-9fbb0e3853a5.png)


まずは作ったAzureのサーバにsshで接続できるか確認します。
セットアップ時にcloud9_testというユーザを指定したので、ローカルのMacからの接続チェックです。

```
$ ssh -i .ssh/id_xxxxx cloud9_test@xxx.xx.xx.xx
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.13.0-1011-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

Last login: Mon Mar 19 07:16:03 2018 from xx.xxx.xx.xx
```

### 必要なパッケージを入れましょう

Cloud9を動かすためには、サーバにpython2.7、Node.js 0.6.16 以上が必要になります（2018年4月時点）。
Azureで作ったのはUbuntuですが、この辺りは pythonのバージョンを確認して必要があれば2.7系にし、Node.jsもapt install nodejs npmで追加しておきます。

## AWSからAzureへ繋げてみよう！

サーバの準備が出来たので、次に AWS Cloud9の画面から、「環境」を作成していきます。

AzureのVMのauthorized_keysに、AWS側からCloud9のインストーラーや連携用アカウントが連携できるように、提示された公開鍵を設定しておきます。

![config-to-azure.png](https://qiita-image-store.s3.amazonaws.com/0/27976/74dd4393-e2c8-37ae-6cf1-5f90b14011c5.png)


上記設定を適用し、sshの鍵の設定が正しく行われていると、処理が開始します。
AzureのVMに対し、AWS上の(Cloud9連携用の）EC2がsshアクセスし、いろんなものを仕込んで行きます。
（※Safariでは表示できなかったので、Firefoxを利用しています）

![now-installing.png](https://qiita-image-store.s3.amazonaws.com/0/27976/2708bccc-d6d1-6a45-5404-dea6618b6f3f.png)

sshのプロセスをちょっと確認すると、tmuxが起動したり、ポートフォワードされたりしているのがわかります。

![show-ssh-process.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5be90e10-facc-558a-e9c2-2b9dbe1d455a.png)


完了すると、こんな画面に。

![install-complete.png](https://qiita-image-store.s3.amazonaws.com/0/27976/68160f7b-9806-2de5-425d-6d9fc5f3e9e4.png)

# みんなでアクセスしてみよう

```
ほんとにできるか、みんなで試してみよう！
```

ここまではOKで、エディタとしての機能も、シェル（ターミナル）を操作できる点も、以前のCloud9とほぼ同じです。

次に、Cloud9の環境にチームのメンバーを招待してみました。
inviteは、AWSのアカウントのarnを指定する形になります。

![invite-member.png](https://qiita-image-store.s3.amazonaws.com/0/27976/9719aaf8-b62c-86c7-d2c4-229a9264d15f.png)

### invite結果！

招待したメンバーに、Cloud9のリンクをshareして、アクセスしてもらいます。

![welcome-onboard.png](https://qiita-image-store.s3.amazonaws.com/0/27976/03ac18ac-1795-c948-dfaf-d5b3824f6898.png)

期待していた動作ですが、以下の通りとなりました。

- [x] 画面が見える -> これは出来ました！
- [x] チャットが出来る -> これは出来ました！
- [ ] 関数が実行できる -> 試した段階では時間切れでしたが、多分できそうです！

ざっと試したところでは、アイコンはメンバーのアルファベットから割当たるようです。アイコンを変えられるかは試していないのですが、そのままではちょっと分かり難いかな...。

また、日本語入力に関しては、マシンパワーなのか通信の問題なのか、変換も微妙...。
Azure側の画面を飛ばしてAWS Cloud9側で表示させているので、Azure側を調整すればなんとかなるのかもしれませんし、標準のEC2で立てていれば問題ないのかもしれません。

### 実行＆デバッグできるよ！

さて、IDEとしての機能も確認してみます。
必要な言語があればローカル開発環境と同じように編集が可能ですし、アプリケーションの起動も出来ます。

以下は、pythonのコードのデバッグ例です。
Cloud9からも普通にデバッグが可能です。

![debug-lambda.png](https://qiita-image-store.s3.amazonaws.com/0/27976/a63780c3-ac0b-c78c-3f8c-97fe72ab4ab9.png)

### Azure上でもAWS Lambdaのコードを書いてみるよ！

さて、さらにCloud9のセットアップ時のオプションで、Lambdaの実行の環境を指定しておいたのですが、こちらを使ってlambda functionのコーディングやテストが出来るようになります。

Cloud9自体のセットアップで必要なのはNode.js とpythonですが、lambdaの関数はpython3系のテンプレートもあります。
また、書いたコードはローカル（ここではAzure上）で実行できるという状況になっています。

どうやって実行するの？...というあたりですが、実際はDockerを使ってホスト上で直に動かすのではなく、コンテナを立ち上げて、その中で関数を実行するようになっています。

![create-lambda-function.png](https://qiita-image-store.s3.amazonaws.com/0/27976/4317c74a-18d8-9423-5b9d-77d321145961.png)

docker imagesで確認すると、pythonもNode.jsも、バージョンごとのイメージが登録されています。
また、実際に関数を画面から実行すると、背後で（ほんのちょっとですが）Dockerのコンテナが立ち上がっているのがわかります。

![docker-stats.png](https://qiita-image-store.s3.amazonaws.com/0/27976/0cb2bedf-fd83-42b3-e0c1-f433f7a68ede.png)

Azure上から（Cloud9の画面を通して）AWS側にLambdaの関数をデプロイもできるようです！
ただし、アクセスキー等の権限が必要かと思いますので、この辺りはEC2上でやったほうがすんなり作業できそうですね。


## tcpdumpでAWS Cloud9用の通信を拾ってみるよ

そんなこんなで、駆け足でAWS Cloud9をRemote SSHで使ってみました。
上記の通り、AWSからAzure上のサーバに通信が発生しているので、sshのプロセスだけでなく、tcpdumpでもちょっと確認してみます。

ざっと以下の通りでやってみました。

- tcpdumpはrootじゃないとダメなんでsudoしてから
- sshの接続用通信は除外したいので、not host SOURCE_IP で
- Exp. 自宅からのSSH用の通信は除外してのダンプ

```
$ sudo su
# tcpdump -i eth0 not host 自宅からのsshのIP > dump.sample
# tcpdump -i eth0 not host xx.xxx.xxx.xxx 
```

tcpdumpの結果はこんな感じ。
確かにAWS上 (amazonaws.comドメイン) のインスタンスと通信しているようです。

```
12:42:15.981336 IP ec2-xx-xxx-xx-xx.compute-1.amazonaws.com.47318 > 1x.xx.xx.x.ssh: Flags [P.], seq 0:60, ack 1, win 843, options [nop,nop,TS val 542319625 ecr 30844000], length 60
12:42:15.982197 IP 1x.xx.xx.x.ssh > ec2-xx-xxx-xx-xx.compute-1.amazonaws.com.47318: Flags [P.], seq 1:93, ack 60, win 3442, options [nop,nop,TS val 30849392 ecr 542319625], length 92
12:42:16.187673 IP ec2-xx-xxx-xx-xx.compute-1.amazonaws.com.47318 > 1x.xx.xx.x.ssh: Flags [.], ack 93, win 843, options [nop,nop,TS val 542319677 ecr 30849392], length 0
12:42:17.071526 IP ec2-xx-xxx-xx-xx.compute-1.amazonaws.com.47318 > 1x.xx.xx.x.ssh: Flags [P.], seq 60:120, ack 93, win 843, options [nop,nop,TS val 542319898 ecr 30849392], length 60
```

## まとめ

以上、興味本位ですが、以下のことを試してみました。

- Cloud9ってどんなものかなんとなく触ってみた
- みんなで使えそうか試してみた
- Lambdaの開発に使えそうか感触をつかんでみた
- どういう技術で出来ているかが少しでもわかった
- 通信も眺めてみた

個人的には非常に楽しく試してみたので、勢いで記事を書いてみましたが、少しでも皆さんに楽しんでもらえたり、Cloud9についてわかっていただけたら幸いです。