（学び編）手軽に学ぶ！初心者向けJavaアプリのAWSデプロイ方法。Eclipse、Tomcat、Apacheで始めるクラウド運用

# 初めに
本編を通して学んだことをメモ書きしています！
本編は以下から！

https://qiita.com/shuncask/items/779d8e92cc7af63aaa94

前回の記事を通してEclipse、Tomcat、Apacheを活用して手軽にクラウド運用を始める方法を学びました。この記事では作業に取り組む中で学んだことを振り返ります！

# パッケージのインストールに関して

## yum(Yellowdog Updater Modified)
インターネット上のソフトウェアの集積所(リポジトリ)からパッケージを入手してインストールしたり、最新の更新を適用したり、不要なものをアンインストールすることができる。裏ではPRM(Redhat Package Manager)が動いているが、大きな違いとしてはパッケージの依存関係を自動的に解決してくれる。
パッケージをインストールする際のコマンドとして多様されていたが、意味がわからなかった。

## Headless/HeadFull/develとは
Headとはビュー(見た目)のこと。headlessでは見た目を決めるテーマやCSSは持たず、内容を管理するバックエンドの機能だけを持つ。
develはdeveloperの意味で、開発が必要な場合はこちらをインストールする。openjdk は openjdk-devel に含まれている。
```sh:パッケージのインストール
sudo yum install java-17-amazon-corretto
sudo yum install java-17-amazon-corretto-headless
sudo yum install java-17-amazon-corretto-devel
```
EC2で構築したlinux環境にインストールしようとしたパッケージに、複数のオプションがありつまづいた。



# Apacheに関して
## Apacheとは
著名なWebサーバソフトの一つ。高い性能と優れた動作性から、企業や個人を問わずに人気を博している。正式名称は「Apache HTTP Server」であり、HTTP通信を担うサーバーのスペシャリスト。以前、使用したことがあるTomcatはサーブレットコンテナ(Java Servletを動かすときに必要なソフト)であり、あくまでjavaを扱うスペシャリストである。ただし、Tomcatで作ったJava Servlet の動作確認ができるように簡易的なWebサーバとしての機能も持っていたため、TomcatとApacheの役割分担が混乱してしまった。
## httpdとは
Webサーバとしてお仕事をしているデーモンのこと。だけではわからないので予備知識として「サーバ」「Webサーバ」「デーモン」を踏まえつつ説明する。
サーバとは「サービスや機能を提供する側のコンピュータ」です。「○○サーバ」ときたら「○○関連のサービスを提供しているコンピュータ」と読み替えてもよい。そのためWebサーバとは、「Web関連のサービスを提供しているコンピュータ」である。このWebサーバは実はただのコンピュータとしての箱であり、中身がなければ動かない。箱自体は特別なものである必要はなくWebサーバとして仕事をするためのソフトさえインストールすれば、普段使っているパソコンもWebサーバになることができる。Webサーバとして有名なものにApacheがある。最後にデーモンとは「UNIX系OSにおける常駐プログラムの呼び名」である。デーモンはメモリ上で常に待機しており、タスクが渡されると実行する。常に戦闘体制が求められるプログラムである。
以上を踏まえてWebサーバとしてのお仕事をしているデーモンが「httpd」である。

#  systemdに関して
## systemdとは
LinuxなどのUnix系のコンピューターを起動するときに様々なプログラムを動かす元のプログラムのこと。３点の特徴がある。
- ユニットという単位
systemdはunitという単位でシステムを管理している。ユニットはユニットファイルというファイルで設定され、用途ごとにまとめられる。
- システム管理の統一
systemdを使うと、システムの管理を統一した方法で行うことができる。systemd以前に使われていたsysVintでは、ディストリビューションごとで、サービスの管理方法が統一されていなかった。systemdであればログ出力の管理もまとめて対応できる。
- 起動速度
systemdはsysVintに比べてシステムの起動が非常に早い。systemdは処理を同時に実行できる。
## systemctlの使い方

```sh:アプリケーションの起動
systemctl start [アプリケーション名].service
```
```sh:アプリケーションの状態
systemctl status [アプリケーション名].service
```
```sh:アプリケーションの終了
systemctl stop [アプリケーション名].service
```
```sh:アプリケーションの自動起動設定
systemctl enable [アプリケーション名].service
```
AWSの場合、EC2インスタンスが起動した際に自動でアプリケーションが起動するようになる。

#  Tomcatに関して
## 専用ユーザー'tomcat'の準備をする
TomcatやApacheのような公開サービスのプロセスは攻撃者の標的になるケースがよくある。公開サービスが乗っ取られたときに不用意に権限を与えて情報を漏らさぬように専用ユーザーを用意して起動することがセキュリティ上望ましいと言える。
```sh:ユーザーの追加
useradd -s /sbin/nologin tomcat
```
「-s」はユーザーのログインシェルを指定するオプションである、/sbin/nologinシェルを指定すればホームディレクトリが作成されず、またログインもできない。そのため、このユーザーが乗っ取られたとしても権限の変更ができない。
参考にした文献でなぜかログインできない専用ユーザーを用意しており、その意義が理解できなかった。

## tomcatを/optに配置する
/optとはoptionの略。Linux等で、パッケージマネージャーを用いてプログラムをインストールする場所となるディレクトリ。
ルートディレクトリ直下にあるディレクトリ群についても徐々に詳しくなっていきたい。

## シンボリックの作成
パッケージマネージャーを利用せずにインストールした場合、将来手動でTomcatのバージョンを変更する際も設定に影響が少なくなるようにシンボリックリンクを作成する。
```sh:シンボリックリンクの作成
ln -s /opt/apache-tomcat-9.0.10 /opt/apache-tomcat
```
lnの由来はリンク(LiNk)を作成することから。
```sh:シンボリックリンクのリンク先変更
$ ln -nfs [変更後のディレクトリのパス] /opt/apache-tomcat
```

## シンボリックリンクとハードリンクの違い
Linuxではファイルシステム上のファイルやディレクトリのデータとその名前を結びつけるリンクがあり、ハードリンクとシンボリックリンクの２種類がある。どちらもlnコマンドにより作成することができる。
シンボリックリンクとはWindowsだとショートカット、Macだとエイリアスのことでる。コピーを作成するのではなく、あくまで本体ファイルやディレクトリへのショートカット、エイリアスを作成する。ある場所に配置されたファイルを、あたかも別の場所に存在するかのように扱うことができる。
ハードリンクとは、Linuxだと全てのファイルはinodeと呼ばれるファイルシステムで一意のデータで参照されるが、inodeに対して必ず1つ以上のハードリンクが存在する。ハードリンクは「どちらが本体のファイルか」というわけではなく、異なるファイルが同じデータ実体を参照することになる。

# その他コマンドについて
## ss(socket statics)
インターネットのソケット情報を表示するコマンド。ソケットとは実行中のネットワークプログラム間でデータの送受信を行うための仕組みをいう。
```
[root@centos8 ~]# ss
Netid     State      Recv-Q      Send-Q                             Local Address:Port             Peer Address:Port       
u_str     ESTAB      0           0                                              * 197094                      * 198007     
u_str     ESTAB      0           0                                              * 197087                      * 198001     
```
Netid	プロトコル名（tcp、udp、u_str…）
State	ソケットの状態
Recv-Q	受信しなかったデータのバイト数
Send-Q	送信しなかったデータのバイト数
Local Address:Port	ソケットに紐づくローカルホスト名またはIPアドレス、ポート番号
Peer Address:Port	リモートホストのホスト名またはIPアドレス、ポート番号

今回の場合だとLocal Addressが80と8080のものに対してStateがLISTENになっているか確認した。

## curl
crulコマンドは、様々な通信プロトコルでデータの送受信を行うことができるコマンドである。よく使われる方法としては、Webサイトへのhttpリクエストを送信してコンテンツを表示する、等があります。curlの名前の由来は「{}(curly brackets)」。
ローカルPCからEC２へのアクセスができなかったときに、EC2からlocalhostへの接続はできるか確認するために使用した。


# おわりに
これらの内容を自ら調べて実装していくことで、初心者ながらもJavaアプリのAWSデプロイ手法について基本的な知識を習得できました。
初心者の方に有益な情報が提供ができたら幸いです！