マイブログ リスト

2024年8月15日木曜日

SpringBoot+MysqlのWebアプリをAWSに無料デプロイする

    

 おはようございます。

最近、SpringBootでwebアプリを作っていて、いい感じになりました。
というわけで、どこか無料のサーバーを借りて公開したいという気持ちになりまして。
いろいろ調べてみたところ、WebサーバもDBも、まとめてAWSにデプロイできたので、この場を借りて紹介したいと思います。

まずは、今回作ったwebアプリを軽く説明します。

その名は「キメラ召喚バトル」

入力した文字列から、脳内メーカーの要領でキメラを生み出し、戦わせるという内容。
ユーザー情報や、生まれたキメラの情報はDBに保存しています。

バージョン等は下記の通りです。

  • SpringBoot 3.3.2
  • Java 17
  • MySQL 8


次にAWSについて、荒く短く説明します。

AWS(Amazon Web Service)とは?

いろいろなサービスを提供します。
(多すぎて説明できないので、以下に今回使うものだけ解説します)
  • EC2(Elastic Compute Cloud):サーバを借りられるサービス。今回はWebサーバとして利用。
  • RDS(Relational Database Service):DBを借りられるサービス。今回はMySQLにします。
  • Elastic Beanstalk:簡単にデプロイできるサービス。EC2とRDSの連携を自動的にやってくれる。
ちゃんと知ってる人はツッコミたい部分もあると思いますが、今回の用途だと大体こんな感じです。
上記の利用料金ですが、Elastic Beanstalkは無料、EC2とRDSは1年分の無料枠が用意される設定があり、間違えなければ無料でデプロイできます。

(→私は間違えたので料金請求されました。詳しくは後ほど)


目標設定

AWSには設定項目がたくさんありますが、

「無料で簡単にとりあえずデプロイすること」

を目標にやりますので、細かい部分は触れないようにします。

前提条件

SpringBoot+MySQLでアプリを作り、ローカルで動作できていることを前提にします。

事前準備

Spring側の application.propertiesの設定を変更します。

DBを使っている場合、おそらく下記のようになっていると思います。
(Dockerなどでローカルに建てたDBにアクセスしている想定)


    spring.datasource.url=jdbc:mysql://localhost:3306/my_database
    spring.datasource.username=user
    spring.datasource.password=password
   

それを下記のように追記します。


    spring.datasource.url=jdbc:mysql://${RDS_HOSTNAME:localhost}:${RDS_PORT:3306}/${RDS_DB_NAME:my_database}
    spring.datasource.username=${RDS_USERNAME:user}
    spring.datasource.password=${RDS_PASSWORD:password}
   

意味としては、後に設定するRDSの環境変数を確認し、あればそっちの値を参照するというようなものです。
(ローカル動作の場合には、環境変数が存在しないのでコロン以下のこれまでの定数値を参照できます)

この変更を加えたら、Spring側はjarファイルをビルドしておきます。

AWSの準備

まず登録してログインします。(割愛)

次に、訳あって事前にロールの作成を行う必要があります。
理由は後に説明しますので、とりあえず下記の通りに作成しておいてください。

すべてのサービス > セキュリティ、ID、およびコンプライアンス > IAM を選びます。
(画像右下)

その後、左メニューからアクセス管理 > ロールを選択。
ロール画面右上の「ロールを作成」をクリックして、以下の通り入力していきます。
  • 信頼されたエンティティタイプ:AWSのサービス
  • サービスまたはユースケース:EC2 
  • ユースケース:EC2
「次へ」を押すと、大量のポリシーが表示されているので、検索に「beans」と入力して絞り込み、下記の3つを選択して「次へ」を押します。
  • AWSElasticBeanstalkMulticontainerDocker
  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkWorkerTier


ロール名を「aws-elasticbeanstalk-ec2-role」とし、画面下の「ロールを作成」
これでロールの作成はOKです。

ElasticBeanstalk環境作成

すべてのサービス > コンピューティング > Elastic Beanstalkを選びます。

「環境を作成」をクリックすると、合計6ステップの入力画面に移行するので、
下記のように設定していきます。(デフォルトで良いものは記載省いています)



Step1

  • アプリケーション情報
    • 任意のアプリケーション名を入力
  • プラットフォーム
    • プラットフォーム:Java
    • ブランチ:Corretto 17 (javaのバージョンに合わせる)
  • アプリケーションコード
    • コードをアップロードを選択
    • ラベル名:任意のバージョン名を入力
    • ローカルファイルを選択し、Springのjarファイルをアップロード。

Step2

  • サービスアクセス
    • サービスロール:新しいサービスロールを作成して利用
      • 名前は「aws-elasticbeanstalk-service-role」のままでOK
    • EC2インスタンスプロファイル
      • 作成した「aws-elasticbeanstalk-ec2-role」を選択
※以前はEC2のロールも自動作成されていたらしいのですが、セキュリティの都合でそれはできなくなったそうです。だから、自分で作る必要があったんですね。→
参考サイト

Step3

  • データべース
    • データベースを有効化:true
    • インスタンスクラス (要注意ポイント!!
      • 「db.t3.micro」に変更。
    • ユーザー名
      • 任意で入力
    • パスワード
      • 任意で入力

インスタンスクラスのデフォルトが「db.t3.small」になっていますが、これには無料枠がありません。無料で済ませたい場合は「db.t3.micro」に必ず変更してください。

ユーザー名・パスワードは、環境変数を通じてSpring側に共有されるので、好きに決めて問題ありません。

Step4

  • 容量
    • インスタンスタイプ:t3.microを残して、t3.smallを削除
コチラも、無料枠はt3.microにだけ用意されているので、t3.smallは削除しておきます。

Step5

  • プラットフォームソフトウェア
    • 環境プロパティ
      • PORT:8080を追加

spring側のポートは8080がデフォルト、nginxは5000がデフォルトのため、
spring側がデフォルトの場合は、「環境プロパティを追加」を押して、
「名前:PORT、値:8080」を設定します。

Step6

Step6は確認なので、問題なければ「送信」をクリック。

環境の構築と立ち上げに少し時間がかかります。
終わり次第、ドメインと表記されたURLからデプロイされたWebアプリにアクセスできます。

DBのテーブル作成などは、Spring側で「spring.jpa.hibernate.ddl-auto」を設定しておけば、自動作成してくれます。事前にローカルで検証してください。

DBを手動で操作する場合は、EC2のインスタンスに接続し、そこを足掛かりにしてRDSのエンドポイントに接続する形になります。(詳細は省きます)


無料枠の落とし穴

最後に、無料になっているかを確認してみましょう。
Billing and Cost Management にアクセスし、コストサマリー下部の「請求書を表示」をクリック。そこで下にスクロールすることで、サービス別料金が表示され、何に料金が発生しているかを確認できます。
私は、下記の2点で失敗しておりました。

1.インスタンスの選び方
EC2、RDSのインスタンスの初期値がsmallになっているので、microに変える必要がある。
こちらは上記の手順の中で説明したとおりです。

2.パブリックIPv4
これまでの手順でRDSのインスタンスを作った時、デフォルトで「パブリックアクセス可能」の設定になってしまうようです。
パブリックIPv4は、外部からのアクセスするための設定であり、近年有料化(0.005$/hrs)された機能です。EC2の方には無料枠がありますが、RDSは有料でした。
Elastic BeanstalkではデフォルトでONになってしまってしまうようなので、RDSのインスタンスを直接編集して手動でOFFにしてください。



以上です。
今回の手順では、パブリックIPv4の関係で厳密には完全無料ではなく$0.005くらいはかかってしまうかもしれませんが、許してください。私はよく分からないうちに$9.43の請求になってました。

記事を書いてみての感想ですが、他の人が再現できるように手順を構成するのは、なかなか大変でした。
アプリをデプロイするまでに、ここには書かれていない様々なトライ&エラーがあったわけですが、改めてそれを1つ1つ検証して、必要なものとそうでないものに分けていくという過程を経ることで、AWSへの理解が倍くらいに深まったと思います。
  • Lv0 なにもできない
  • Lv1 よくわからんけどできた
  • Lv2 どうすればできるか分かった(今ココ!)
という感じです。

最後に、作成した「キメラ召喚バトル」のリンクを貼っておきます。

無料枠は1年しかないので、枠が切れる頃には終了する予定です。

0 件のコメント:

コメントを投稿