全て無料でクラウドサーバーの立ち上げから、DDNS、SSL証明書まで一気通貫

HTTPSを使ったAPIの実験やJSのテストを行いたいと思ったときにオンプレのサーバでは出来ないことが多くあります。
個人でサーバも持っていますが、普段運用しているサーバを止めたりまっさらにするのも支障があるので、もっとお手軽にグローバルに晒された環境を用意したいということでお手軽に構築してみましょう。1～2時間ほどで構築できます。

### メニュー
1．クラウドサーバーを用意する。無料で。
2．グローバルIPを得る。無料で。
3．DDNSを登録する。無料で。
4．SSL証明書を取る。無料で。
5．動作確認をする。

さぁ、始めましょう。

### 1．クラウドサーバーを用意する
クラウドサービスをチョイスから。
・AWS
・Google Cloud Platform
・Azure
・IBM Cloud
・Oracle Cloud

それぞれでAlways Freeの枠を用意しています。これを利用していきましょう。今回はOracleを選んでみました。普段はAWS使ってますが、無料枠のスペックが高めに設定されているということもあり選んでみました。
Oracle Cloud Engine
・1/8 OCPU**と1 GBメモリをそれぞれ備えた2つのAMDベースのコンピュートVM。
・2つのBlock Volumeストレージ、合計200 GB。
・10 GBのObject Storage。
・10 GBのArchive Storage。
・Resource Manager：マネージドTerraform。
・5つのOCI Bastion。

まずはOracle Cloudのアカウント登録をします。
https://www.oracle.com/jp/cloud/free/ 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/ff266a44-1ad4-9834-8f4c-0eba8b628afa.png)

クレジットカードとSMSが使える携帯番号が必要となります。

Signup(無料で始める)から個人情報を順番に登録していき、クレジットカードの登録まで済ませば完了。カード登録は必要ですが有料サービスを使わなければ請求されることはありません。最初の月は試用期間ですし33000円のクレジットもありますので他に何かしたいときにも使えます。Always Free対象は試用期間が過ぎても無料です。

サービスの登録が完了すれば、ダッシュボードにアクセス出来るようになります。
左上のメニューからコンピュート->インスタンスを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/0c143aff-c71f-1f0f-5d8d-bac46e3a29d8.png)

インスタンスの作成を押して始めます。無料枠対象は「Always Free対象」がついてます。
1．配置 -> そのまま
2．イメージとシェイプ -> 使いたいOSを選択。使い慣れたUbuntuに変更
3．ネットワーキング-> パブリックIPアドレスが有効になってることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/1f0bdd8d-c6f8-038a-7d05-e5e90b540cdb.png)
4．SSHキーの追加 -> キー・ペアを自動で生成から「秘密のキーの保存」「公開キーの保存」をしておいてください。後でSSHでログインするときに必要になります。
5．ブート・ボリューム -> そのまま
一通り確認して「作成」を押すとインスタンスが生成されます。

このままではSSH（＝ポート22）しかアクセス出来ませんので、使いたいサービスに応じてインスタンスのネットワーク設定によりポート開放とLinux側のポート開放を合わせて行っていく必要があります。
まずは、SSHでログインして基本設定をしていきましょう。

### 2．グローバルIPを得る
インスタンスを生成した時点でパブリックIPも取得できています。そのアドレスに接続して設定しましょう。
今回はOSはUbuntuを選んだのでSSHのログインユーザーは「ubuntu」です。接続には先ほどダウンロードした認証キーを使います。
1．コンピュートの概要から設定したいインスタンスのパブリックIPアドレスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/e11fb28b-c702-608e-7282-609fa6c9f5b9.png)

2．SSHでログイン
>ssh -i "ssh-key-日付.key" ubuntu@IPアドレス

3．ロケールやタイムゾーンを合わせておきましょう
>sudo timedatectl set-timezone Asia/Tokyo

4．aptで色々とインストールしたり設定しましょう。Node.jsあたりをいれときます。
5．ポート開放。今回はHTTPSのテストをしたいので443を開けます。
>sudo iptables -I INPUT 4 -p tcp --dport 443 -j ACCEPT

6．iptablesの設定を保存しておきましょう。上記設定だけでは再起動したら忘れちゃいます。

サーバ側の準備は完了です。次はOCI側の設定です。
1．インスタンスの詳細を開いて仮想クラウド・ネットワークを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/bdea1939-41b6-15ea-ff83-a0cd4ba124fb.png)
2．VCNでセキュリティ・リスト選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/e293f36c-04fa-aaea-1d9b-95dbad3d4e96.png)
3．イングレス・ルールの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/d5715004-24d2-4809-8e72-bbed9996cd24.png)
4．443を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139265/0c426566-101e-5992-9bc4-8e02e3a2ec44.png)

SSL証明書の事も考慮して、80も開けておきましょう。

### 3．DDNSを登録する
インスタンスが有効な間はIPは継続できるみたいですが変化があってもいいようにDDNSは毎日更新チェックしておきます。
DNSを設定します。なんでもいいです。今回はno-ipを使ってみました。
登録手順は他に紹介されてるので省きます。
登録ができたらサーバ側の設定です。
1．no-ipの更新スクリプトを作成します。
>vi /usr/local/bin/noip-update

<pre>
#!/bin/sh

USER=アカウント
PASS=パスワード
HOST=登録したホスト名
# 

curl -s "http://$USER:$PASS@dynupdate.no-ip.com/nic/update?hostname=$HOST" > /tmp/noip.html

STAT=`cat /tmp/noip.html | cut -d' ' -f 1`
if [ "$STAT" != "good" ] && [ "$STAT" != "nochg" ]; then
    cat /tmp/noip.html
    cat ""
    cat "see http://www.no-ip.com/integrate/response/"
fi
</pre>
2．cron登録
>crontab -e

以下を追加
>0 3 * * * /usr/local/bin/noip-update

### 4．SSL証明書を取る
Let's Encryptを利用します。
1.Certbotをインストール
>sudo add-apt-repository ppa:certbot/certbot
>sudo apt update
>sudo apt upgrade
>sudo apt install certbot

2．証明書を生成
>sudo certbot certonly --standalone --preferred-challenges dns -d *.登録するホスト名 -d 登録するホスト名

3．/etc/letsencrypt/live/登録したホスト名/ にキーが生成されました。
cert.pem  chain.pem  fullchain.pem  privkey.pem
4．cronに更新スクリプトが登録されている事も確認
>ls /etc/cron.d/certbot

### 5．動作確認
nodejsでここまでの設定ができているか確認したいと思います。
1．まずはポート80の確認。http.js
<pre>
http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(80, () => console.log('Server http://localhost:80'));

</pre>

> node http.js

外部からブラウザでアクセスして見ましょう。Hello Worldとでたら成功です。
http://登録したホスト名/

2.ポート443の確認。https.js
<pre>
var https = require('https');
var fs = require('fs');
var http = require('http');
var express = require('express');
app = express();
var key_dir = '/etc/letsencrypt/live/登録したホスト名/';

app.get('/', function (req, res) {
  var body = 'Hello World';
  res.setHeader('Content-Type', 'text/plain');
  res.setHeader('Content-Length', Buffer.byteLength(body));
  res.end(body);
});


var sslOptions = {
  key: fs.readFileSync(key_dir + 'privkey.pem'),
  cert: fs.readFileSync(key_dir + 'cert.pem'),
  ca: [
          fs.readFileSync(key_dir + 'chain.pem'),
          fs.readFileSync(key_dir + 'fullchain.pem')
  ]
};

https.createServer(sslOptions, app).listen(443);
</pre>

>node https.js

外部からブラウザでアクセスして見ましょう。Hello Worldとでたら成功です。
https://登録したホスト名/

ここまで完了したらSignalingやJSなんでも出来ますね。
一応、IPや証明書の自動更新設定もしてありますが、いらなくなったら、登録したアカウントを削除すればきれいさっぱりです。