はじめに
AWS Cloud9はそれ自体は無料で利用することができますが、バックエンドに利用するEC2インスタンスの利用料が別途発生します。
ただ、EC2ではなく他のLinuxサーバも利用可能ということだったので、GCE(Google Compute Engine)のAlways Free枠を使って本当に無料にできないか試してみました。
AWS Cloud9
Google Compute Engine
Google Cloud Platform の無料枠
事前準備
- AWSのアカウント登録
- GCPのプロジェクト作成および請求情報登録
- はじめてなら、https://console.cloud.google.com あたりから自然と誘導されると思います
- AWS同様に、無料枠しか使わなくても最初に支払い設定が必要です
 
手順
Cloud9が「ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) 」をうたっているので、環境構築もブラウザのみでやることを目標にします。
GCEインスタンスの起動(GCE側作業)
- 以下URLより「インスタンスを作成」
 https://console.cloud.google.com/compute/instances
 
 
- 以降はポチポチしていくだけなので細かい点は割愛しますが、無料枠におさめるために以下の点がポイントになります
| 項目 | 設定値 | 
|---|---|
| マシンタイプ | f1-micro | 
| ゾーン | USリージョンを選択 | 
| OSイメージ | プレミアムイメージ以外のLinuxOSを選択 | 
| ディスク | 「標準の永続ディスク」で30GB以内 | 
- 
あと、固定IPを確保したほうが継続的にCloud9のバックエンドとして運用するうえで都合がいいと思います 
- 
参考までに、ここまでの内容をコマンド一発(IPアドレス予約だけ終わっている前提)でやる場合は以下の通り 
$ gcloud compute --project "YOUR_PROJECT_ID" instances create "sandbox" \
    --zone "us-west1-b" --machine-type "f1-micro" --network "default" \
    --address YOUR_EXTERNAL_IP --image-family "ubuntu-1604-lts" \
    --image-project "ubuntu-os-cloud" --boot-disk-size "30" \
    --boot-disk-type "pd-standard" --boot-disk-device-name "sandbox"
ここでは例として以下の設定としています。
インスタンス名:sandbox
ゾーン:us-west1-b
OSイメージ:ubuntu16.04
node.jsのインストール(GCE側作業)
$ sudo apt-get update
$ sudo apt-get -y install nodejs
$ which nodejs
/usr/bin/nodejs
→ 表示されたnodejsコマンドのパスをメモっておく
Cloud9環境作成(AWS作業、一部GCE作業)
- AWSマネジメントコンソールにログインし、Cloud9のページを開く
 
 
- 東京リージョンではまだ提供されていないので、どこかサポートされているリージョンに移動する
- 今回はGCEインスタンスをus-west1(オレゴン)に作ったので、Cloud9もus-west-2(オレゴン)にします
 
 
 
- 今回はGCEインスタンスをus-west1(オレゴン)に作ったので、Cloud9もus-west-2(オレゴン)にします
- 「Create environment」を選択
  
 
 
- Nameをお好みで入力して「Next Step」を選択
  
 
 
- バックエンドとなるサーバ情報を入力
| 項目 | 設定値 | 
|---|---|
| Environment type | Connect and run in remote server (SSH) | 
| User | 話を簡単にするためGCEのUbuntuイメージに最初から存在する「ubuntu」を使う | 
| Host | GCEインスタンスの外部IP | 
| Port | 22 | 
| Node.js binary path | 前の項で確認したnodejsコマンドのパス | 
- 「Copy key to clipboard」を選択
- Cloud9が使用するsshキーペアのパブリックキーがクリップボードにコピーされる
 
 
 
- Cloud9が使用するsshキーペアのパブリックキーがクリップボードにコピーされる
- GCEのSSHコンソールに戻り、ubuntuユーザのauthorized_keysファイルにパブリックキーを追記
$ sudo vi ~ubuntu/.ssh/authorized_keys
→ コピーしたパブリックキーをペーストして保存
- Environment settingsページの「Next Step」を選択
 
 
- 確認画面が表示されるので、間違いなければ「Create environment」を選択
 
 
- Always Install everything にチェックして「Finish」を選択
  
 
 
- これで環境構築は完了です!
   
Lambda Functionのデプロイ、実行を試す
せっかくなので実際に何かやってみます。
調子こいてテーマを変更したり先に試したFunctionがある状態でスクリーンショットをとってしまったので、一部の絵で前の項とのつながりがありません。。
AWSマネジメントコンソールでの作業
- Cloud9用のIAMユーザを作成し、以下のポリシーをアタッチする
- 「AWS マネジメントコンソールへのアクセス」は必要なし
 
| AWS管理ポリシー | 
|---|
| AWSLambdaFullAccess | 
| AmazonAPIGatewayInvokeFullAccess | 
| AmazonAPIGatewayAdministrator | 
- 追加で以下のインラインポリシーを作成してアタッチする
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:CreateChangeSet",
                "cloudformation:CreateStack",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:ListStackResources",
                "cloudformation:UpdateStack",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetRole",
                "iam:GetUser",
                "iam:PassRole"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:CreateRole",
                "iam:DeleteRole"
            ],
            "Resource": "arn:aws:iam::ACCOUNT_ID:role/cloud9-*",
            "Effect": "Allow"
        }
    ]
}
→ACCOUNT_ID は自分のアカウントIDに置き換え
Cloud9画面での作業
- awscliインストール
- 画面下部のterminalタブより以下の通り実行(表示されていなかったら、メニューより「Window」-「New Terminal」)
 
$ sudo apt install python-pip
$ pip install --upgrade pip
$ pip install awscli
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: us-west-2
Default output format [None]:
→作成したCloud9用IAMユーザの情報を入力
- λ+ボタンを押す
  
 
 
- それぞれお好みで入力して「Next」
  
 
 
- blueprint一覧が表示されるのでひとまずnodejs6.10の「hello-world」を選択して「Next」
  
 
 
- ひとまずそのまま「Next」
  
 
 
- ひとまずそのまま「Next」
  
 
 
- 確認して「Finish」
  
 
 
- できちゃった
  
 
 
- マネジメントコンソールでLambdaのページを確認すると、確かに同じ名前で作成されている
  
 
 
- 以下の通り「Run Remote」する
  
 
 
- payloadを適当に入力して「Run」
  
 
 
- 実行結果が表示された
   
まとめ
いかがでしたでしょうか。簡単にできるわりに、けっこうよさげです。
開発用の高いマシンやソフトを手に入れなくてもそれなりのことができそうですね。
おまけ
Amazonつながりで、この前のPrime Dayで買ったFireタブレットでCloud9に接続してみました。動きそう!

補足
- 話を簡単にするために一部手抜きをしていますので、本気で使う際は以下の点を考慮したほうがいいかもしれません。
- ubuntuユーザではなくcloud9用のユーザを作成する
- その場合そのユーザでパスワード無しでsudoが実行できるようにする必要あり
 
- sshのポートを22からランダムな値に変更する
- IAMのインラインポリシーはAWSのドキュメントを参考にしていますが、けっこう強い気がするのでCredential管理は十分ご注意を
 
 
 
- ubuntuユーザではなくcloud9用のユーザを作成する
- GCEの無料枠、と書きましたが、下りネットワークについては以下の制限がありますので念のためご認識をお願いします
1 GB の北米から全リージョン宛て下りネットワーク(1 か月あたり、中国およびオーストラリアを除く)
- やっといてなんですが、FireタブレットはAmazonの販促ツールだと思っているので、念のため大切なデータは扱わないようにすることをお勧めします...

