
CI/CDと無停止デプロイのインフラをNCPを使って構成しました。公式ドキュメントや各種ブログも参考にしましたが、NCP関連の情報がAWSと比べて少ないため、NCPでインフラを構築される方のお役に立てればと思います。
特に、Dockerなしの伝統的なハイパーバイザーベースのインフラを構成したい方の参考になればと思い、NCPのAuto ScalingとLoad Balancer、SourceDeploy、Object Storage CLIをJenkinsで使う方法を構成してみます。
1. VPCの構成#


まず最初に行うべきことはVPCの構成です。
VPCのIPアドレス範囲は任意で172.16.0.0/16に設定しました。

VPCを作成すると自動的にNetwork ACLが作成されます。一種のファイアウォールのような役割を果たし、デフォルトではすべてのトラフィックを許可しているため、特に設定は変更しません。
2. Public Subnetの構成#

次にVPCを細分化してサブネットを作成します。 セキュリティのためPrivateサブネットを構成してもよいですが、利便性のためにまずPublicサブネットを作成します。VPCのIPアドレス範囲172.16.0.0/16を細分化して、サブネットの範囲は172.16.1.0/24に設定しました。
3. サーバーの作成#


いよいよサーバーを作成する番ですが… ここで作成するサーバーは、後でAuto Scaling Groupのためのサーバーイメージを作るために仮のサーバーとして作成します。
サーバーイメージのOSはお好みのものを選択してください。私はここでUbuntu 22.04を選択しました。
VPCとSubnetは先ほど作成したものを選択します。

認証キーを作成してダウンロードします。

ACGを設定するために、ACGを作成します。


私はすでに作成済みのACGがあったため、既存のものを使用しました。
ここで重要なのは、InboundルールとOutboundルールを設定する必要があることです。 ACGのデフォルトポリシーはNetwork ACLと異なり、すべてのトラフィックをブロックします。 そのため、許可するIPアドレス範囲を設定します。 私はPublic Subnetの範囲である172.16.0.0/16と自分のローカルIPアドレスを、InboundとOutbound両方に同じように設定しました。
ACGを作成して選択したら、最終的にサーバーを作成します。

4. デプロイするプロジェクトの準備#
@RestController
public class HealthCheckController {
@GetMapping("/")
public ResponseEntity<String> healthCheck() {
return new ResponseEntity<>("OK", HttpStatus.OK);
}
}ここで注意すること#
Springプロジェクトでは、ロードバランサーのヘルスチェック用のAPIが必ず必要です。私は上記のエンドポイントを別途構成しました。URLとして設定した「/」のアドレスを覚えておき、後でロードバランサーを設定するときに登録する必要があります。

自分のローカルコンピューターでSpringプロジェクトをビルドします。
次にビルドしたファイルを作成したサーバーに転送する必要がありますが… このとき、作成したNCPサーバーの管理者パスワードが必要です。


NCPのサーバーを作成するときにダウンロードされた???.pemファイルを貼り付けます。

では、ファイルを転送してみましょう。

scp ${your_project_path}/${file_name} 管理者名@パブリックIP:仮想サーバーに保存する場所
上記のコマンドを自分の状況に合わせて入力します。仮想サーバーのアドレスは、プロジェクト作成時に設定したパブリックIPアドレスです。
右下に100%が表示されれば正常に転送されており、何も表示されなければ転送に失敗しているので、もう一度確認してみてください。
5. 作成したサーバーに接続#

次に作成したサーバーのパブリックIPアドレスを使ってサーバーに接続します。

ターミナルでssh root@${パブリックIPアドレス}を入力します。

ファイルを確認すると、ローカルPCから転送したプロジェクトファイルがあることを確認できます。

テストを兼ねてプロジェクトファイルを実行してみましたが、Javaがインストールされていないと表示されます。 自分のプロジェクトで設定したJavaをインストールして、テストを兼ねて実行してみます。

Springプロジェクトであればデータベース接続が必要になりますが、この部分は別途設定しないとエラーが出ます..!
追加:SourceDeployを使用するために#
後でSourceDeployを使用するために必ず必要な部分なので、上記のリンクにアクセスしてSourceDeploy用のAgentをインストールします!
6. ロードバランサーの作成#

プロジェクトではhttpを使った通信を行うため、アプリケーションロードバランサーを選択します。

ロードバランサーには既存のPublicサブネットとは別のロードバランサー用サブネットが必要です。サブネット作成ボタンを押して、先ほどと同様にロードバランサー用のサブネットを作成します。

ロードバランサーが処理するHTTPプロトコルのポート番号80を開放します。

次のステップに進むとTarget Groupが必要です。ボタンをクリックしてTarget Groupを作成します。

プロトコルはHttpに設定し、Springプロジェクトは主に8080ポートを使用するので上記のように設定します。

次にヘルスチェックを設定します。 ヘルスチェックもhttpプロトコルを選択し、Springプロジェクトの8080ポートを選択します。 ここでURL Pathにはプロジェクトのヘルスチェック用エンドポイントのアドレスを入力します。

この記事に従ってきた場合、先ほど作成したサーバーが1つ表示されるはずです。 しかし、Auto Scaling GroupにロードバランサーをAttachするので、ここでは選択せずに進んでも構いません。 この部分は後でAuto Scaling Groupを作成して設定します。
6. Auto Scalingを適用してみましょう#
6.1 Launch Configurationの作成#

JavaとプロジェクトファイルがセットアップされたNCPサーバーを選択して「マイサーバーイメージの作成」を行います。

Auto Scalingを使用するには、テンプレートの役割を果たすLaunch Configurationを作成する必要があります。

マイサーバーイメージタブに入り、先ほど作成したサーバーイメージを選択します。

このとき、Springプロジェクトを実行するためのinit Scriptが必要なので、init Scriptを作成します。


nohup java -jar /root/deploy/nutridiary-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /root/deploy/output.log 2>&1 &Springプロジェクトをバックグラウンドで実行するスクリプトを記述します。
Launch Configurationまで作成できたら、次にAuto Scaling Groupを作成します。
6.2 Auto Scaling Groupの作成#

名前を設定し、これまで作成したVPC、Subnet、そして希望するインスタンスの容量を設定します。そしてヘルスチェックの種類にはロードバランサーを選択し、先ほど作成したTarget Groupを選択します。



スケールアウトポリシーや通知はお好みの設定にしてください。私はとりあえず後で設定するとしてすべて選択しました。
7. ロードバランサー Target Groupの接続#

次に作成されたAuto Scaling Groupのインスタンスを、ロードバランサーのTarget Group設定に入って追加します。

しばらくしてヘルスチェックを確認したときに、Target StatusとTarget Responseが上記のように表示されれば接続完了です。

そしてロードバランサーの接続情報のドメインにAPIリクエストを送ると、正常に動作することが確認できます。(パブリックIPアドレスでアクセスしても構いません。)
