Spring BootのプロジェクトをAWSで公開するまで

## 目的
この記事では以下2点を目的にしている
* Spring Boot 開発環境の構築
* 自作したwebサービスをAWS上で公開


## Spring Bootを使う開発環境の構築

この章でやることは3つ
* Javaのinstall
* Spring Bootの雛形ダウンロード
* 実際の動作確認

### Javaのinstall
Spring Bootを開発する上で必要なのことはJavaをinstallすることだけでOK

今回はsdkmanを使用する。
sdkmanの導入は[こちら](https://sdkman.io/install)から

1. installできるjavaのリストを見る
 `$ sdk list java`

1. listの中から好きなバージョンを選んでインストールする(11.0.17-amzn をinstallする場合)
`$ sdk install java 11.0.17-amzn`

1. バージョンを確認する
`$ java -version`
11.0.17-amzn　 の場合 下記のように出ればOK
```
openjdk version "11.0.17" 2022-10-18 LTS
OpenJDK Runtime Environment Corretto-11.0.17.8.1 (build 11.0.17+8-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.17.8.1 (build 11.0.17+8-LTS, mixed mode)
```

### Spring Boot の雛形の生成
[Spring inirializr](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/539325fe-5db1-a99d-dbac-2d61fe1b0356.png)
)を使用する
1. 下記の画像の様に設定する(Dependenciesは後々自分でも追加できる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2827597/0a670a35-83e8-456d-907d-e02fa653ba6e.png)

1. zipファイルを解凍するば雛形は完成
1. 公開時の確認のためにサンプルコードを作成する
`./demo/src/main/java/com/example/demo` に`HelloWorld.java`を置く
``` java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("sample")
public class HelloWorld {
    
    @GetMapping
    public String greet(){
        return "Hello World";
    }
}
```

### 実際に起動してみる
1. プロジェクトのルートディレクトリで下記を実行
`$ ./gradlew bootrun`
画像のような画面が出る
![スクリーンショット 2022-11-14 14.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/69e1e31d-94fb-b6fd-e90a-db217d3d3fcf.png)
2. `http://localhost:8080/sample` にアクセスする
画像の様になっていればこの章はOK!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/4d57fd57-81bc-2c76-7327-9876554f0568.png)


## AWSの設定（入力内容は画像の様に行う）
この章でやることは大きく言えば2つ
* GUIによるAWSの設定
* CLIによるEC2の環境構築

### GUIによるAWSの設定
1. 画像の様にVPCを作成する
「東京」になっているか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/11493ea7-4e70-d04a-2173-6207a72b2aaa.png)
1. パブリックサブネットを作成する
VPC IDには1で作成したものを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/345d1c71-98b3-bd9c-c138-6a6d69ea8f5a.png)
1. インターネットゲートウェイの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/9326fa51-6ea2-3771-2fe1-4a2625389e09.png)
1. VPCにアタッチする
使用可能なVPCが複数あるときは1で作成したものと同じIDのものを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/f1527308-e55e-0430-0012-b929c669a9a3.png)
1. ルートテーブルを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/33b1d0bf-4dc3-17ce-dd4e-3a7c3edf8e9c.png)
1. サブネットの関連付けを編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/3362e0a0-c21e-f60c-5bde-67f85f26dee0.png)
1. ルートを編集する
ターゲットは3で作成したインターネットゲートウェイを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/9066daec-3df1-bc9c-5c58-f72f4ba1c191.png)
1. EC2を起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/16028336-3391-29dd-c8b0-da92de2d8b5e.png)
キーペアは候補がなければ横の新しいキーペアから作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/f3973d3d-f145-d23d-c431-62dd6df062c9.png)
VPC、サブネットはそれぞれこの章で作成したものを選択する
![スクリーンショッっと.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2827597/fc11790d-9173-d257-866a-bdd0aa9d9e69.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/805b15ba-1096-764e-d096-30292f47aa91.png)
1. セキュリティグループを設定する
EC2→セキュリティ→セキュリティグループ→インバウンドルール
![スクリーンショット 2022-11-14 13.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/19df5fd8-365b-8528-f42b-6fc07a5aee5a.png)


### CLIによるEC2の環境構築
ここからはさAWSのサイトを離れてターミナルで操作を行います。
目的は1つ
* Javaのinstall

1. sshで接続する
`$ ssh -i {秘密鍵へのパス} ec2-user@{前で作成したEC2のパブリックIP}`

4. javaのインストール
`$ sudo yum install java-17-amazon-corretto.x86_64`
聞かれる質問は`yes`でOK

5. バージョンの設定
`sudo alternatives --config java`
聞かれる質問はエンターでOK

## Spring Bootのプロジェクトを公開する

目的は１つ
* サーバーに公開して誰でもアクセスできる様にする

1. Spring Bootのプロジェクtを.jarにする
プロジェクトのルートディレクトリで下記実行する
`$ ./gradlew bootjar `

1. jarファイルをサーバーにアップロード
`$ scp -i {秘密鍵へのパス} {jarファイルへのパス} ec2-user@@{前で作成したEC2のパブリックIP}:~`

1. jarファイルを実行する
`$ java -jar　{jarファイルまでのパス}`

1. http://{グローバルIP}:8080/sample へアクセス
画像のようなら終了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2967294/d0d0a0b8-5c50-66ff-c3a8-c5013ac8ba1c.png)

## 参考資料

Amazon Web Services 基礎からのネットワーク＆サーバー構築　改訂3版
大澤 文孝  (著), 玉川 憲 (著), 片山 暁雄 (著), 今井 雄太 (著) 
日経BP (2020/2/6)

[[Linux] AmazonLinuxに、最新のJavaをインストールする](https://www.yoheim.net/blog.php?q=20180101)