Spring BootアプリをAWSで公開!世界への扉を開くデプロイ完全ガイド

みなさん、手元のパソコンでSpring BootのWebアプリケーションは動いていますか?画面に「Hello World」や、自分で作った機能が表示されたときの感動はひとしおですよね。

でも、今のままでは少しもったいない状態です。なぜなら、その素晴らしいアプリは、まだあなたのパソコンの中でしか動いていないからです。世界中の誰かに使ってもらうことも、遠くに住む友達に自慢することもできません。

この第1章では、あなたのアプリをインターネットの大海原へ公開するために必要な知識、サーバーとクラウドについてお話しします。

第1章:なぜAWSを使うの?クラウドの基本

そもそも「サーバー」ってなに?

Webアプリを公開するためには、どうしても必要なものがあります。それがサーバーです。

普段、みなさんが開発に使っているパソコンは、夜寝るときにはシャットダウンしますよね?持ち運ぶためにWi-Fiを切ることもあるでしょう。

しかし、Webサイトやアプリは、24時間365日、いつ誰がアクセスしてくるかわかりません。深夜3時に誰かがあなたのアプリを見たいと思ったとき、パソコンの電源が切れていたら、その人はアプリを見ることができないのです。

そこで登場するのがサーバーです。

サーバーは「コンビニエンスストア」

サーバーとは、簡単に言えば「24時間ずっと電源が入っていて、インターネットに繋がり続けている高性能なコンピューター」のことです。

私たちのパソコンが「個人の家」だとしたら、サーバーは「24時間営業のコンビニ」のようなものです。いつでも開いていて、いつでもお客さん(ユーザー)を迎え入れる準備ができています。

アプリを公開するということは、自分の家(ローカル環境)で作った商品を、コンビニ(サーバー)の棚に並べに行く作業だと思ってください。そうすれば、いつでも誰でも商品を手に取ることができますよね。

昔は大変だった「オンプレミス」の時代

では、そのサーバーをどうやって用意すればいいのでしょうか。

一昔前までは、サーバーを用意するのはとても大変でした。会社や自宅に高価なサーバー用の機械を買ってきて、設置し、停電しないように電源工事をして、熱暴走しないように冷房をガンガンに効かせた部屋を用意する必要がありました。

これを専門用語でオンプレミスと呼びます。

オンプレミスは「マイホームを建てる」こと

オンプレミスは、自分たちで土地を買い、家を建てることに似ています。

自分好みに自由に設計できるのは素晴らしいですが、とにかくお金と時間がかかります。「明日からアプリを公開したい!」と思っても、家が建つまで何ヶ月も待たなければなりません。しかも、もしアプリが人気になってお客さんが増えたら、増築工事もしなければなりません。これは新人エンジニアにとって、あまりにもハードルが高いですよね。

救世主「クラウド」の登場

そんなハードルを一気に下げてくれたのが、クラウド(クラウドコンピューティング)です。そして、その代表格が今回使うAWS(Amazon Web Services)です。

クラウドとは、インターネット経由で、必要な時に必要な分だけ、コンピューターの機能や保存場所を借りることができるサービスのことを指します。

クラウドは「ホテルに宿泊する」こと

オンプレミスが「マイホーム」なら、クラウドは「ホテル」や「賃貸マンション」です。

ホテルなら、建物や電気、水道の管理はすべてホテル側がやってくれますよね。私たちはフロントでチェックイン(契約)するだけで、すぐに快適な部屋を使えます。

しかも、クラウドのすごいところは柔軟性です。 「今日は一人だからシングルルーム(低スペックなサーバー)」 「明日はパーティをするからスイートルーム(高スペックなサーバー)」 「もう使わないからチェックアウト(解約)」

このように、状況に合わせて部屋の大きさを変えたり、使った分だけ料金を支払ったりできるのです。これがクラウドを使う最大のメリットです。

なぜAWSを選ぶのか?

クラウドサービスには、AWS以外にもGoogleのGCPやMicrosoftのAzureなどがありますが、なぜ今回はAWSを使うのでしょうか。

それは、世界で一番使われているからです。

利用者が多いということは、それだけ困ったときの情報がインターネット上にたくさんあるということです。「設定方法がわからない」「エラーが出た」というときに、検索すればすぐに答えが見つかる。これは学習中の皆さんにとって、非常に心強い味方になります。

この章のまとめ

ここまでの内容を整理しましょう。

  • 自分のパソコンだけでは、世界中の人にアプリを使ってもらえません。
  • 24時間動き続ける「サーバー」というコンピューターが必要です。
  • 自分でサーバーを買う(オンプレミス)のは大変ですが、借りる(クラウド)なら簡単です。
  • AWSは、インターネット経由で手軽にサーバーを借りられる「巨大なホテル」のようなサービスです。

どうでしょう。なんとなく「AWS」や「サーバー」のイメージが湧いてきましたか?

「難しそう」と思っていたものが、「あ、なんだか借りるだけならできそう!」と思えてきたなら、この章の目標は達成です。

次回の第2章では、実際にAWSの画面を操作して、あなた専用のサーバー(EC2)を借りてみましょう。いよいよエンジニアらしい作業が始まりますよ!

準備はいいですか?それでは、次のステップへ進みましょう。

第2章:自分専用のサーバー「EC2」を借りよう

前回は、サーバーとは「24時間営業のコンビニ」であり、クラウド(AWS)を使えばそれを「ホテル」のように手軽に借りられる、というお話をしました。

第2章となる今回は、いよいよAWSという巨大なホテルの中で、あなた専用の部屋(サーバー)を契約する手順に入っていきます。

AWSには数え切れないほどのサービスがありますが、今回使うのはEC2(イーシーツー)というサービスです。

「EC2?なんだかロボットの名前みたい...」と思いましたか?大丈夫です。この章を読み終わる頃には、EC2が可愛らしく思えてくるはずですよ!

AWSの主役「EC2」とは?

まずは、この聞き慣れない名前の意味から解き明かしていきましょう。

EC2は「Amazon Elastic Compute Cloud(アマゾン・エラスティック・コンピュート・クラウド)」の略です。「C」が2つあるので「C2」と呼ばれています。

名前は難しいですが、その正体はシンプルです。AWS上に作ることができる仮想サーバーのことです。

「仮想サーバー」ってどういうこと?

「仮想」と聞くと、実体のない幽霊のようなものを想像するかもしれません。

実は、AWSのデータセンターには超巨大なコンピューターが何台も置いてあります。その巨大なコンピューターのパワーを、ソフトウェアの力で細かく切り分けて、「あたかも独立した1台のパソコン」のように見せかけて貸し出してくれるのが仮想サーバーです。

(例えるなら...) 巨大なホール(物理サーバー)を、パーティションで区切って、一人ひとりの作業スペース(EC2インスタンス)を作ってくれるようなイメージです。隣の人の作業は見えませんし、自分だけの空間として自由に使えます。

AWSの世界では、この借りたサーバー1台1台のことをインスタンスと呼びます。これからの作業では「インスタンスを立てる(=サーバーを作る)」という言葉をよく使うので、ぜひ覚えておいてくださいね。

EC2を作るための3つの重要な選択

さて、実際にAWSの管理画面(マネジメントコンソールと言います)からEC2インスタンスを作ろうとすると、いくつかの質問をされます。

初めてだと「どれを選べばいいの!?」とパニックになるポイントが3つあります。ここでは、そのポイントに絞って解説します。

1. 土台を選ぶ「AMI(エーエムアイ)」

最初に「どのOSにしますか?」と聞かれます。これをAWSではAMI(Amazon Machine Image)と呼びます。

WindowsやMacという名前は聞いたことがあると思いますが、Webサーバーの世界ではLinux(リナックス)というOSを使うのが一般的です。

AMIは「パソコンの初期設定テンプレート」のようなものです。 「Amazon Linux 2023」や「Ubuntu」などが選べますが、最初はAWSが公式に用意している「Amazon Linux」を選ぶのが無難で安心です。

2. 広さを選ぶ「インスタンスタイプ」

次に「どのくらいの性能にしますか?」と聞かれます。これがインスタンスタイプです。

CPUの速さやメモリの量によって、値段が変わります。

  • 高性能なタイプ:計算が速いが、料金が高い(スイートルーム)
  • 低性能なタイプ:計算はそこそこだが、料金が安い(カプセルホテル)

新人エンジニアの皆さんが練習で使うなら、t2.microt3.micro というタイプを選びましょう。これらは「無料利用枠」の対象になっていることが多く、最初の1年間は一定時間まで無料で使えたりします(※AWSのアカウント作成時期によりますので、必ず画面の「無料利用枠の対象」という表示を確認してくださいね!)。

3. 命の次に大事な「キーペア」

最後に、ここが一番重要です!「キーペア(鍵)」を作成するか聞かれます。

EC2インスタンスは、インターネット上にポツンと置かれた金庫のようなものです。誰でも触れる場所にありますが、頑丈な鍵がかかっています。その鍵を開けるための唯一の道具が、このキーペアファイル(通常 .pem という拡張子がつきます)です。

これだけは絶対に約束してください。 ダウンロードしたキーペアは、絶対に削除したり、どこに保存したか忘れたりしないでください。

この鍵を無くすと、あなたが作ったサーバーという部屋には二度と入れなくなります。AWSのサポートセンターに泣きついても、鍵は開けてもらえません。それくらい強力なセキュリティなのです。

「黒い画面」への招待状

EC2インスタンスを作成して起動すると、あなたの手元にはLinuxというOSが入ったサーバーが用意されます。

しかし、このサーバーには、Windowsのようなマウスで操作できるデスクトップ画面はありません。操作はすべて、文字だけで命令を送る「コマンドライン(CUI)」で行います。映画でハッカーがカタカタとタイピングしている、あの黒い画面です。

「うわっ、難しそう...」と引いてしまいましたか?

でも、安心してください。Spring Bootアプリを動かすために必要なコマンドは決まっています。一つずつ意味を理解しながら入力していけば、決して怖くありません。むしろ、マウスを使わずにコンピューターを操る感覚は、エンジニアとしてのレベルアップを実感できる瞬間でもあります!

この章のまとめ

さあ、これでサーバーを借りる準備の知識は整いました。

  • EC2は、AWSで借りられる自分専用の仮想サーバー(インスタンス)。
  • AMIでOS(基本はLinux)を選び、インスタンスタイプで性能(最初はt2.microなど)を選ぶ。
  • キーペアはサーバーに入るための唯一の鍵。絶対に無くさないこと!
  • 操作は文字だけの画面(CUI)で行うが、怖がる必要はない。

さて、部屋(サーバー)は確保しました。鍵(キーペア)も手元にあります。 ですが、今の部屋はまだ家具が何もない空っぽの状態です。ここに、あなたが一生懸命作ったSpring Bootアプリケーションを運び込まなければなりません。

しかし、開発に使っていたたくさんのファイルを、そのまま一つずつ運ぶのは大変ですよね?

そこで次回の第3章では、アプリを「持ち運びやすい形」にまとめる魔法、「ビルド」について解説します。あなたのアプリをスーツケースに詰め込む作業です。

第3章:アプリを「持ち運べる形」にする(ビルド)

前回、私たちはAWSという広大なホテルの中に、自分専用の部屋(EC2サーバー)を契約しました。でも、今のその部屋は、家具も荷物もない「空っぽ」の状態です。

ここに、あなたが手塩にかけて育てたSpring Bootアプリケーションを連れて行かなければなりません。

「じゃあ、開発に使っているフォルダを全部コピーして、サーバーに貼り付ければいいの?」

そう思った方、ちょっと待ってください!実は、その方法はあまりおすすめできません。なぜなら、開発中のファイル(ソースコード)は、バラバラの部品のようなものだからです。

今回は、それらの部品を「どこでも動く実行ファイル」に変換する作業、ビルドについて解説します。

ソースコードは「設計図」、欲しいのは「完成品」

皆さんが普段書いている .java というファイル。これらは、あくまでプログラムの設計図にすぎません。

人間には読めますが、コンピューターはこのままでは理解できず、実行することができません。コンピューターが理解できる言葉(機械語)に翻訳し、必要な部品をすべてかき集めてパッケージングする必要があります。

この一連の作業をビルドと呼びます。

ビルドは「料理」に似ている

開発作業を「料理」に例えてみましょう。

  • ソースコード:レシピや、カットされた野菜、生のお肉(バラバラの材料)
  • ビルド:材料を鍋に入れて煮込み、お弁当箱に詰める作業
  • ビルド後のファイル:完成したお弁当

サーバーという外出先で、いちいち野菜を切って肉を焼くのは大変ですよね?自宅(ローカル環境)でしっかり調理して、お弁当(ビルド後のファイル)にして持っていけば、向こうでは蓋を開けるだけですぐに食べられます。

Javaの最強の武器「JARファイル」

Spring Bootでビルドを行うと、JAR(ジャー)ファイルというものが出来上がります。拡張子は .jar です。

これが本当にすごいんです。

通常、アプリケーションを動かすには、たくさんのライブラリ(便利な機能の詰め合わせ)や設定ファイルが必要です。これらを一つでも忘れるとエラーになります。

しかし、Spring Bootで作ったJARファイルは、「実行可能なJAR(Executable JAR)」と呼ばれ、アプリを動かすのに必要なもの(プログラム本体、ライブラリ、さらにはWebサーバー機能まで!)が、すべてその一つのファイルの中に詰め込まれています。

JARファイルは「魔法のスーツケース」

旅行に行くときのスーツケースを想像してください。 着替え、洗面用具、ガイドブック、そして現地で暮らすためのテントまで、すべてが一つのケースに入っています。

このスーツケース(JARファイル)さえあれば、Javaがインストールされているコンピューターなら、世界中のどこでも同じようにアプリを動かすことができます。Macで作ったJARを、Linuxのサーバーに持って行っても、そのまま動くのです。

これを専門用語で「ポータビリティ(移植性)が高い」と言います。これがJavaが世界中で愛されている大きな理由の一つです。

実際にビルドしてみよう!

では、手元のパソコンでビルドを行ってみましょう。黒い画面(ターミナルやコマンドプロンプト)を開いて、プロジェクトの場所に移動してください。

使うツールによってコマンドが少し違いますが、Spring Bootなら大抵 Gradle(グレイドル)Maven(メイブン) のどちらかを使っているはずです。

Gradleを使っている場合

プロジェクトの中に gradlew というファイルがある場合は、以下のコマンドを打ち込みます。

./gradlew build

(Windowsのコマンドプロンプトの場合は gradlew build

Mavenを使っている場合

プロジェクトの中に mvnw というファイルがある場合は、こちらです。

./mvnw package

コマンドを実行すると...

画面にたくさんの文字が流れ始めます。これは、コンピューターが一生懸命、材料を刻んだり炒めたり(コンパイルやテスト)している様子です。

最後に「BUILD SUCCESS」という文字が表示されれば成功です!

できたお弁当(JAR)はどこ?

ビルドが成功すると、プロジェクトフォルダの中に新しいフォルダが作られ、その中にJARファイルが生成されています。

  • Gradleの場合: build/libs/ フォルダの中
  • Mavenの場合: target/ フォルダの中

my-app-0.0.1-SNAPSHOT.jar のような名前のファイルは見つかりましたか? おめでとうございます!これが、あなたのアプリの完成品です。

このファイル一つさえあれば、もう難しいソースコードを見る必要はありません。これをAWSのサーバーにコピーするだけで、アプリが動くのです。

この章のまとめ

  • ソースコードのままサーバーに持っていくのは大変。
  • ビルドをして、実行可能な形に変換する。
  • Spring Bootのビルド成果物はJARファイルと呼ばれる。
  • JARファイルは、必要なものが全て詰まった「魔法のスーツケース」。
  • Javaが入っていれば、どのコンピューターでもこのJARファイル一つで動く。

さて、スーツケース(JARファイル)の準備は完了しました。部屋(EC2)も契約済みです。

「よし、すぐにサーバーに送ろう!」と言いたいところですが、ちょっと待ってください。

今のままでは、あなたが借りたサーバーは、外部からのアクセスを一切受け付けない「要塞」のような状態になっています。せっかくアプリを起動しても、誰もアクセスできません。

そこで次回の第4章では、サーバーのセキュリティ設定、「セキュリティグループ」についてお話しします。要塞に適切な「扉」を作る作業です。」

第4章:サーバーのセキュリティ設定(セキュリティグループ)

前回は、アプリを「JARファイル」という持ち運びやすい形にまとめる方法(ビルド)を学びましたね。これで、いつでもサーバーにアプリを配置できる状態になりました。

しかし、ここで一つ問題があります。

私たちが借りたEC2という部屋(サーバー)は、セキュリティのために「窓も扉もすべてコンクリートで埋められた要塞」のような状態になっているのです。このままでは、あなた自身もサーバーの中に入れませんし、世界中のお客さんがあなたのWebアプリを見に来ることもできません。

第4章となる今回は、この要塞に適切な「出入り口」を作るための機能、セキュリティグループについて解説します。

地味ですが、ここを間違えると「アプリが動かない!」と数時間悩むことになる超重要ポイントです。しっかり押さえておきましょう。

セキュリティグループは「マンションのオートロック」

AWSのセキュリティグループを一言で表すと、「サーバーを守る門番(ファイアウォール)」です。

マンションのオートロックや、オフィスビルの受付をイメージしてください。そこには警備員さんが立っていて、事前に許可されたリストに載っている人だけを通します。

AWSのサーバーも同じです。「誰を通して、誰を通さないか」というルール(リスト)を決めないと、警備員さんは「怪しいやつだ!」と判断して、すべてのアクセスを遮断してしまいます。

このルール設定のことを、AWSではインバウンドルール(受信許可設定)と呼びます。

開けるべき「2つの扉」

Webアプリを公開するために、最低限開けなければならない扉(ポートと呼びます)が2つあります。それぞれ役割が違うので、例え話を交えて説明しますね。

1. 管理人用通用口(SSH / ポート22)

まずは、サーバーの管理者である「あなた自身」が入るための扉です。

第2章で「キーペア(鍵)」の話をしたのを覚えていますか?あの鍵を使ってサーバーに接続し、コマンド操作を行うための通り道が、このSSH(エスエスエイチ)という扉です。

この扉が開いていないと、あなたはサーバーにJARファイルを置くことも、Javaをインストールすることもできません。

【設定のコツ】 この扉は、管理人のあなた以外には絶対に使わせてはいけません。泥棒に入られてしまいます。 そのため、AWSの設定画面では「ソース(接続元)」を「マイIP(自分の家のIPアドレス)」だけに制限するのが鉄則です。「誰でもOK」にしてはいけませんよ!

2. お客用メインエントランス(HTTP / ポート80 または 8080)

次は、Webアプリを見に来てくれる「お客さん(ユーザー)」のための扉です。

通常、Webサイトを見るときの通信(HTTP)はポート80番を使いますが、Spring Bootのアプリは、標準設定だとポート8080番で待ち受けるようになっています。

ですので、今回は「8080番の扉に来た人は通していいよ」というルールを追加します。

【設定のコツ】 こちらは世界中の人に見てもらいたいので、「ソース(接続元)」は「Anywhere(0.0.0.0/0)」に設定します。これで、地球上のどこからでもアクセスできるようになります。

「ポート」ってなに?

さらっと「ポート22番」や「8080番」という言葉を使いましたが、これは「窓口の番号」のようなものだと思ってください。

サーバーという建物には、0番から65535番まで、たくさんの窓口があります。

  • 22番窓口:管理者専用(SSH)
  • 80番窓口:Webサイト閲覧用(HTTP)
  • 443番窓口:セキュリティ付きWebサイト閲覧用(HTTPS)
  • 8080番窓口:開発用Webサーバー(Spring Bootなど)

警備員さん(セキュリティグループ)に対して、「22番窓口と8080番窓口だけ開けておいて!あとは全部閉めておいて!」と指示を出すのが、今回の作業になります。

実際の設定画面ではどうする?

EC2を作成するとき、または作成した後でも、セキュリティグループの設定画面で「インバウンドルールの編集」を行うことができます。

具体的には、以下のような2つのルールを追加することになります。

ルール1(あなた用)

  • タイプ: SSH
  • ポート範囲: 22
  • ソース: マイIP(自分のIPアドレス)

ルール2(アプリ公開用)

  • タイプ: カスタムTCP
  • ポート範囲: 8080
  • ソース: Anywhere-IPv4(0.0.0.0/0)

これで、「あなたは管理操作ができ」「世界中の人はアプリを見られる」という完璧な状態になります!

この章のまとめ

  • セキュリティグループは、サーバーを守る「門番」。
  • 最初はすべてのアクセスが拒否されている。
  • ポート22(SSH)を開放して、自分がサーバーに入れるようにする(自分限定)。
  • ポート8080を開放して、Spring Bootアプリにお客さんがアクセスできるようにする(全員OK)。
  • 必要な扉だけを開けることが、セキュリティの基本。

さあ、これで準備万端です!

  1. サーバー(EC2)を借りた(第2章)
  2. 荷物(JARファイル)を作った(第3章)
  3. 通り道(セキュリティグループ)を確保した(第4章)

あとは、データベースを用意する必要があります。

【第5章】データの金庫を用意する!PostgreSQLの導入と設定

こんにちは。ゆうせいです。

ここまで、サーバーを借りて、アプリの荷造りをし、セキュリティの扉を開けてきました。

「よーし、いよいよアプリ起動だ!」と行きたいところですが、ちょっと待ってください。あなたのSpring Bootアプリは、データベース(PostgreSQL)と連携するように作られていますよね?

今のEC2サーバーは、まだ空っぽの部屋です。アプリが使うための「データ保存場所」が用意されていません。このままアプリを起動しても、「保存場所がない!」とエラーになって止まってしまいます。

今回は、このEC2サーバーの中にPostgreSQLをインストールして、アプリがデータを書き込める状態に準備を整えましょう。

データベースは「巨大な冷蔵庫」

Webアプリケーションを料理人に例えるなら、データベースは食材を保管する「巨大な冷蔵庫」です。

料理人(アプリ)がどんなに優秀でも、冷蔵庫(データベース)がなければ、食材を取り出すことも、作った料理を保存しておくこともできません。

今回は、AWSのRDSという専用のサービスを使わず、借りているEC2サーバーの中に冷蔵庫を設置する方法(ローカルインストール)を紹介します。これが一番シンプルで、お財布にも優しい方法です。

手順1:PostgreSQLをインストールする

まずは、サーバーにPostgreSQLというソフトウェアを入れましょう。

第2章で作った鍵を使って、ターミナルからサーバー(EC2)にログインした状態で作業を進めます。

以下のコマンドを入力してください。

sudo dnf install postgresql15-server postgresql15 -y

画面に「Complete!」と出たら、冷蔵庫の搬入は完了です。

次に、この冷蔵庫を使える状態(初期化)にします。一度だけ必要な作業です。

sudo postgresql-setup --initdb

最後に、サーバーの電源を入れたら自動的に冷蔵庫も動くように設定し、スイッチをオンにします。

sudo systemctl enable postgresql
sudo systemctl start postgresql

これで、サーバーの中でPostgreSQLが動き出しました!

手順2:アプリ専用の「利用者」と「箱」を作る

PostgreSQLはセキュリティがしっかりしているので、誰でも勝手にデータを見られるわけではありません。あなたのアプリ専用の「ユーザー(利用者)」と「データベース(データの箱)」を作ってあげる必要があります。

ここからは少し手順が細かいですが、頑張ってついてきてくださいね。

まず、PostgreSQLの管理者になりすまします。

sudo su - postgres

プロンプト(左側の文字)が変わったことに気づきましたか?これで今、あなたはデータベース管理者です。

次に、SQLを操るためのモードに入ります。

psql

ここからは、皆さんが勉強したSQLの世界です。

以下のコマンドを1行ずつ入力して、アプリの設定に合わせてユーザーとデータベースを作ります。

ここでは例として、以下の設定で作ってみます。

  • ユーザー名: dbuser
  • パスワード: dbpass
  • データベース名: mydb

(※注意!:ここは必ず、あなたのSpring Bootアプリの application.properties に書いた設定と同じにしてくださいね!)

CREATE DATABASE mydb;
CREATE USER dbuser WITH PASSWORD 'dbpass';
GRANT ALL PRIVILEGES ON DATABASE mydb TO dbuser;

(※PostgreSQL 15以降では、さらにスキーマ権限の付与が必要な場合がありますが、まずは基本設定で進めます)

設定が終わったら、 \q と入力してSQLモードを抜け、 exit と入力して管理者をやめ、元の ec2-user に戻ります。

\q
exit

手順3:セキュリティ設定を少し緩める(重要!)

実は、インストールした直後のPostgreSQLは非常に用心深く、パスワードを使った接続すら拒否することがあります。

そこで、設定ファイルを少し書き換えて、「パスワードを知っている人なら通していいよ」というルールに変更します。

vi というエディタを使ってファイルを編集します。少し操作が難しいので、慎重に入力してください。

sudo vi /var/lib/pgsql/data/pg_hba.conf

ファイルが開いたら、以下の記述を探します(たいてい一番下にあります)。

host    all             all             127.0.0.1/32            ident

この最後の ident という部分を、 md5 または scram-sha-256 に書き換えます。

(キーボードの i を押すと入力モードになります。書き換えたら Esc キーを押し、 :wq と入力してEnterを押すと保存して終了します)

書き換えたら、設定を反映させるためにPostgreSQLを再起動します。

sudo systemctl restart postgresql

Spring Boot側の設定はどうする?

ここで一つ、嬉しいお知らせがあります。

今回は、アプリとデータベースが「同じサーバー(EC2)の中」に同居しています。

ですので、Spring Bootの設定ファイル(application.properties)にある接続先アドレスは、開発のときと同じ localhost のままで大丈夫なのです!

spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=dbuser
spring.datasource.password=dbpass

「AWSだから特別なアドレスにしなきゃ...」と悩む必要はありません。自分自身(localhost)の中にあるデータベースを見に行くだけだからです。

この章のまとめ

  • アプリを動かす前に、データ保存場所(PostgreSQL)の準備が必要。
  • EC2の中にインストールすることで、手軽に環境が作れる。
  • dnf コマンドでインストールし、 systemctl で起動する。
  • ユーザー名パスワードデータベース名は、必ずSpring Bootの設定と合わせる。
  • 同じサーバー内なら、接続先は localhost のままでOK。

さあ、冷蔵庫(データベース)が設置され、中にはあなた専用のボックスも用意されました。

これで、アプリがいつ動き出しても、データの保存場所に困ることはありません。

次回の第6章(最終回)では、いよいよこの環境の上でSpring Bootアプリケーションを起動します。全てのピースが揃う瞬間です。あと一息、頑張りましょう!

第6章:アプリを起動して世界へ公開!

長い旅も、いよいよクライマックスです。

サーバーという部屋を借り、荷物(JARファイル)をまとめ、セキュリティという門番に話を通しました。準備はすべて整っています。

この第5章では、実際にあなたの手でサーバーを動かし、Spring Bootアプリケーションをインターネットの世界へ公開します。

黒い画面(ターミナル)での操作が続きますが、一つひとつのコマンドにはちゃんと意味があります。呪文のように丸暗記するのではなく、「今、コンピューターに何をお願いしているのか」をイメージしながら進めていきましょう。

さあ、世界への扉を開ける時です!

手順1:荷物をサーバーへ送ろう

まずは、手元のパソコンにある「お弁当(JARファイル)」を、遠くにあるサーバーへ届けなければなりません。

これには scp(エスシーピー)というコマンドを使います。これは「Secure Copy(安全なコピー)」の略で、インターネット越しにファイルを安全に転送するための運び屋です。

ターミナル(WindowsならPowerShellなど)を開き、JARファイルがある場所で以下のコマンドを入力します。少し長いですが、落ち着いて入力してくださいね。

scp -i "キーペアの場所" "JARファイルの場所" ec2-user@"サーバーのIPアドレス":~/

このコマンドは、以下のような意味を持っています。

  • 「-i キーペア」:この鍵を使ってドアを開けてね
  • 「JARファイル」:この荷物を運んでね
  • 「ec2-user@IPアドレス」:この住所(サーバー)に住んでいる ec2-user さん宛てだよ
  • 「:~/」:荷物は玄関(ホームディレクトリ)に置いておいてね

実行して何もエラーが出なければ、転送成功です。目には見えませんが、あなたのアプリは今、クラウド上のサーバーに到着しました。

手順2:サーバーの中に乗り込もう

荷物は届きました。次は、あなた自身がサーバーの中に入って作業をします。

第2章で作成した「鍵」を使って、サーバーにログインしましょう。これには ssh(エスエスエイチ)というコマンドを使います。

ssh -i "キーペアの場所" ec2-user@"サーバーのIPアドレス"

コマンドを実行した後、もし「Are you sure...」と聞かれたら、「yes」と入力してEnterキーを押してください。

すると、ターミナルの左側の表示が変わるはずです。 (例:[ec2-user@ip-10-0-0-1 ~]$ など)

これが、あなたが今「サーバーの中にいる」という証拠です。ここから先に入力するコマンドは、あなたのパソコンではなく、AWS上のサーバーで実行されます。遠隔操作の始まりです!

手順3:家具(Java)を配置しよう

サーバーに入りましたが、第2章でお話しした通り、ここはまだ「空っぽの部屋」です。アプリを動かすための土台である「Java」がインストールされていません。

まずは、Javaをインストールしましょう。AWSのAmazon Linuxを使っている場合、以下のコマンドで最新のJavaをインストールできます。(※Spring Boot 3系を使う場合は、Java 17以上が必要です)

sudo dnf install java-17-amazon-corretto -y

「sudo(スドゥ)」というのは、「管理者として実行してね」という意味です。家具を搬入するような大きな作業なので、管理者権限が必要なんですね。

最後に、正しくインストールされたか確認してみましょう。

java -version

画面にJavaのバージョン情報が表示されれば、家具の配置は完了です。

手順4:スイッチオン!アプリ起動

いよいよ、この瞬間がやってきました。

サーバーに転送しておいたJARファイルを、Javaを使って起動します。以下のコマンドを入力し、Enterキーを「ターン!」と押してください。

java -jar my-app-0.0.1-SNAPSHOT.jar

(※ファイル名はあなたが作ったものに合わせて変えてくださいね)

すると、見慣れたSpring Bootの起動ログが画面に流れ始めます。そして最後に、あの一文が表示されるはずです。

「Started Application in ... seconds」

おめでとうございます!あなたのアプリは今、サーバー上で産声を上げました。

感動の動作確認

まだターミナルの画面はそのままにして(閉じるとアプリも止まってしまいます)、ブラウザを開いてください。

アドレスバーに、以下のように入力してみましょう。

http://サーバーのIPアドレス:8080

Enterキーを押したその瞬間、画面には何が映っていますか? あなたが作った「Hello World」や、ログイン画面が表示されているでしょうか。

もし表示されていたら、ぜひスマホのWi-Fiを切って、4G/5G回線からもアクセスしてみてください。遠く離れた友達にURLを送って、見てもらうのもいいでしょう。

「自分のパソコン以外から、自分の作ったアプリが見える」

この感動こそが、Webエンジニアの醍醐味であり、サーバーサイド開発の面白さの原点です。

最後に:課金への対策(超重要!)

感動に浸っているところ申し訳ないのですが、最後にとても現実的で大事な話をします。

AWSは従量課金制です。サーバー(EC2)は、起動している時間ずっと料金が発生します。「誰もアクセスしていないから無料」ではありません。「起動しているか、していないか」が全てです。

学習用であれば、使い終わったら必ずサーバーを「停止(Stop)」してください。 AWSの管理画面から、インスタンスを選んで「インスタンスの状態」→「インスタンスを停止」をクリックします。

「終了(Terminate)」を選ぶと、サーバーそのものが削除されて二度と復元できなくなるので注意してくださいね(もう使わないなら削除でもOKです)。

今後の学習の指針

全5回にわたる「Spring Bootアプリ AWS公開ガイド」、いかがでしたか?

最初は「サーバー?クラウド?」とちんぷんかんぷんだった言葉も、実際に手を動かした今なら、その意味が肌感覚で理解できているはずです。

ここから先、さらにステップアップするために、次のようなキーワードを調べてみることをおすすめします。

  • バックグラウンド実行:今のままだと黒い画面を閉じるとアプリも止まってしまいます。「nohup」コマンドや「Systemd」を使って、裏側でずっと動かし続ける方法を学びましょう。
  • データベース(RDS):今回は解説しませんでしたが、本格的なアプリにはデータの保存場所が必要です。AWSのデータベースサービス「RDS」について調べてみましょう。
  • ドメイン設定:数字だけのIPアドレスではなく、「myapp.com」のようなかっこいい名前でアクセスできるようにする方法です。

Webアプリケーションの世界は広大で、学ぶことは尽きません。でも、今日あなたは「世界にアプリを公開する」という大きな一歩を踏み出しました。その経験は、必ずあなたのエンジニア人生の強力な武器になります。

これからも、好奇心を羅針盤にして、技術の海を冒険していってください。

【付録】困ったときのQ&Aと、知っておきたいLinuxコマンド集

本編の全5回、本当にお疲れ様でした。サーバーを立ててアプリを公開するなんて、エンジニアへの大きな一歩を踏み出しましたね。

でも、いざ自分でやってみると「あれ?動かないぞ?」となったり、「黒い画面の操作が怖い」と感じたりすることもあるでしょう。

この付録では、初心者がつまずきやすいポイントの解決策(トラブルシューティング)と、これだけは覚えておきたい便利なコマンドをまとめました。

ブックマークして、困ったときのお守りにしてくださいね。

Q&A:困ったときのトラブルシューティング

Q. ブラウザでアクセスしても画面が表示されません!

A. 「門番(セキュリティグループ)」と「住所(IPアドレス)」を確認しましょう。

これが一番多いトラブルです。以下のポイントをチェックしてみてください。

  1. セキュリティグループの設定 第4章で設定した「カスタムTCP / ポート8080 / ソース 0.0.0.0/0」というルールは正しく保存されていますか?これが消えていると、門番がお客さんを追い返してしまいます。
  2. https ではなく http ブラウザのアドレスバーを見てください。「https://」になっていませんか?今回はまだ証明書の設定をしていないので、「http://」でアクセスする必要があります。
  3. IPアドレスの変更 EC2インスタンスは、一度停止して再起動すると、IPアドレスが変わってしまいます。昨日アクセスできたURLでも、今日サーバーを再起動したら繋がらなくなります。AWSの画面で、新しい「パブリック IPv4 アドレス」を確認しましょう。

Q. SSH(黒い画面)に接続できません!

A. 「鍵の場所」と「ユーザー名」が合っているか確認しましょう。

「Permission denied」や「Timed out」といって怒られる場合は、以下を疑ってみてください。

  1. 鍵(キーペア)の指定 コマンドで指定している .pem ファイルのパス(場所)は正しいですか? コマンドを打つときに、鍵ファイルをドラッグ&ドロップして、正しいパスを入力させるのが確実です。
  2. ユーザー名 Amazon Linuxを使っている場合、ユーザー名は ec2-user です。 rootadmin ではありません。

Q. 黒い画面を閉じたら、アプリも止まってしまいました...

A. それは正常な動作です。「nohup」を使いましょう。

第5章で紹介した java -jar ... というコマンドは、黒い画面(セッション)が開いている間だけ動くものです。画面を閉じると、サーバーへの接続が切れ、アプリも終了してしまいます。

画面を閉じても動かし続けたい場合は、以下のようにコマンドを変えてみてください。

nohup java -jar my-app-0.0.1-SNAPSHOT.jar &

先頭に nohup を、最後に & を付けるのがポイントです。これで「バックグラウンド(裏側)」で動き続けるようになります。

はじめてのLinuxコマンド帳

サーバー(Linux)を操作するための、最低限これだけあれば生きていける!というコマンドを紹介します。

ls(エルエス):何があるか見る

「list」の略です。今いるフォルダにどんなファイルがあるかを表示します。 「あれ、JARファイルどこだっけ?」と思ったら、とりあえずこれを打ちましょう。

ls

cd(シーディー):移動する

「change directory」の略です。フォルダの中に入ったり出たりします。

cd フォルダ名

一つ上のフォルダに戻りたいときは、こう打ちます。

cd ..

pwd(ピーダブリューディー):今どこにいるか確認する

「print working directory」の略です。 迷子になったらこれを打ちます。自分がサーバーのどの階層にいるかを教えてくれます。

pwd

rm(アールエム):削除する

「remove」の略です。ファイルを消します。 注意! Windowsのゴミ箱と違って、一度消すと二度と戻ってきません。使うときは慎重に。

rm いらないファイル名

最後に:お財布を守るために

最後にもう一度だけ、大事なことを言わせてください。

AWSのEC2は、「起動している時間」に対して課金されます。

勉強が終わって、もう誰もアクセスしないなら、必ずAWSの管理画面からインスタンスを「停止」してください。(終了を選ぶとデータごと消えるので注意!)

「停止」しておけば、サーバー代はかかりません(※保存容量に対するわずかな料金はかかりますが、微々たるものです)。

「使い終わったら電気を消す」 これさえ守れば、AWSは怖くありません。便利な道具として、あなたのエンジニアライフを支えてくれるはずです。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。