2020-05-25

AWS Cloud9をWEBサーバーにする(IP確認+ポート開放)

Node.jsで簡単なWEBサーバーを立てて外部から接続できるようにする方法

Article Image

AWS Cloud9に外部から接続したい

Cloud9で開発したプログラムに外部から接続することはできるのだろうか。

今回は最もシンプルなWEBサーバーをNode.jsにより立ち上げてみる。

これが成功すれば将来的に独自のポートでCloud9上のプログラムを操作する機能などが実装できそうだ。

前提

すでにCloud9のインスタンスが立ち上がっていること

Cloud9上で動かすWEBサーバーコード

本当にシンプル。追加のnpmパッケージも必要ない。

test.mjs

import http from 'http'
const server = http.createServer()

const port = 9999

server.on('request', function(req, res) {
    res.writeHead(200, {'Content-Type' : 'text/plain'})
    res.write('hello world')
    console.log(`a User Connected.`)
    res.end()
});

server.listen(port, () => {
  console.log(`Server running at PORT:${port}`)
})

※いつもながらES6で書く実験も兼ねる。

まずはCloud9上で起動させる

Node.jsというフォルダを作成し、その中にtest.mjsを配置した。

2020-05-23_11h43_06

起動すると...

> ec2-user:~/environment/Node.js $ node test.mjs
> /home/ec2-user/environment/Node.js/test.mjs:1
> import http from 'http'
>        ^^^^
>
> SyntaxError: Unexpected identifier

エラーが出る。これはCloud9上のNode.jsが古いことが原因である。

> ec2-user:~/environment/Node.js $ node -v
> v10.19.0

ES6の拡張子mjsを実行するためにはv13以降が必要。それ以前の場合は特別なオプションが必要である。

今回はオプションなしで起動したいのでv14をインストールする。

次のコマンドでNode.jsのバージョン一覧を取得できる。最も下にあらわれるものが最新版。

$ nvm ls-remote

今回はv14.3.0が最新版だったのでそちらをインストールする。

$ nvm install v14.3.0

3秒ぐらいで処理が終わる。早すぎて不安になるがこれで起動できる。

$ node test.mjs

test.mjsが保存されているディレクトリへの移動を忘れないように。

エラーなくServer runnningが表示されたら成功。

ポート開放

今回あえて9999という変なポートを使っている。HTTPサーバはAWS上で推奨ポートが設定されておりソレ以外を設定すると自動的につぎのメッセージがポップアップする。

You may be using the wrong PORT & IP for your server application.Try passing port 8080 to properly launch your application.

間違ったポートを使用している可能性があります。正しく動作させるためにポート8080を通すようにしてください。

なんとなくAWSが適正ポートの利用をゴリ押ししてくることを知っていたので、あえて変なポートでも起動できるかテストしてみた。

一般公開用サーバーなら推奨ポートを利用すべきだが、個人で使うサーバーであればセキュリティを少しでも上げるために普段使わない微妙なポートを使うというのは私の経験上の判断(推奨ポートを利用すべきセキュリティ的な理由が他にあったら申し訳ない)

AWSマネジメントコンソールからEC2へ入る

image-20200523121952341

実行中のインスタンスをクリック

image-20200523122020737

先程のプラグラムを起動しているインスタンスのIPv4パブリックIPをメモしておく

image-20200523122153448

少し右にスクロールするとセキュリティグループという項目があるのでクリック

image-20200523122329952

遷移した画面でセキュリティグループIDをクリック

image-20200523122427704

画面下部のインバウンドルールに開放したいポートを設定

image-20200523122530336

image-20200523122601024

ポート範囲を先程の9999に変更

ソースを0.0.0.0/0に設定しルールを保存

※このソースは全てのIPからアクセスできる設定なので注意しておく

image-20200523124612660

正常に保存されれば上部に次のようなダイアログが出ている

image-20200523124655794

先程のIPv4パブリックIPで保存した値を利用してブラウザに次のURLを入力する

先程のIPv4パブリックIP:9999

image-20200523124958218

何の問題もなく先程稼働したWEBサーバーに接続できた。

Cloud9のコンソール側も確認すると文字列が表示されている。

> ec2-user:~/environment/Node.js $ node test.mjs
> Server running at PORT:9999
> a User Connected.
> a User Connected.

※1回のアクセスで2回メッセージが表示されているのはブラウザがfavicon.icoをリクエストしているからだと思われる。

サーバープログラムを終了しポートを閉じる

grungy-wood-number-rust-heart-green-579517-pxhere.com

先程IPのフィルタを設定しなかったので直ぐにctrl+cでサーバーを終了しておく。

またインバウンドルールで追加したポートも消去する。

セキュリティ維持のため使用しない期間は確実に閉じておこう。

おまけ:自分のプロバイダからのみアクセス許可

インバウンドルールのソースに指定したIPを自分のプロバイダのみに限定することによりIPをフィルタし安全にする。

公開HTTPサーバーであればフィルタは必要ないが、Cloud9で稼働しているプログラムを操作するような窓口に使う場合は考慮する必要がある。

自分のIPを調べて255.255.255.255だった場合、ソースに255.255.0.0/16で保存

/16はサブネットマスクと呼ばれるものでIPの範囲を指定している。つまり0.0になっている箇所が0~255までどの数字を入れてもマッチするということ。

これで(たぶん)自分が使っているプロバイダ以外の接続は弾けるはずだ。100%セキュアではないがかなりのフィルタになる。

image-20200523135051911

念の為ケータイ端末の回線から接続できないことを確認する。(自宅のwi-fiから切断することを忘れずに)

0878832C-8D3D-47B1-8967-9868C51940E9_new

music-people-audience-portrait-show-action-1286606-pxhere.com (1)

ヨシ!

さいごに

長めの記事になったが実装は非常に簡単だった。

今後はこの方法を利用して外部から自分だけが接続できるプログラムを作ってみたい。

もう一度言うがセキュリティには十分注意して不要なポートは閉じておこう。



この記事をシェア


謎の技術研究部 (謎技研)