はじめに
EC2を使いこなしたいが、LinuxやApache、Larabelの知識に自信がないので、実際にどのように使うのかを確認しながら、学びたいという人向けにコンテンツを整理してみました。私自身、久しぶりに内容を整理してみた所、正規表現の使い方やLinuxの基礎を学びなおす事が出来て、勉強になりました。Linuxの使い方にも熟練しており、EC2を使いこなせているという自信をお持ちの方は、読み流してやってくださいませ。
目次
- EC2の用途
-
EC2インスタンスを起動する際に、自動的に実行されるユーザーデータを設定する方法
ユーザーデータスクリプト - EC2にApacheをインストールする手順
- Linuxコマンド OS、ネットワーク
- Linuxコマンド ファイル操作
- Linuxコマンド 定番
- viエディタ
- ファイル表示
- Linuxの一般的なディレクトリ構造
- Laravel
- Laravelを使うための事前準備
- LaravelアプリケーションをEC2インスタンスにデプロイする
- Laravelの.envファイルの設定例
- LaravelのストレージにS3を使用する場合
EC2の用途
用途 | 説明 |
---|---|
Webサーバー | EC2上にWebサーバーを構築することができます。ApacheやNginxなどのWebサーバーソフトウェアをインストールし、WebサイトやWebアプリケーションをホストすることができます。 |
データベースサーバー | EC2上にデータベースサーバーを構築することができます。MySQLやPostgreSQLなどのデータベースソフトウェアをインストールし、データベースをホストすることができます。 |
アプリケーションサーバー | EC2上にアプリケーションサーバーを構築することができます。JavaやRuby、Pythonなどの言語で書かれたアプリケーションを実行するためのサーバーを構築することができます。 |
バッチ処理サーバー | EC2上にバッチ処理サーバーを構築することができます。定期的に実行されるジョブやバッチ処理を実行するためのサーバーを構築することができます。 |
分散処理サーバー | EC2上に分散処理サーバーを構築することができます。HadoopやSparkなどの分散処理フレームワークをインストールし、大規模なデータ処理を行うためのサーバーを構築することができます。 |
VPNサーバー | EC2上にVPNサーバーを構築することができます。OpenVPNなどのVPNソフトウェアをインストールし、安全なリモートアクセスを提供するためのサーバーを構築することができます。 |
EC2インスタンスを起動する際に、自動的に実行されるユーザーデータを設定する方法
ユーザーデータスクリプト
#!/bin/bash
# ホスト名
sudo hostnamectl set-hostname aws-dbserver-1a.localdomain
sed -i 's/localhost/aws-dbserver-1a/g' /etc/hosts
sed -i 's/localhost.localdomain/aws-dbserver-1a/g' /etc/hosts
# タイムゾーン
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
このスクリプトでは、まずホスト名を変更し、次に、sedコマンドを使用して、/etc/hostsファイル内のlocalhostとlocalhost.localdomainを新しいホスト名に置換します。その後、タイムゾーンを変更し、言語設定を変更します。
sedコマンドの使い方 file.txt
というファイルの中で、すべてのold
という文字列をnew
という文字列に置換する例です。
コマンドの実行
sed 's/old/new/g' file.txt
記号 | 説明 |
---|---|
s | 置換コマンドを指定します。 |
old | 置換対象の文字列を指定します。 |
new | 置換後の文字列を指定します。 |
g | グローバル置換を指定します。行内のすべての一致する文字列を置換します。 |
file.txt | 置換を行う対象のファイルを指定します。 |
元のファイル (file.txt
)
This is an old file.
The old file contains old data.
実行結果
This is a new file.
The new file contains new data.
EC2にApacheをインストールする手順
- EC2インスタンスにログインします。
- インスタンスが実行されているOSに合わせて、Apacheをインストールするためのパッケージを選択します。
- Ubuntuの場合:
sudo apt-get update sudo apt-get install apache2
- Amazon Linux 2の場合:
sudo yum update -y sudo yum install httpd -y
- Ubuntuの場合:
- Apacheを起動します。
sudo service apache2 start # Ubuntu sudo service httpd start # Amazon Linux 2
- EC2インスタンスのセキュリティグループで、ポート80(HTTP)へのアクセスを許可します。これにより、外部からEC2インスタンスにアクセスできるようになります。
プロトコル: TCP
ポート範囲: 80
ソース: 0.0.0.0/0(すべてのIPアドレスからのアクセスを許可)
webブラウザで表示されるのは下記フォルダ
/var/www/html
所有者変更
sudo chown -R ec2-user /var/www/html
index.htmlなどを作成し、保存して、ブラウザ上でpublicIPアドレスを入力し、内容が表示されればOKです。
http://IPアドレス
これらの手順を実行することで、EC2インスタンスにApacheをインストールし、Webサーバーを起動することができます。
Linuxコマンド OS、ネットワーク
ifconfig
ネットワークインターフェイスの情報を表示するコマンドです。
IPアドレス、サブネットマスク、MACアドレスなどを表示することができます。
-sオプションをつけると、シンプルな表示に切り替えることができます。
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab
inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0
...
$ ifconfig -s eth0
eth0 192.168.0.100 255.255.255.0 ...
hostname
ホスト名を表示するコマンドです。
$ hostname
myhostname
date
現在の日時を表示、または設定するコマンドです。
$ date
Sun Apr 11 11:22:33 JST 2023
$ sudo date --set "2023-04-11 12:34:56"
netstat
ネットワーク接続の状況を表示するコマンドです。
オプションによってTCP、UDP接続の情報、ルーティングテーブル、ソケットの状況などを表示することができます。
-rオプションをつけるとルーティングテーブルを表示することができます。
$ netstat -a
$ netstat -r
ping
指定したIPアドレスやホスト名に対して、疎通確認を行うコマンドです。
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.256 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.234 ms
...
ssh
セキュアなリモートシェル接続を行うためのコマンドです。
SSHプロトコルを使用して、別のコンピュータにログインすることができます。
接続先のホスト名やIPアドレス、ポート番号を指定することができます。
$ ssh username@hostname
$ ssh -p 2222 username@192.168.0.100
df ディスク使用量・空き容量
df コマンドは、ディスク使用量と空き容量を表示するために使用されます。
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 20480000 2023360 17421120 11% /
/dev/sda2 241856000 40184868 188854132 18% /home
/dev/sda3 20480000 1535956 17841624 8% /var
マウントポイントごとに使用可能な総容量、使用済み容量、空き容量、使用率などが表示されます。
free メモリ空き状況を確認
free コマンドは、現在のメモリの使用状況と空き容量を表示するために使用されます。
$ free
total used free shared buffers cached
Mem: 4047156 1910524 2136632 218240 80392 890064
-/+ buffers/cache: 936068 3111088
Swap: 4194300 35004 4159296
メモリの合計容量、使用済み容量、空き容量、共有メモリ、バッファ、キャッシュ、スワップの情報が表示されます。
top CPU、メモリの使用状況を確認
top - 12:10:58 up 1:09, 1 user, load average: 0.26, 0.24, 0.21
Tasks: 197 total, 1 running, 196 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.3 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15860.0 total, 2314.4 free, 7868.4 used, 5687.1 buff/cache
MiB Swap: 16384.0 total, 16379.4 free, 4.6 used. 6115.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1529 root 20 0 2802604 390892 40524 S 5.0 2.4 1:23.89 gnome-shell
1052 root -51 0 0 0 0 S 0.7 0.0 0:56.50 irq/129-acpi_i
1784 ken 20 0 678676 107744 75704 S 0.7 0.7 0:20.34 gnome-terminal-
1206 root 20 0 381376 75720 38456 S 0.3 0.5 0:02.72 Xorg
1925 ken 20 0 3021400 551588 120716 S 0.3 3.4 0:21.02 firefox
1 root 20 0 168732 10380 7484 S 0.0 0.1 0:03.76 systemd
現在の時刻、システムの稼働時間、タスク数、CPU使用率、メモリ使用量などが表示されます。
その下には、各プロセスのPID、ユーザー名、CPU使用率、メモリ使用量、実行時間などが表示されます。
「ps」コマンドの基本的な使用方法
「ps」コマンドは、現在実行中のプロセスの情報を表示するために使用されます。
プロセスID (PID) を表示することもでき、PID を使用してプロセスを停止することができます。
$ ps
このコマンドは、現在実行中のすべてのプロセスを表示します。
しかし、表示される情報は少なく、実用的ではありません。より詳細な情報を表示するには、オプションを使用します。
よく使うオプションとして、「-a」オプションと「-u」オプションがあります。それぞれ、「a」オプションは、端末操作のプロセス (自分+他ユーザー) を表示し、「u」オプションは、各プロセスの実行ユーザー、CPU、メモリ使用量を表示します。
$ ps -a
$ ps -u
さらに、よく使うコマンドとして、「ps aux | grep xxx」があります。
「aux」オプションは、すべてのプロセスを表示するために使用され、「grep」コマンドは、キーワードに一致するプロセスを検索します。
これにより、プロセスの一覧から必要なプロセスを検索することができます。
$ ps aux | grep httpd
また、一部のプロセスは裏側で動作しているため、ユーザーが意図しない場合でも常に実行されています。
このようなプロセスを「デーモン」と呼びます。これらのプロセスは、「x」オプションを使用して表示することができます。
$ ps ax
最後に、「kill」コマンドを使用してプロセスを停止することができます。
プロセスを停止するには、そのプロセスのPIDを指定して「kill」コマンドを使用します。
$ kill PID
たとえば、プロセス番号が「1234」であるプロセスを停止する場合は、次のように入力します。
$ kill 1234
Linuxコマンド ファイル操作
コマンド | 説明 |
---|---|
ls | ディレクトリ内のファイルやフォルダーの一覧を表示します。 |
cd | カレントディレクトリを変更します。 |
mkdir | 新しいディレクトリを作成します。 |
rm | ファイルやディレクトリを削除します。 |
cp | ファイルやディレクトリをコピーします。 |
mv | ファイルやディレクトリを移動します。 |
touch | 新しいファイルを作成します。 |
cat | ファイルの中身を表示します。 |
chown | ファイルのオーナーを変更します。 |
chmod | ファイルのパーミッションを変更します。 |
Linuxにおけるファイルやディレクトリには、ユーザー、グループ、その他のユーザーのためのアクセス権が設定されています。
これらのアクセス権を変更するためには、chmodというコマンドを使用します。
chmodコマンドを使用すると、ファイルまたはディレクトリのアクセス権を変更できます。
アクセス権は、読み取り、書き込み、実行の3つの属性で構成されます。
これらの属性は、所有者、グループ、その他のユーザーのために個別に設定できます。
属性は、r(読み取り)、w(書き込み)、x(実行)の3つの文字で表されます。
これらの文字は、ファイルまたはディレクトリを所有するユーザー、グループ、その他のユーザーのためにそれぞれ設定されます。
また、rは4、wは2、xは1の数値で表すこともできます。これは、数字で表されるアクセス権の表記法です。
たとえば、rwxr-xr--の場合、所有者に読み取り、書き込み、実行のアクセス権があり、
グループには読み取り、実行のアクセス権があり、その他のユーザーには読み取りのアクセス権があることを意味します。
この場合、所有者は7、グループは5、その他のユーザーは4で表されます。
ファイルまたはディレクトリに対するアクセス権を設定する場合、次のように指定します。
数字で表したアクセス権を使用する場合
chmod 755 filename
記号で表したアクセス権を使用する場合
chmod u+rwx,g+rx,o+r filename
所有者には読み取り、書き込み、実行のアクセス権があり、グループとその他のユーザーには読み取りと実行のアクセス権があります。
Linuxコマンド 定番
コマンド | 説明 |
---|---|
pwd | 現在のディレクトリのパスを表示します。 |
rmdir | 空のディレクトリを削除します。 |
grep | ファイルの中から特定のパターンを検索します。 |
sed | ファイルの中の文字列を置換します。 |
ps | 現在実行中のプロセスを表示します。 |
top | システムのリソース使用状況を監視します。 |
tar | ファイルをアーカイブし、圧縮または解凍します。 |
viエディタ
コマンド | 説明 |
---|---|
ESC | 編集モードからコマンドモードに切り替える |
x | カーソルがある文字を削除する |
/ | 検索する文字列を入力する |
:wq! | 保存して終了する(!をつけることで、強制的に終了する) |
ファイル表示
cat
ファイルの中身を表示
例えば、cat file.txtと入力すると、file.txtの中身がターミナル上に表示されます。
cat file.txt
tail
ファイルの末尾から指定した行数を表示
例えば、tail -n 10 file.txtと入力すると、file.txtの末尾から10行を表示します。
tail -n 10 file.txt
lessまたはmore
ターミナルに出力せずに何かを見たい場合に使用する
例えば、less file.txtまたはmore file.txtと入力すると、file.txtの中身を1行進むにはEnterを、1画面進むにはSpaceを、抜けるにはqを押します。
less file.txt
more file.txt
ファイル上書き
>を使用してファイルを上書き
例えば、echo "Hello World" > file.txtと入力すると、file.txtに"Hello World"が上書きされます。
echo "Hello World" > file.txt
ファイル追記
>>を使用してファイルに追記
例えば、echo "Hello World" >> file.txtと入力すると、file.txtの末尾に"Hello World"が追記されます。
echo "Hello World" >> file.txt
find
指定した条件に一致するファイルを検索する
例えば、find /home/user -name "*.txt"と入力すると、/home/userディレクトリ以下の拡張子が.txtのファイルを検索します。
find /home/user -name "*.txt"
grep
指定した文字列が含まれた行を検索
例えば、grep "Hello" file.txtと入力すると、file.txtの中で"Hello"が含まれた行を表示します。
"Hello"が含まれた行を検索する
grep "Hello" file.txt
This is a line containing the word Hello.
Hello, world!
複数のファイルを検索する
grep "Hello" file1.txt file2.txt file3.txt
file1.txt: This is a line containing the word Hello.
file2.txt: Hello, world!
file3.txt: Hello again!
正規表現を使用して数字のみを含む行を検索する
grep "^[0-9]*$" file.txt
12345
67890
行番号表示
-nオプションを付けることで、各行の行番号を表示
例えば、grep -n "Hello" file.txtと入力すると、file.txtの中で"Hello"が含まれた行とその行番号を表示します。
grep -n "Hello" file.txt
これにより、"Hello"という文字列を含むすべての行が表示され、各行の行番号が表示されます。行番号は、コロンの前に表示されます。
1:Hello, how are you?
3:Hello, nice to meet you.
5:Hello, world!
この場合、"Hello"が含まれる行は1行目、3行目、5行目であり、それぞれの行番号が1、3、5であることがわかります。
Linuxの一般的なディレクトリ構造
ディレクトリ | 説明 |
---|---|
/ | ルートディレクトリ。すべてのディレクトリやファイルの最上位に位置し、システム全体を管理するためのディレクトリ。 |
/bin | 基本的なシステムツールやコマンドを格納するためのディレクトリ。 |
/boot | システム起動に必要なファイルを格納するためのディレクトリ。 |
/dev | デバイスファイルを格納するためのディレクトリ。デバイスファイルとは、コンピュータの周辺機器や装置などを表すファイルです。 |
/etc | システム全体の設定ファイルを格納するためのディレクトリ。 |
/home | ユーザのホームディレクトリを格納するためのディレクトリ。 |
/lib | システムに必要なライブラリファイルを格納するためのディレクトリ。 |
/media | リムーバブルデバイス(USBメモリやCD-ROMなど)をマウントするためのディレクトリ。 |
/mnt | ファイルシステムを一時的にマウントするためのディレクトリ。 |
/opt | サードパーティのアプリケーションを格納するためのディレクトリ。 |
/proc | カーネルやプロセスに関する情報を提供するための仮想ファイルシステム。 |
/root | rootユーザのホームディレクトリを格納するためのディレクトリ。 |
/run | システム起動時に生成されるランタイムデータを格納するためのディレクトリ。 |
/sbin | システム管理用のコマンドやツールを格納するためのディレクトリ。 |
/srv | システム上で提供するサービスのデータを格納するためのディレクトリ。 |
/sys | カーネルが提供するデバイスやシステム情報を提供するための仮想ファイルシステム。 |
/tmp | 一時的なファイルを格納するためのディレクトリ。 |
/usr | システム全体の共有データやアプリケーションを格納するためのディレクトリ。 |
/var | システムのログや一時ファイル、メールなど、可変データを格納するためのディレクトリ。 |
Laravel
Laravelは、PHP開発者にとって非常に人気のあるフレームワークの1つとなっています。また、Laravelは、コミュニティが大きく、多数のオープンソースのパッケージやツールを提供しているため、PHPの機能を利用し、開発者が迅速かつ効率的にアプリケーションを構築できるようにする多くの機能を提供しています。
Laravelの特徴
特徴 | 説明 |
---|---|
MVCアーキテクチャ | Laravelは、MVC(Model-View-Controller)アーキテクチャに基づいて設計されており、アプリケーションの機能を論理的に分離し、開発の効率性を高めます。 |
Artisan CLI | Laravelは、コマンドラインツール「Artisan」を提供しています。Artisanを使用すると、簡単にアプリケーションのタスクを実行できます。 |
Eloquent ORM | Laravelは、Eloquentと呼ばれるORM(Object-Relational Mapping)を提供しています。Eloquentは、データベースのテーブルをオブジェクトとして扱えるようにします。 |
Bladeテンプレートエンジン | Laravelは、Bladeと呼ばれるテンプレートエンジンを提供しています。Bladeを使用すると、テンプレート内でPHPコードを簡単に埋め込むことができます。 |
テストフレームワーク | Laravelは、PHPUnitを使用したテストをサポートしています。Laravelのテストフレームワークを使用すると、アプリケーションの動作を簡単にテストできます。 |
Laravelを使うための事前準備
EC2・VPC・RDS設定: LaravelアプリケーションをホストするためのEC2インスタンスを設定し、データベースをホストするためのRDSインスタンスを作成します。
composer: Laravelは、PHPのパッケージ管理システムであるComposerを使用して依存関係を解決します。
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
Node.js: Laravelは、JavaScriptを使用してフロントエンドの機能を実装します。
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum install -y nodejs
PHP各種モジュール: Laravelは、多くのPHP拡張機能を使用します。
$ sudo yum install -y php-bcmath php-ctype php-fileinfo php-json php-mbstring php-openssl php-pdo php-tokenizer php-xml php-zip
Apache設定: Laravelは、Apache Webサーバーを使用して実行されます。
sudo vi /etc/httpd/conf/httpd.conf
<Directory /var/www/html>
AllowOverride All
</Directory>
sudo systemctl restart httpd
LaravelアプリケーションをEC2インスタンスにデプロイする
権限付与:
chmod -R 777 storage
chmod -R 777 bootstrap/cache
Composerを使用したライブラリのインストール:
composer update
Node.jsを使用したフロントエンドのビルド:
npm i && npm run prod
.envファイルの作成:
cp .env.example .env
アプリケーションキーの生成:
php artisan key:generate
Laravelの.envファイルの設定例
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
php artisan config:clear
php artisan migrate:fresh --seed
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
LaravelのストレージにS3を使用する場合
AWS SDK for PHPとleague/flysystem-aws-s3-v3のインストール
composer require league/flysystem-aws-s3-v3
.envファイルの設定
AWS_ACCESS_KEY_ID= // IAMロール設定なら空白でok
AWS_SECRET_ACCESS_KEY= // IAMロール設定なら空白でok
AWS_DEFAULT_REGION=ap-northeast-1 // 東京リージョン
AWS_BUCKET=[バケット名]
ファイルをアップロードするコード
$file = $request->file('file');
Storage::disk('s3')->putFile('/', $file);
ここで、putFile
メソッドの第一引数は、ファイルが保存されるS3上のパスを指定します。上記の例では、ルートディレクトリにファイルが保存されます。第二引数には、アップロードされるファイルを指定します。この例では、リクエストからファイルを取得していますが、アップロードされたファイルのパスを直接指定することもできます。
アプリケーション開発に集中するための方法を模索した
本記事はQmonus Value Streamの投稿キャンペーン記事です。