初めに
本編を通して学んだことをメモ書きしています!
本編は以下から!
前回の記事を通してEclipse、Tomcat、Apacheを活用して手軽にクラウド運用を始める方法を学びました。この記事では作業に取り組む中で学んだことを振り返ります!
パッケージのインストールに関して
yum(Yellowdog Updater Modified)
インターネット上のソフトウェアの集積所(リポジトリ)からパッケージを入手してインストールしたり、最新の更新を適用したり、不要なものをアンインストールすることができる。裏ではPRM(Redhat Package Manager)が動いているが、大きな違いとしてはパッケージの依存関係を自動的に解決してくれる。
パッケージをインストールする際のコマンドとして多様されていたが、意味がわからなかった。
Headless/HeadFull/develとは
Headとはビュー(見た目)のこと。headlessでは見た目を決めるテーマやCSSは持たず、内容を管理するバックエンドの機能だけを持つ。
develはdeveloperの意味で、開発が必要な場合はこちらをインストールする。openjdk は openjdk-devel に含まれている。
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系のコンピューターを起動するときに様々なプログラムを動かす元のプログラムのこと。3点の特徴がある。
- ユニットという単位
systemdはunitという単位でシステムを管理している。ユニットはユニットファイルというファイルで設定され、用途ごとにまとめられる。 - システム管理の統一
systemdを使うと、システムの管理を統一した方法で行うことができる。systemd以前に使われていたsysVintでは、ディストリビューションごとで、サービスの管理方法が統一されていなかった。systemdであればログ出力の管理もまとめて対応できる。 - 起動速度
systemdはsysVintに比べてシステムの起動が非常に早い。systemdは処理を同時に実行できる。
systemctlの使い方
systemctl start [アプリケーション名].service
systemctl status [アプリケーション名].service
systemctl stop [アプリケーション名].service
systemctl enable [アプリケーション名].service
AWSの場合、EC2インスタンスが起動した際に自動でアプリケーションが起動するようになる。
Tomcatに関して
専用ユーザー'tomcat'の準備をする
TomcatやApacheのような公開サービスのプロセスは攻撃者の標的になるケースがよくある。公開サービスが乗っ取られたときに不用意に権限を与えて情報を漏らさぬように専用ユーザーを用意して起動することがセキュリティ上望ましいと言える。
useradd -s /sbin/nologin tomcat
「-s」はユーザーのログインシェルを指定するオプションである、/sbin/nologinシェルを指定すればホームディレクトリが作成されず、またログインもできない。そのため、このユーザーが乗っ取られたとしても権限の変更ができない。
参考にした文献でなぜかログインできない専用ユーザーを用意しており、その意義が理解できなかった。
tomcatを/optに配置する
/optとはoptionの略。Linux等で、パッケージマネージャーを用いてプログラムをインストールする場所となるディレクトリ。
ルートディレクトリ直下にあるディレクトリ群についても徐々に詳しくなっていきたい。
シンボリックの作成
パッケージマネージャーを利用せずにインストールした場合、将来手動でTomcatのバージョンを変更する際も設定に影響が少なくなるようにシンボリックリンクを作成する。
ln -s /opt/apache-tomcat-9.0.10 /opt/apache-tomcat
lnの由来はリンク(LiNk)を作成することから。
$ ln -nfs [変更後のディレクトリのパス] /opt/apache-tomcat
シンボリックリンクとハードリンクの違い
Linuxではファイルシステム上のファイルやディレクトリのデータとその名前を結びつけるリンクがあり、ハードリンクとシンボリックリンクの2種類がある。どちらも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からEC2へのアクセスができなかったときに、EC2からlocalhostへの接続はできるか確認するために使用した。
おわりに
これらの内容を自ら調べて実装していくことで、初心者ながらもJavaアプリのAWSデプロイ手法について基本的な知識を習得できました。
初心者の方に有益な情報が提供ができたら幸いです!