【Java】EC2でHello Worldするまで

## はじめに
今回は、AWS EC2上にJavaをインストールし、Hello Worldしてみました。
備忘録として、記録します。
## 環境
・Windows 11
・エディタはVScodeを使用
## 前提
・AWSのアカウントを持っていること
・IAMユーザーを一つ作成してあること
*AWSのベストプラクティス的にルートユーザーで作業することは推奨されていないため。

IAMユーザーの作り方は以下を参照
https://qiita.com/kzykmyzw/items/ca0c3276dfebb401f7d8
## 今回やること
EC2上にJarファイルをデプロイし、アクセスできる。

## Step1 セキュリティグループの作成
まず、はじめに任意のIAMユーザーでコンソールにログインし、EC2を開きます。
そして、右下にあるセキュリティ・グループを押して、右上にあるセキュリティグループを作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/bbbb9e92-32fa-bbf0-3878-cc8f1bd773c0.png)
別途VPCを作成してもいいですが、インバウンド以外は基本デフォルトでいいです。
IGWを作成したりするのが面倒だったので、今回はデフォルトのVPCを使っています。

インバウンドについてですが、すべてのIPアドレスからのアクセスを許可するために0.0.0.0/0にしておきます。(ソースからAnywhere-IPv4を選択するとできます)
カスタムTCPのポートは8080にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/c9b93ad1-173f-11eb-b677-73e10256bc1d.png)

## Step2 EC2インスタンスの作成
コンソールからEC2を開き、インスタンスの起動を選択してEC2インスタンスを作成する。
specは以下の通り
・AMI:Amazon Linux 2023 AMI 2023.3.20240219.0 x86_64 HVM kernel-6.1
・インスタンスタイプ:t2.micro

キーペアを作成し、セキュリティグループはStep1で作成したものを適用する。
*キーペアはSSH接続する際に使用するので、適切に管理してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/50ea586e-820f-df2b-2176-83a946c98181.png)

# Step3 Javaアプリケーション＆jarファイル作成
vscodeで「ctrl+shift+p」でコマンドパレットを起動し、create java Projectを選択。
ビルドツールはGradleを選択します。
verは各々都合のいいものを選択してください。
今回、Javaアプリケーションを作成することは目的ではないので、割愛します。
Spring Bootを使い以下のようなコントローラーを作成し、「index.html」でHello Worldを表示します。
        

```java:Mycontroller.java
package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {
    @GetMapping("/")
	public String index(Model model){
		model.addAttribute("message","Hello World!");
		return "index";
	}
}

```

```html:index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Spring Boot with Thymeleaf</title>
</head>
<body>
    <h1 th:text="${message}"></h1>
</body>
</html>

```
もし、Gradleをインストールしていない場合はインストールが必要です。
私は、以下のブログを参考にさせていただきました。
https://tokuty.hatenablog.com/entry/2021/03/14/Java_Vscode%E3%81%A7SpringBoot%E3%82%92jar%E3%81%AB%E3%81%99%E3%82%8B
プロジェクトのディレクトリで、ビルドしてjarファイルを作成。
```
gradle build
```
プロジェクトディレクトリにjarファイルがあることを確認できたらStep3は終了。

# Step4 EC2にSSH接続する。
ssh接続にはTeraTarmを使用。
TeraTarmのインストール方法は以下を参考にさせていただきました。
https://eng-entrance.com/teraterm-install
ホストには、EC2インスタンスのパブリック IPv4 DNSを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/5cab7656-1253-d066-e907-91ee4f25b394.png)
ユーザー名は「ec2-user」、パスフレーズは空白のまま。
秘密鍵として先ほど作成したEC2インスタンスのキーペア(.pem)にして、OKを選択。
以上で、EC2へのssh接続は完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/2f7b0799-be1c-84a7-145e-1599d4854308.png)

# Step5 java,Tomcatのインストール
EC2へのSSH接続が完了したので、実際にEC2にJava,Tomcatを入れて動かしてみようと思います。
まず、Javaをダウンロードします。
今回はOpenJDK17をインストールします。
https://jdk.java.net/archive/
```
wget https://download.java.net/java/GA/jdk17/0d483333a00540d886896bac774ff48b/35/GPL/openjdk-17_linux-x64_bin.tar.gz
```
ダウンロードしたgzipを展開します。
```
tar xvf openjdk-17_linux-x64_bin.tar.gz
```
展開したjdkを移動させます。
```
sudo mv jdk-17 /opt/
```
これだけだとJavaは使えないので、pathを通します。
etc/profle.dにシェルスクリプトとしてコマンドを入れておくと、ログイン時に読み込んでくれます。
*teeコマンドは標準入力した内容を指定したファイル(今回の場合、etc/profle.d/jdk.sh)に出力してくれます。
```
sudo tee /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=/opt/jdk-17
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
```
先ほど出力したシェルスクリプトを実行して、環境変数を設定します。
```
source /etc/profile.d/jdk.sh
```
javaがインストールされているか確認します。
```
java --version
```
インストールされていることを確認できたら、次はTomcatをインストールします。
Tomcatのダウンロードリンクは変わるかもしれないので、各自以下のサイトから確認してからcurlコマンドを打つことをおすすめします。
Coreのtar.gzのリンクを確認してください。
https://tomcat.apache.org/download-90.cgi
```
curl -O https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.86/bin/apache-tomcat-9.0.86.tar.gz
```
ダウンロードしたgzipを展開する。
```
tar xvf apache-tomcat-9.0.86.tar.gz
```
/opt/tomcat-9に移動させる。
```
sudo mv ~/apache-tomcat-9.0.86.tar.gz /opt/tomcat-9
```
ここまで来たら後はjarファイルを置いて、起動させるだけです！
# Step6 jarファイルの配置＆Hello World
EC2に接続してある状態でTeraTarmにStep3で作成したjarファイルをドロップ＆ドラックします。すると、以下のように送信先が聞かれるのでそのままOKを押してください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/f5375e5e-ae8b-ecde-8f63-220b97233fa2.png)
jarファイルがホームディレクトリにダウンロードされていることを確認します。
```
$ ls -l
-rw-r--r--. 1 ec2-user ec2-user  21289217 Feb 27 12:06 demo-0.0.1-SNAPSHOT.jar
```
それでは、実際にjarファイルを使ってjavaアプリケーションを起動してみます。
```
java -jar 任意のjarファイル
```
http://[EC2のIPアドレス]:8080にアクセスすると、無事HelloWorldされていることを確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720597/ec4a8985-0675-0167-0de2-aa0c870bceae.png)

# 終わりに
今回はEC2上にjarファイルを配置し、HelloWorldしてみました。
至らない部分やミス等あるかもしれませんが、どなたかの役に立てれば幸いです。
次回は、実際にJavaアプリケーションを作成し、RDS等も使いながらAWS上でアプリケーションを動かしたいと思います！