AWS Cloud9
に外部から接続したいCloud9で開発したプログラムに外部から接続することはできるのだろうか。
今回は最もシンプルなWEBサーバーをNode.js
により立ち上げてみる。
これが成功すれば将来的に独自のポートでCloud9上のプログラムを操作する機能などが実装できそうだ。
すでにCloud9のインスタンスが立ち上がっていること
本当にシンプル。追加の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で書く実験も兼ねる。
Node.jsというフォルダを作成し、その中にtest.mjsを配置した。
起動すると...
> 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が適正ポートの利用をゴリ押ししてくることを知っていたので、あえて変なポートでも起動できるかテストしてみた。
一般公開用サーバーなら推奨ポートを利用すべきだが、個人で使うサーバーであればセキュリティを少しでも上げるために普段使わない微妙なポートを使うというのは私の経験上の判断(推奨ポートを利用すべきセキュリティ的な理由が他にあったら申し訳ない)
実行中のインスタンスをクリック
先程のプラグラムを起動しているインスタンスのIPv4パブリックIP
をメモしておく
少し右にスクロールするとセキュリティグループという項目があるのでクリック
遷移した画面でセキュリティグループID
をクリック
画面下部のインバウンドルール
に開放したいポートを設定
ポート範囲
を先程の9999
に変更
ソースを0.0.0.0/0
に設定しルールを保存
※このソースは全てのIPからアクセスできる設定なので注意しておく
正常に保存されれば上部に次のようなダイアログが出ている
先程のIPv4パブリックIP
で保存した値を利用してブラウザに次のURLを入力する
先程のIPv4パブリックIP:9999
何の問題もなく先程稼働した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
をリクエストしているからだと思われる。
先程IPのフィルタを設定しなかったので直ぐにctrl+c
でサーバーを終了しておく。
またインバウンドルールで追加したポートも消去する。
セキュリティ維持のため使用しない期間は確実に閉じておこう。
インバウンドルールのソースに指定したIPを自分のプロバイダのみに限定することによりIPをフィルタし安全にする。
公開HTTPサーバーであればフィルタは必要ないが、Cloud9で稼働しているプログラムを操作するような窓口に使う場合は考慮する必要がある。
自分のIPを調べて255.255.255.255
だった場合、ソースに255.255.0.0/16
で保存
/16はサブネットマスクと呼ばれるものでIPの範囲を指定している。つまり0.0
になっている箇所が0~255までどの数字を入れてもマッチするということ。
これで(たぶん)自分が使っているプロバイダ以外の接続は弾けるはずだ。100%セキュアではないがかなりのフィルタになる。
念の為ケータイ端末の回線から接続できないことを確認する。(自宅のwi-fi
から切断することを忘れずに)
ヨシ!
長めの記事になったが実装は非常に簡単だった。
今後はこの方法を利用して外部から自分だけが接続できるプログラムを作ってみたい。
もう一度言うがセキュリティには十分注意して不要なポートは閉じておこう。