Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

AWS Cloud9に移行すべき9つの理由

サーバーエンジニアの下川です。 IDEをローカルCloud9から、AWS Cloud9に移行しました。

はじめに

IDE、何を使っていますか?

私はvimや、少し前はVSCodeも利用しましたが、2年前程からメインで使用しているのはCloud9です。 Cloud9でもサービスの方ではなく、自前でサーバーにインストールして使用しています。

Cloud9がAWSに買収されたのは2016年7月。 そして、2017年12月にはAWS Cloud9がリリースされました。

2018年4月現在では、まだ東京リージョンにはリリースされていませんが、EU (アイルランド)、アジアパシフィック (シンガポール)、米国東部 (バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン)でリリースされています。

今回はローカルCloud9ユーザー、および、Lambda開発者がIDEAWS Cloud9に移行する9つの理由を紹介します。

1つ目〜設定が簡単

今回はアジアパシフィック (シンガポール)でAWS Cloud9を使ってみます。 新規ではなく、現在私が使用している東京リージョンでAWS Cloud9を利用します。 (リージョンは違いますが、問題なく動作しました。)

まず、AWS Cloud9のコンソールから、「Create Environment」をクリックします。 f:id:timers-tech:20180401154545p:plain

名前を付けます。 f:id:timers-tech:20180401154828p:plain:w600

EC2インスタンスを新規で立ち上げるか、既存のEC2インスタンスに設定するか?を選べます。 今回は元々稼働していたEC2インスタンスに入れます。

f:id:timers-tech:20180402122626p:plain:w600

Copy key to clipboardで公開鍵をコピーして、別コンソールで対象インスタンスにログインし ~/.ssh/authorized_keys にペーストします。

これで「Next step」をクリックしたところ、 Cauld not execute Node.js というエラーが発生しました。 SSH接続は成功したけど、nodeが動かないようです。 自動でnodeを入れようとしたり、NODE_PATHから探ったり等はしないようです。

ここで、「Advanced settings」をクリック。Nodeのバイナリパスを指定できます。

f:id:timers-tech:20180402122556p:plain:w600

nodeはnmvで入れていたので、とりあえず持ってるnodeのversionを確認。

$ nvm ls
       v0.10.40
    iojs-v3.3.1
->       v4.3.2
        v6.11.3
default -> v4.3.2
node -> stable (-> v6.11.3) (default)
stable -> 6.11 (-> v6.11.3) (default)
iojs -> iojs-v3.3 (-> iojs-v3.3.1) (default)

LambdaがサポートしているNodeのバージョンがv4.3.2なので、これで動くかな?とv4.3.2のnodeで動くかやってみます。 念のためパスを確認。

$ node
> global.module.paths
[ '/usr/bin/repl/node_modules',
  '/usr/bin/node_modules',
  '/usr/node_modules',
  '/node_modules',
  '/home/shimoty/.node_modules',
  '/home/shimoty/.node_libraries',
  '/home/shimoty/.nvm/versions/node/v4.3.2/lib/node' ]

リトライしたところ、前に進みました!(ちなみにこれらの設定は全て後から変更可能です。)

確認画面の次に進むと・・・

f:id:timers-tech:20180402122521p:plain

これは起動の予感。Cloud9のロゴに胸が踊ります。

f:id:timers-tech:20180402122648p:plain

起動! 簡単すぎて拍子抜けです。

2つ目〜接続が簡単

コンソールから「OpenIDE」をクリックすると、すぐCloud9が起動します。

f:id:timers-tech:20180403224309p:plain:w300

ポートの設定で苦しんだり、ポートフォワードって何?とかそんなこと1ミリも考える必要がありません。 これは、ネイティブエンジニアの皆さんがちょろっとサーバーいじりたい時等にもとても良いのではないでしょうか。

3つ目〜死なない

ローカルCloud9ユーザの方なら経験あると思いますが、Cloud9はたまに謎の死に方をします。

設定後、わざとプロセス殺したらどうなるかな?とやってみたのですが、期待通り即復帰してきます。 自分で永続化の設定とかしないでいいんですよ! (Cloud9ユーザーなら共感してくれるはず。)

4つ目〜簡単にLambdaの開発環境が整う

初回インストール後、自動Lambdaのコンポーネントのインストール画面がでてきます。

f:id:timers-tech:20180402122622p:plain:w600

至れり尽くせりすぎて申し訳なくなるレベル。 両方入れてみます。

途中でsudoのパスワード入力が求められるところで入力を求められるので何回か入力してOKを繰り返せばインストール完了です。

5つ目〜LambdaFunctionの新規作成がIDE上でできる

さて、AWS Cloud9の個人的目玉機能、Lambdaに進みます。 どうやって作るのかな、と思ったら、welcome画面にCreate Lambda Functionの文字が。

f:id:timers-tech:20180402122706p:plain

でもここは、既存のLambda関数を動作させたい! でもRemote Functionsが0・・・?更新してもリストが更新されない・・・。

ふと、更新ボタンの上に目をやると、、、、

f:id:timers-tech:20180402122537p:plain

そうだ!既存のLambdaFunctionは東京リージョン!AWS Cloud9はシンガポールリージョン! AWSさん!東京リージョンもよろしくお願いします!!!

ということで既存LambdaFunctionを動作させるのは諦めて新規作成します。

(2018/4/5追記)

すみません、AWSの中の人からご指摘いただきまして、Lambdaのリモートのリージョンは切り替えられました!

f:id:timers-tech:20180405153539p:plain

Prefernces画面にAWS Settingsというメニューがあります。 そちらからリージョンを選択すると既存のLambdaFunctionがRemote Functionsに反映されました!

ご指摘ありがとうございました!

(2018/4/5追記ここまで)

IDE上でLambda functionの新規作成ができます。

まず、Function名を入力。

f:id:timers-tech:20180402122701p:plain:w600

blueprintを選択。

f:id:timers-tech:20180402122608p:plain:w700

トリガを選択。APIGatewayもlocalでテストできるんですね。 今回はnoneとします。

f:id:timers-tech:20180402122553p:plain:w600

IAMロールを選択。 コンソールと同じで、ここからIAMロールの作成もできますが、今回は既存のロールを選択します。

f:id:timers-tech:20180402122632p:plain:w600

確認画面でFinishをクリックし、無事完成です。 完成。 ふとRemote Functionsを見ると1になってます。

f:id:timers-tech:20180402122503p:plain

この時点でRemoteも更新されるようですね。 コンソール側でも確認できました。

f:id:timers-tech:20180402122511p:plain

6つ目〜LambdaFunctionの実行がIDE上でできる

では早速「Run Local」で実行。

f:id:timers-tech:20180402122637p:plain:w400

ここでエラーが発生です。

Could not find AWS SAM Local at path: '~/.c9/bin/sam'. sam-localが必要とのことです。

f:id:timers-tech:20180402122641p:plain:w500

sam-localを手動でinstallします。

npm install -g aws-sam-local 

~/.c9/bin/samにシンボリックリンクを作成します。

ln -sfn $(which sam) ~/.c9/bin/sam

そして、リラン!

node.js
exports.handler = (event, context, callback) => {
    console.log('Hello Cloud9');
    context.succeed("Hello Lambda");
};

動きました!responseもログも表示されてます。

f:id:timers-tech:20180402122540p:plain

7つ目〜LambdaFunctionのステップ実行ができる

あとは念願のステップ実行。 ブレークポイントを設定。

f:id:timers-tech:20180402122601p:plain:w700

Runの隣の領域にあるDebugモードスイッチをONにしてRun。

f:id:timers-tech:20180402122711p:plain:w700

止まりました! Local Variablesのvalueでiが0な事も確認できます。

f:id:timers-tech:20180402122615p:plain:w700

そして説明するまでもなく、ステップ実行も簡単です。

ローカル実行は便利ですが、やはり node で直接動かした方が起動が早いです。ある程度nodeで直接動かしてから、ローカル実行、デバッグ実行を試して行くのが良さそうです。

8つ目〜コスト節約設定が簡単

今回は既存インスタンスからの作成でしたが、新規インスタンス作成を行うと、「Cost-saving setting」という選択肢が出てきます。

f:id:timers-tech:20180403224800p:plain:w700

もう説明は不要でしょう。 こんな設定まであるとは驚きました。

もちろん24時間365日開発をする方のために「Never」という設定もありますのでご安心を。

9つ目〜API Gatewayまで含めたテストができる

API Gatewayの設定、実行もIDE上でもちろんできます。

f:id:timers-tech:20180403225451p:plain:w700

CloudFormationの設定ファイルが自動で作成されますので、設定管理もできます。 また、環境を複製したり、自動化したりも手軽にできますね。

積極採用中!!

子育て家族アプリFammカップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる