AWS Cloud9でLambdaアプリの開発をしたり共同編集をしてみた

この記事は[Amazon Web Services Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aws)の9日目の記事になります。

結構気になっていたAWS re:Invent 2017での発表があります。

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

です。実際どの程度便利なのか、使ってみました。

# 環境作成
利用開始をしようとすると、環境作成のページに飛ばされました。まずはAWS Cloud9が動く環境を準備する必要があるんですね。（そういえばオリジナルのCloud9もそうだったような。。。）

![スクリーンショット 2017-12-05 19.31.16.png](https://qiita-image-store.s3.amazonaws.com/0/102769/f9d63e90-284e-763f-0ab0-3a96830d3135.png)

とりあえずテスト環境を作成します。
テスト環境なので、設定はデフォルトで。30分以上放置してたら作成したインスタンスを止めてくれるとか、気が利いてますね！

![スクリーンショット 2017-12-05 19.48.41.png](https://qiita-image-store.s3.amazonaws.com/0/102769/d1dd6670-ef03-3d03-b3b0-3d0a0381ee47.png)

環境作成の直前に推奨の設定やらが案内されましたが、とりあえず無視します。

![スクリーンショット 2017-12-05 19.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/102769/c4ff9e59-3dd7-d44e-25e3-eb66f3c7b620.png)

環境が作成されるまでしばし待ち。。。（しかし画面かっこいいな）

![スクリーンショット 2017-12-05 19.53.49.png](https://qiita-image-store.s3.amazonaws.com/0/102769/6978f6c6-d199-ebba-2b1a-3ed104167d06.png)

#コーディングしてみる
環境が整えばいよいよコーディングです。が、色々と便利そうなビューになってます。
タブでファイルが分割できたり、

![スクリーンショット 2017-12-05 20.29.42.png](https://qiita-image-store.s3.amazonaws.com/0/102769/bea136c3-d4db-9ba5-0d96-abe6e3937964.png)

ターミナルがあったり。これもうVisual Studio Codeと変わらないな。

![スクリーンショット 2017-12-05 20.30.45.png](https://qiita-image-store.s3.amazonaws.com/0/102769/4e67d5dc-6dfe-fdd0-cac7-c25b74f745ae.png)

ちなみに実態はEC2インスタンスなので、上記のようにコマンドでライブラリをインストールすることができます。実際にインストールすると、左側のフォルダツリーにリアルタイムに構成が反映されます。

![スクリーンショット 2017-12-05 20.30.58.png](https://qiita-image-store.s3.amazonaws.com/0/102769/99d13f86-cad6-c93e-383e-9e2bd1838484.png)

で、コーディングはエディタのキャプチャの通り書いてみました。GoogleにRequestを飛ばす一般的な処理です。


#実行してみる

もちろんこのままだとファイルパスがマッチせずに実行時にインポートエラーが発生するので

![スクリーンショット 2017-12-05 20.30.31.png](https://qiita-image-store.s3.amazonaws.com/0/102769/a35676f7-6ccc-4acb-d078-db7418d1534b.png)

こんな感じでライブラリをインストールするようにして、

```bash
$ mkdir lib
$ pip install requests -t ./testrequests/testrequests/lib/
```

ソースと同じディレクトリにライブラリをインストールするようにします。

![スクリーンショット 2017-12-06 7.30.06.png](https://qiita-image-store.s3.amazonaws.com/0/102769/fa909782-42df-f0c1-6e34-7598e428be47.png)


コードも少し修正しました。

```py
import sys
import os

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'lib'))

import requests

def lambda_handler(event, context):
    res = requests.get("http://www.google.co.jp/")
    return res.status_code

```

これでうまく動きそうです。

#もう一回実行してみる

![スクリーンショット 2017-12-06 7.30.36.png](https://qiita-image-store.s3.amazonaws.com/0/102769/54c8a447-198d-ffbf-3a16-2f71cdc90a78.png)

きちんと結果が得られました。無事動いたようです。
ただ、1点気をつけないといけないのは、あくまでこれはEC2インスタンス上のエディタで実行した、というだけなので、実際のLambdaには何も保存されていません。

ちなみに今回はPythonを使ったのでデバッグはサポートされていませんが、Node.jsやPHP、Goであればデバッグ実行もできるようです。これは便利。

![スクリーンショット 2017-12-07 1.05.31.png](https://qiita-image-store.s3.amazonaws.com/0/102769/8b070a2f-0d92-624c-a2bb-6c3f3908ef1b.png)

最初にファンクションを作成時、Lambdaは登録されるのですが、デプロイするまでは中身は初期化されたままになっています。（当然ではあるのですが、忘れやすいかもこれ）

![スクリーンショット 2017-12-07 1.13.48.png](https://qiita-image-store.s3.amazonaws.com/0/102769/ee2d7e2a-0cc4-da15-25a3-5361cf5896e7.png)

Lambdaでファンクションを選択しても、先ほど書いたコードは存在していません。デプロイをするとLambdaに実際に反映されるようになります。


#デプロイをしてLambdaに更新を反映する
Cloud9上からLambdaへのデプロイを行います。やり方はとても簡単で、ファンクションリストから該当のファンクションを右クリックして「Deploy」を選択するだけ。正直Serverless Frameworkなどを使うよりずっと簡単です。

![スクリーンショット 2017-12-07 1.16.42.png](https://qiita-image-store.s3.amazonaws.com/0/102769/d01269ce-7549-48c2-a5b4-cc335c911582.png)

これだけの操作でLambdaが更新されます。

#共同編集をしてみる
他にアカウントを作成して、共同編集を試してみました。テスト用に「test」というアカウントを作成します。画面右上の「Share」より共有設定を開きます。


![スクリーンショット 2017-12-07 1.22.19_dec.png](https://qiita-image-store.s3.amazonaws.com/0/102769/1bc9346b-22db-33a0-990a-6541182437f2.png)

するとこんな感じの共有用URLが表示されますので、これを別アカウントのブラウザで開いてみます。が、共有の設定をしないともちろんアクセスできません。400で怒られます。

![スクリーンショット 2017-12-07 1.23.02_dec.png](https://qiita-image-store.s3.amazonaws.com/0/102769/7160b729-b673-73a9-036b-fc15dfff39e3.png)

共有設定で自分以外に共有したいIAMユーザーのアカウントを追加すれば設定は完了です。

![スクリーンショット 2017-12-07 1.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/102769/a6f89c21-547a-9955-1970-c0cf2a46ee06.png)

testユーザーでアクセスすると、共有設定画面のユーザーのステータスがOfflineからOnlineに変更になります。

![スクリーンショット 2017-12-07 1.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/102769/2064b154-c3a4-fe3d-2399-44de47680e5c.png)

あとはお互いに編集しているポイントがリアルタイムに反映されていくので、とても便利ですね。キャプチャだけだとなんのことかわかりづらいですが、自アカウントで編集したものがリアルタイムでtestユーザーの画面にも反映されます。

![スクリーンショット 2017-12-07 1.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/102769/3c8f5d32-6fd5-ecbf-fbb8-f09ff9a83707.png)

![スクリーンショット 2017-12-07 1.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/102769/4c3c9aa1-9bb6-0df7-601a-df384482add8.png)
※キャプチャ右上のアカウントの並びが異なるので、それぞれ異なるユーザーの画面だということは見てわかるかな（＾＾；。

#実際にAWS Cloud9を使ってみての感想
思った以上にできることが多いので、かなり可能性を感じました。自分は今仕事の関係上ミャンマーにいるのですが、多少ネットが遅くてもリアルタイムにインターネットにアクセスできれば、開発していて不便だと感じることはありませんでした。実際に開発したパッケージをデプロイしようとした際には、ローカル10MBなどの重いファイルをアップロードするために何分も待たされる、というのもCloud9ならなさそうですし、ありがたい新サービスです。