AWS の EC2(Amazon Linux 2023) で SpringBoot ビルドして実行

AWS の EC2 の Amazon Linux 2023 に Java インストールして Github から取得した SpringBoot をデプロイして実行した時の備忘録メモ
実施したのは 2024/04/04 時点です

- ざっくり流れ
    1. Github プロジェクト作成
    1. Github トークン取得(privateの時のみ必要)
    1. EC2インスタンス起動
    1. EC2ログイン
    1. Javaインストール
    1. Mavenインストール
    1. Git インストール
    1. Github からプロジェクトをクローン
    1. プロジェクトビルド
    1. SpringBoot 起動
    1. 環境変数の対応
    
- 環境情報
    - EC2 (Amazon Linux 2023)
    - SpringBoot v3.2.3
    - Java v21
    - Windows11
    - Tera Term v5.2
    - Git v2.40.1
    - Maven v3.9.7

# Github プロジェクト作成

SpringBoot のスタータを使って maven で作っておく
それを Github に置けばOK、内容はなんでも大丈夫！
リポジトリを private にするとトークンが必要になる
ミニマムなやつの参考はこちら

https://qiita.com/sueasen/items/68580b9ec42e3470789d

# Github トークン取得(privateの時のみ必要)

EC2 から Github の private なプロジェクトをクローンするときに使う
作った時しかトークン確認できないので注意

1. Githubログインして右上ユーザアイコン - Settings をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/bc30d719-78c3-5135-e927-5aa969ebf51d.png)

1. 左メニューの下までいって Developer setting クリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/06977459-6c42-cc9c-1572-cfd91ac4201a.png)

1. Personal access tokens - Tokens(classic) - Generate new token - Generate new token(classic) をクリック
    ※ 2段階認証の設定してる人はクリック後に認証の画面が入ります 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/2770a8f1-4be6-f5e2-c1d4-7ddad538c282.png)

1. 以下を入力して Genarate token をクリック
    - Note : なんでもOK（なんかしら入力必要）
    - Expiration : 期限を入力（No expiration にすると無期限になる）
    - repo : 必ずチェックする 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/92c704e1-527f-c732-1c4f-eeeb65a415d5.png)

1. トークンが出力されるので必ず保存！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/b5d8c6bb-dd7f-eafc-c270-1f73632246f8.png)

    :::note info
    トークンはここでしか確認できないかも．．．保存忘れずに！

# EC2インスタンス起動

AMI は Amazon Linux 2023にして ssh で接続するのでキーペアとかちゃんと設定する
SpringBoot で使うポート(デフォルトは 8080 )を外部から接続できるようにセキュリティグループを追加
そのほかは自由でOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/1cb90019-e4e7-66f0-ced6-4d60f20534e3.png)

# EC2 ログイン

windows pc でTeraTerm でアクセス
ホストに EC2 の パブリックIP、ユーザ名 `ec2-user`、認証方式を RSA 鍵使うにして秘密鍵に pem ファイルを指定 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/90cc5329-1f0c-5c2b-9942-5060dfeceb8e.png)

- root に変更
    ```terminal
    sudo -i
    ```

# Java インストール

- インストール（v21）
    ```terminal
    sudo yum install java-21-amazon-corretto -y
    ```

- インストール確認(バージョン出力)
    ```terminal
    java -version
    ```
    
- 補足：複数バージョンで切替えたいとき
    Javaの他のバージョンの SpringBoot 使いたいときのため念のため．．．
    他のバージョンの Java をインストールして以下のコマンド実行して選択する感じ
    ```terminal
    sudo alternatives --config java
    ```

# Mavenインストール

- 最新バージョン確認
    https://maven.apache.org/download.cgi

- バージョン設定
    ```terminal
    MAVEN_VERSION=3.9.7
    ```

- ダウンロード
    ```terminal
    wget https://dlcdn.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz
    ```

- ダウンロードしたアーカイブを解凍
    ```terminal
    tar -xvzf apache-maven-$MAVEN_VERSION-bin.tar.gz
    ```

- 解凍したディレクトリを移動
    ```terminal
    sudo mv apache-maven-$MAVEN_VERSION /opt/apache-maven
    ```

- シンボリックリンクを作成
    ```terminal
    sudo ln -s /opt/apache-maven/bin/mvn /usr/bin/mvn
    ```

- 環境変数の設定
    ```terminal
    echo "export M2_HOME=/opt/apache-maven" >> ~/.bashrc
    echo "export PATH=$M2_HOME/bin:$PATH" >> ~/.bashrc
    source ~/.bashrc
    ```

- インストール確認(バージョン出力)
    ```terminal
    mvn --version
    ```

↓↓↓ 昔の手順、バージョンが古くてダメかも．．．

- リポジトリパッケージバージョン指定(7を指定)
    ```terminal
    sudo sed -i s/\$releasever/7/g /etc/yum.repos.d/epel-apache-maven.repo
    ```

- インストール
    ```terminal
    sudo yum install apache-maven -y
    ```

- インストール確認(バージョン出力)
    ```terminal
    mvn --version
    ```

# Git インストール

- インストール
    ```terminal
    sudo yum install git -y
    ```

- インストール確認(バージョン出力)
    ```terminal
    git --version
    ```

# Github からプロジェクトをクローン

クローンしたいディレクトリがある人はコマンドを実行する前に移動しておく
Github のプロジェクトが private の時はトークンが必要になる

- Github のプロジェクトが public のとき
    ```terminal
    git clone https://github.com/sueasen/springboot-demo2.git
    ```

- Github のプロジェクトが private のとき

    - Githubから取得したトークンを環境変数に設定
        ```terminal
        export GITHUB_TOKEN=githubから取得したトークン
        ```
    
    - Githubからクローン
        ```terminal
        git clone https://$GITHUB_TOKEN@github.com/ユーザー名/リポジトリ名.git
        ```

# プロジェクトビルド

- プロジェクトディレクトリに移動
    ```terminal
    cd リポジトリ名
    ```

- ビルド実行
    このコマンドだとテスト、スキップ実行（テスト実行するときは clean package だけでOK）
    ```terminal
    mvn clean package -Dmaven.test.skip=true
    ```

- 作成した jar 確認
    ```terminal
    ls -l target/*.jar
    ```
# SpringBoot 起動

```terminal
java -jar target/ビルドで作られたjarファイル名
```

:::note info
実行時にプロファイルを設定するときの参考
- コマンドライン引数
java -jar target/ビルドで作られたjarファイル名 --spring.profiles.active=プロファイル
- システムプロパティ
java -jar -Dspring.profiles.active=プロファイル target/ビルドで作られたjarファイル名
:::

# アクセス確認

外からつながるようにしてたらアクセスできるはず．．．

http://パブリックIP:ポート番号/URLパス

# 環境変数の対応

AWS上で起動するときは開発環境とは違う設定を使いたいときが多いので環境変数の対応を簡易に．．．
Spring のプロファイル機能で application.propeties(.yaml) を切替える感じです

1. AWS上で使う `application-プロファイル.properties(.yaml)` を作成
    ※ 作り方はなんでもOKなのでここでは簡易な例として記載    
    - プロジェクトのディレクトリに移動
        ```terminal
        cd リポジトリ名
        ```
    - application.properties を複製して application-prod.properties を作成
        ※ 上の例だと `prod` がプロファイルになる
        ```terminal
        cp src/main/resources/application.properties src/main/resources/application-prod.properties
        ```
    - AWS上の環境で使いたい設定に合わせて変更・追加
        ```terminal
        vi src/main/resources/application-prod.properties
        ```
        
1. ビルド実行
    ```terminal
    mvn clean package -Dmaven.test.skip=true
    ```

1. プロファイルを指定して SpringBoot 起動
    ※ 実行時の引数に `--spring.profiles.active=プロファイル` を追加
    ```terminal
    java -jar target/ビルドで作られたjarファイル名 --spring.profiles.active=prod
    ```